For a vanilla European call, my Monte Carlo method gives the right option price and delta but the wrong gamma. In particular, the value of gamma varies wildly each time I run the method. I estimate gamma by $$ \Gamma = \frac{C(S+\Delta S,K,T,\sigma,r) - 2C(S,K,T,\sigma,r) + C(S-\Delta S,K,T,\sigma,r)}{(\Delta S)^2} $$ Here's my Matlab code. Could anyone tell me what I'm doing wrong? Thanks.
3 Answers
the problem is that the pay-off has discontinuous first derivative. Try a contract with pay-off that is twice differentiable and it will probably work.
The problem is that all the value comes from the tiny number of paths within $\Delta S$ of the strike, and these paths have huge value.
This is a well-known problem. As the bump size goes to zero, the pathwise value converges to differentiating along the path twice. Since the second derivative is a delta function, you get nonsense. A huge amount of work has gone into coping with discontinuities for the pathwise method. See eg http://ssrn.com/abstract=2431580
It's a combination of too few sample paths and/or too small an increment.
Your estimation error on the price is magnified by the $dS^2$. Try using a larger sample or a larger increment. Alternatively, you can use a multiplier instead of a fixed increment; in my experience, it usually yields better results.
consider adjoint algorithmic differentiation to get an exact derivative here. Works especially well for monte carlo. Here is an example paper: http://luca-capriotti.net/pdfs/Finance/jcf_capriotti_press_web.pdf
-
3$\begingroup$ Straight differentiation doesn't work when the pay-off has discontinuous first derivative. Making it adjoint only affects computational order not accuracy. $\endgroup$ Commented Jun 8, 2015 at 21:49