/* nag_lookback_fls_greeks (s30bbc) Example Program. * * Copyright 2008, Numerical Algorithms Group. * * Mark 9, 2009. */ #include #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 q, r, s, sigma; double *charm = 0, *colour = 0, *crho = 0, *delta = 0, *gamma = 0; double *p = 0, *rho = 0, *sm = 0, *speed = 0, *t = 0, *theta = 0; double *vanna = 0, *vega = 0, *vomma = 0, *zomma = 0; /*Character scalar and array declarations */ char put[8+1]; Nag_OrderType order; INIT_FAIL(fail); printf("nag_lookback_fls_greeks (s30bbc) Example Program Results\n"); printf("Floating-Strike Lookback\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 sigma, r, jvol*/ scanf("%lf%lf%lf%lf%*[^\n] ", &s, &sigma, &r, &q); /* 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 CRHO(I, J) crho[(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 CRHO(I, J) crho[(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)) || !(crho = 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)) || !(sm = NAG_ALLOC(m, 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)) || !(zomma = NAG_ALLOC(m*n, double))) { printf("Allocation failure\n"); exit_status = -1; goto END; } /* Read array of min/max prices, SM*/ for (i = 0; i < m; i++) scanf("%lf ", &sm[i]); scanf("%*[^\n] "); /* Read array of times to expiry*/ for (i = 0; i < n; i++) scanf("%lf ", &t[i]); scanf("%*[^\n] "); /* * nag_lookback_fls_greeks (s30bbc) * Floating-strike lookback option pricing formula with Greeks */ nag_lookback_fls_greeks(order, putnum, m, n, sm, s, t, sigma, r, q, p, delta, gamma, vega, theta, rho, crho, vanna, charm, speed, colour, zomma, vomma, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_lookback_fls_greeks (s30bbc).\n%s\n", fail.message); exit_status = 1; goto END; } if (putnum == Nag_Call) { printf("European Call :\n\n"); } else if (putnum == Nag_Put) { printf("European Put :\n\n"); } printf("%s%8.4f\n", " Spot = ", s); printf("%s%8.4f\n", " Volatility = ", sigma); printf("%s%8.4f\n", " Rate = ", r); printf("%s%8.4f\n", " Dividend = ", q); printf("\n"); for (j = 1; j <= n; j++) { printf("\n"); printf(" Time to Expiry : %8.4f\n", t[j-1]); printf(" Strike Price Delta Gamma Vega " " Theta Rho CRho\n"); for (i = 1; i <= m; i++) printf("%9.4f %9.4f %9.4f %9.4f %9.4f %9.4f %9.4f %9.4f\n", sm[i-1], P(i, j), DELTA(i, j), GAMMA(i, j), VEGA(i, j), THETA(i, j), RHO(i, j), CRHO(i, j)); printf(" Vanna Charm Speed " "Colour Zomma Vomma\n"); for (i = 1; i <= m; i++) printf("%29.4f %9.4f %9.4f %9.4f %9.4f %9.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 (crho) NAG_FREE(crho); if (delta) NAG_FREE(delta); if (gamma) NAG_FREE(gamma); if (p) NAG_FREE(p); if (rho) NAG_FREE(rho); if (sm) NAG_FREE(sm); 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 (zomma) NAG_FREE(zomma); return exit_status; }