Posted by
steve.affine on
URL: http://quantlib.414.s1.nabble.com/Greeks-for-vanilla-binomial-implementation-tp9329.html
Concerning the FR to add Greeks (
http://sourceforge.net/tracker/index.php?func=detail&aid=910972&group_id=12740&atid=362740), I have looked at this today and implemented most of them.
My suggestion is to use points on the binomial tree as per Odergaard (
http://finance-old.bi.no/~bernt/gcc_prog/recipes/recipes.pdf).
This gives delta, gamma & theta in quick and straightforward way without the need for recomputation. The code in binomialengine.hpp is basically:
DiscretizedVanillaOption option(arguments_);
//Go to maturity
option.initialize(lattice, maturity);
//Partial derivatives calculated from various points in the binomial tree (Odegaard)
//Rollback to third-last step, and get underlying price (s) & option value (p) at this point
option.rollback(grid[2]);
Array va2(option.values());
QL_ASSERT(va2.size() == 3, "Expect 3 nodes in grid at second step");
Real p2h = va2[2]; // high-price
Real p2m = va2[1]; // mid-price
Real s2 = bslattice->underlying(2, 2); //high price
//Rollback to second-last step, and get underlying price (s) & option value (p) at this point
option.rollback(grid[1]);
Array va(option.values());
QL_ASSERT(va.size() == 2, "Expect 2 nodes in grid at first step");
Real p1 = va[1];
//Rollback to t=0
option.rollback(0.0);
Real p0 = option.presentValue();
Real s1 = bslattice->underlying(1, 1);
//Calc partials
Real delta0 = (p1-p0)/(s1-s0); //dp/ds
Real delta1 = (p2h-p1)/(s2-s1); //dp/ds
//Return results
results_.value = p0;
results_.delta = delta0;
results_.gamma = 2.0*(delta1-delta0)/(s2-s0); //d(delta)/ds
results_.theta = (p2m-p0)/(grid[2]); //dp/dT
Any comments on this? Does anyone disagree, or think there is a better method or better place to put this code?
cheers
Steve
affine group limited
http://www.affine.hk