Debugging Monte Carlo Option Prices Against Black–Scholes
Original question
My Monte Carlo option price differs significantly from the analytical Black-Scholes price. How can I debug the simulation?
Benchmark a European call using exact risk-neutral terminal prices, then compare the simulation gap with its sampling standard error. With spot and strike both 100, one year remaining, volatility20%, and a continuously compounded rate of 4%, Black–Scholes gives 9.9251. If the simulation instead grows the stock with a physical drift of 10%, the discounted payoff can average around 14. That gap reflects a different distribution.
Test the simulated stock before testing the option
For Z∼N(0,1), simulate
ST=S0exp[(r−σ2/2)T+σTZ].
The log drift includes −σ2/2 because the exponential of a mean-zero normal has mean above one. The discounted payoff is Y=e−rT(ST−K)+. With independent draws, estimate the price by Yˉ and its standard error by sY/n. Compare the analytic price with Yˉ±1.96sY/n as an approximate diagnostic interval. Even a correct implementation can miss that interval in about one run out of twenty under the usual normal approximation.
Interpret the price difference in standard errors
Use 100,000 independent normals with seed 96 and identical draws for the two drift settings. The risk-neutral simulation yields about 9.8375 with standard error 0.0454. The difference from 9.9251 is about 1.93 standard errors. The physical-drift version yields 13.9797 with standard error 0.0539, more than 75 standard errors away from Black–Scholes. Increasing the number of simulations reduces random error around each simulation's own population mean, so it helps distinguish the two cases.
With correctly scaled volatility, the standard deviation of simulated log returns should also be close to 20% over one year. If you swap the exact formula for Euler time steps, run a time-step convergence check at roughly the same sampling error.
Use the same normal draws when comparing the two drift settings. Then changes in the estimated value can be traced to the model input rather than to a different random sample. Check the simulated discounted mean stock against S0 first. If it is materially off by more than its sampling uncertainty, inspect the risk-neutral drift, time units and discounting. If the stock check passes but the option check fails, next test the payoff on hand-picked stock outcomes below, at and above strike. These tests localise the source of the discrepancy before you increase the simulation size.