When I was using Monte Carlo to calculate the gamma of a vanilla call option by finite difference method, I stuck in this weird situation as below.
Consider this, $$ Gamma = \frac{CallPrice(S^{up}_{T}) - 2 * CallPrice(S_{T}) + CallPrice(S^{down}_{T})}{dS^2} $$ And we can choose dS small enough such that when $$ S_{T}>K \text{ then } S^{down}_{T}>K $$ and $$ S_{T}<K \text{ then } S^{up}_{T}<K $$
That is, we can write the above Gamma formula as $$ Gamma = \frac{(S^{up}_{T}-K)I(S_{T}>K) - 2 * (S_{T}-K)*I(S_{T}>K) + (S^{down}_{T}-K)I(S_{T}>K)}{dS^2} $$ $$ = \frac{(S^{up}_{T} - 2 * S_{T} + S^{down}_{T})I(S_{T}>K)}{dS^2} $$ $$ = \frac{(S_{0}+dS)*exp(...) - 2*S_{0}*exp(...) + (S_{0}-dS)*exp(...)}{dS^2} = 0 $$
So every time I run the simulation, I always get a correct delta but wrong gamma. (Not equal to zero maybe because of rounding error?)
I know gamma is nonzero, but I can't find where I did it wrong. Any help?
Note: This question is a bit similar to this one "Greeks: Why does my Monte Carlo give correct delta but incorrect gamma?", but slightly different.