/* nag_jumpdiff_merton_greeks (s30jbc) Example Program. * * Copyright 2009, Numerical Algorithms Group. * * Mark 9, 2009. */ #include #include #include #include #include int main(void) { /*Integer scalar and array declarations */ Integer exit_status = 0; Integer i, j, m, n; NagError fail; Nag_CallPut putnum; /*Double scalar and array declarations */ double jvol, lambda, r, s, sigma; double *charm = 0, *colour = 0, *delta = 0, *gamma = 0, *p = 0; double *rho = 0, *speed = 0, *t = 0, *theta = 0, *vanna = 0; double *vega = 0, *vomma = 0, *x = 0, *zomma = 0; /*Character scalar and array declarations */ char put[8+1]; Nag_OrderType order; INIT_FAIL(fail); printf( "nag_jumpdiff_merton_greeks (s30jbc) Example Program Results\n"); printf("Merton Jump-Diffusion Model\n\n"); /* Skip heading in data file*/ scanf("%*[^\n] "); /* Read put*/ scanf("%s%*[^\n] ", put); /* * nag_enum_name_to_value (x04nac). * Converts NAG enum member name to value */ putnum = (Nag_CallPut) nag_enum_name_to_value(put); /* Read lambda, sigma, r, jvol*/ scanf("%lf%lf%lf%lf%lf%*[^\n] ", &lambda, &s, &sigma, &r, &jvol); /* Read m, n*/ scanf("%ld%ld%*[^\n] ", &m, &n); #ifdef NAG_COLUMN_MAJOR #define CHARM(I, J) charm[(J-1)*m + I-1] #define COLOUR(I, J) colour[(J-1)*m + I-1] #define DELTA(I, J) delta[(J-1)*m + I-1] #define GAMMA(I, J) gamma[(J-1)*m + I-1] #define P(I, J) p[(J-1)*m + I-1] #define RHO(I, J) rho[(J-1)*m + I-1] #define SPEED(I, J) speed[(J-1)*m + I-1] #define THETA(I, J) theta[(J-1)*m + I-1] #define VANNA(I, J) vanna[(J-1)*m + I-1] #define VEGA(I, J) vega[(J-1)*m + I-1] #define VOMMA(I, J) vomma[(J-1)*m + I-1] #define ZOMMA(I, J) zomma[(J-1)*m + I-1] order = Nag_ColMajor; #else #define CHARM(I, J) charm[(I-1)*n + J-1] #define COLOUR(I, J) colour[(I-1)*n + J-1] #define DELTA(I, J) delta[(I-1)*n + J-1] #define GAMMA(I, J) gamma[(I-1)*n + J-1] #define P(I, J) p[(I-1)*n + J-1] #define RHO(I, J) rho[(I-1)*n + J-1] #define SPEED(I, J) speed[(I-1)*n + J-1] #define THETA(I, J) theta[(I-1)*n + J-1] #define VANNA(I, J) vanna[(I-1)*n + J-1] #define VEGA(I, J) vega[(I-1)*n + J-1] #define VOMMA(I, J) vomma[(I-1)*n + J-1] #define ZOMMA(I, J) zomma[(I-1)*n + J-1] order = Nag_RowMajor; #endif if ( !(charm = NAG_ALLOC(m*n, double)) || !(colour = NAG_ALLOC(m*n, double)) || !(delta = NAG_ALLOC(m*n, double)) || !(gamma = NAG_ALLOC(m*n, double)) || !(p = NAG_ALLOC(m*n, double)) || !(rho = NAG_ALLOC(m*n, double)) || !(speed = NAG_ALLOC(m*n, double)) || !(t = NAG_ALLOC(n, double)) || !(theta = NAG_ALLOC(m*n, double)) || !(vanna = NAG_ALLOC(m*n, double)) || !(vega = NAG_ALLOC(m*n, double)) || !(vomma = NAG_ALLOC(m*n, double)) || !(x = NAG_ALLOC(m, double)) || !(zomma = NAG_ALLOC(m*n, double))) { printf("Allocation failure\n"); exit_status = -1; goto END; } /* Read array of strike/exercise prices, X*/ for (i = 0; i < m; i++) scanf("%lf ", &x[i]); scanf("%*[^\n] "); /* Read array of times to expiry*/ for (i = 0; i < n; i++) scanf("%lf ", &t[i]); scanf("%*[^\n] "); /* * nag_jumpdiff_merton_greeks (s30jbc) * Jump-diffusion, Merton's model, option pricing formula with Greeks */ nag_jumpdiff_merton_greeks(order, putnum, m, n, x, s, t, sigma, r, lambda, jvol, p, delta, gamma, vega, theta, rho, vanna, charm, speed, colour, zomma, vomma, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_jumpdiff_merton_greeks (s30jbc).\n%s\n", fail.message); exit_status = 1; goto END; } if (putnum == Nag_Call) { printf("%s\n\n", "European Call :"); } else if (putnum == Nag_Put) { printf("%s\n\n", "European Put :"); } printf(" Spot = %8.4f\n", s); printf(" Volatility = %8.4f\n", sigma); printf(" Rate = %8.4f\n", r); printf(" Jumps = %8.4f\n", lambda); printf(" Jump vol = %8.4f\n", jvol); printf("\n"); for (j = 1; j <= n; j++) { printf("\n Time to Expiry : %8.4f\n", t[j-1]); printf(" Strike Price Delta Gamma Vega " "Theta Rho\n"); for (i = 1; i <= m; i++) printf("%8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f\n", x[i-1], P(i, j), DELTA(i, j), GAMMA(i, j), VEGA(i, j), THETA(i, j), RHO(i, j)); printf(" Vanna Charm Speed " "Colour Zomma Vomma\n"); for (i = 1; i <= m; i++) printf("%26.4f %8.4f %8.4f %8.4f %8.4f %8.4f\n", VANNA(i, j), CHARM(i, j), SPEED(i, j), COLOUR(i, j), ZOMMA(i, j), VOMMA(i, j)); } END: if (charm) NAG_FREE(charm); if (colour) NAG_FREE(colour); if (delta) NAG_FREE(delta); if (gamma) NAG_FREE(gamma); if (p) NAG_FREE(p); if (rho) NAG_FREE(rho); if (speed) NAG_FREE(speed); if (t) NAG_FREE(t); if (theta) NAG_FREE(theta); if (vanna) NAG_FREE(vanna); if (vega) NAG_FREE(vega); if (vomma) NAG_FREE(vomma); if (x) NAG_FREE(x); if (zomma) NAG_FREE(zomma); return exit_status; }