* S30JBF Example Program Text * Mark 22 Release. NAG Copyright 2007. * .. Parameters .. INTEGER NIN, NOUT PARAMETER (NIN=5,NOUT=6) INTEGER LDP, MMAX, NMAX PARAMETER (LDP=10,MMAX=10,NMAX=10) * .. Local Scalars .. DOUBLE PRECISION JVOL, LAMBDA, R, S, SIGMA INTEGER I, IFAIL, J, M, N CHARACTER PUT * .. Local Arrays .. DOUBLE PRECISION CHARM(LDP,NMAX), COLOUR(LDP,NMAX), + DELTA(LDP,NMAX), GAMMA(LDP,NMAX), P(LDP,NMAX), + RHO(LDP,NMAX), SPEED(LDP,NMAX), T(NMAX), + THETA(LDP,NMAX), VANNA(LDP,NMAX), VEGA(LDP,NMAX), + VOMMA(LDP,NMAX), X(MMAX), ZOMMA(LDP,NMAX) * .. External Subroutines .. EXTERNAL S30JBF * .. Executable Statements .. WRITE (NOUT,*) 'S30JBF Example Program Results' WRITE (NOUT,*) WRITE (NOUT,*) 'Merton Jump-Diffusion Model' * Skip heading in data file READ (NIN,*) * Read problem parameters. READ (NIN,*) PUT READ (NIN,*) LAMBDA READ (NIN,*) S, SIGMA, R, JVOL READ (NIN,*) M, N * IF (M.LE.MMAX .AND. N.LE.NMAX) THEN * Read array of strike/exercise prices, X READ (NIN,*) (X(I),I=1,M) * Read array of times to expiry READ (NIN,*) (T(I),I=1,N) * IFAIL = 1 * CALL S30JBF(PUT,M,N,X,S,T,SIGMA,R,LAMBDA,JVOL,P,LDP,DELTA, + GAMMA,VEGA,THETA,RHO,VANNA,CHARM,SPEED,COLOUR, + ZOMMA,VOMMA,IFAIL) * IF (IFAIL.EQ.0) THEN IF (PUT.EQ.'C' .OR. PUT.EQ.'c') THEN WRITE (NOUT,*) 'European Call :' ELSE IF (PUT.EQ.'P' .OR. PUT.EQ.'p') THEN WRITE (NOUT,*) 'European Put :' END IF * WRITE (NOUT,'(A,1X,F8.4)') ' Spot = ', S WRITE (NOUT,'(A,1X,F8.4)') ' Volatility = ', SIGMA WRITE (NOUT,'(A,1X,F8.4)') ' Rate = ', R WRITE (NOUT,'(A,1X,F8.4)') ' Jumps = ', LAMBDA WRITE (NOUT,'(A,1X,F8.4)') ' Jump vol = ', JVOL * WRITE (NOUT,*) DO 60 J = 1, N WRITE (NOUT,*) WRITE (NOUT,99999) T(J) WRITE (NOUT,*) + ' Strike Price Delta Gamma Vega Theta' + //' Rho' DO 20 I = 1, M WRITE (NOUT,99998) X(I), P(I,J), DELTA(I,J), + GAMMA(I,J), VEGA(I,J), THETA(I,J), RHO(I,J) 20 CONTINUE * WRITE (NOUT,*) + ' Strike Price Vanna Charm Speed Colour Zomma' + //' Vomma' DO 40 I = 1, M WRITE (NOUT,99997) X(I), P(I,J), VANNA(I,J), + CHARM(I,J), SPEED(I,J), COLOUR(I,J), ZOMMA(I,J), + VOMMA(I,J) 40 CONTINUE * 60 CONTINUE ELSE WRITE (NOUT,*) WRITE (NOUT,99996) IFAIL END IF END IF * 99999 FORMAT (1X,'Time to Expiry : ',1X,F8.4) 99998 FORMAT (1X,7(F8.4,1X)) 99997 FORMAT (1X,8(F8.4,1X)) 99996 FORMAT (1X,' ** S30JBF returned with IFAIL = ',I5) END