Skip to content
All library documents

Why Monte Carlo Option Prices Depend on Standard Normal Draws

Article Quant Q&A · Author: Zodiacal

Summary

The document diagnoses a mismatch between a Monte Carlo estimate and the Black–Scholes value for a European call and put. The simulation uses the geometric Brownian motion terminal-price formula, which already multiplies a standard normal draw by volatility and the square root of time. The error is drawing the random variable with standard deviation equal to volatility as well, effectively scaling the random shock by volatility twice.

The accepted explanation is to use a standard normal variable with mean zero and unit standard deviation in that formula. The displayed estimates are far below the analytical prices, consistent with the incorrectly narrow simulated price distribution. This is a focused implementation correction rather than a broad treatment of Monte Carlo pricing: it does not discuss confidence intervals, variance reduction, or other sources of simulation error. Its lesson is to match the distribution of random inputs to the parameterization of the stochastic model.

Key ideas

  • The terminal-price formula expects a standard normal shock with unit variance.
  • Volatility belongs in the formula’s scaling term and should not also set the shock’s standard deviation.
  • Applying volatility twice compresses simulated price variation and distorts option payoff estimates.
  • Comparing simulated estimates with an analytical benchmark can reveal implementation errors.

Tags

Full text
# Monte Carlo simulated price and Black Scholes Price are giving a huge difference in my Matlab code


# Monte Carlo simulated price and Black Scholes Price are giving a huge difference in my Matlab code












I have written a script for showing Monte Carlo Price for a increasing N. But comparing with BS results , This indicates a huge difference. Where is the error?

Function :

```
 function [cpay,ppay] = callput(S0,K,T,r,sigma,N)
%CALLPUT Summary of this function goes here
%   Detailed explanation goes here
phi=normrnd(0,sigma,[1,N]);
dT=T;
for i=1:N
    S(i)=S0*exp((r-.5*sigma.^2)*dT + sigma*sqrt(dT)*phi(i));
    C(i)= exp(-r*T)*max(S(i)-K, 0);
    P(i)=exp(-r*T)*max(K-S(i), 0);
end 
price1=sum(C)/N;
price2=sum(P)/N;
cpay=price1;
ppay=price2;
end
```

Main Script:

```

clc
clear all
% f=fopen('CPData.txt','w');
[BSCall, BSPut] = blsprice(5,5,.04,.5,.2)
fprintf('i\tMC-Call\tMC-Put\n');
for i=1:50

    [cpayoff,ppayoff]=callput(5,5,.5,.04,.2,i*1000);
    cp(i)=cpayoff;
    pp(i)=ppayoff;
    fprintf('%d\t%3.4f\t%3.4f\n',i*1000,cp(i),pp(i));

end
```

Results :

```

BSCall =

    0.3314

BSPut =

    0.2323

i       MC-Call MC-Put
1000    0.0894  0.0333
2000    0.0838  0.0344
3000    0.0842  0.0331
4000    0.0847  0.0335
5000    0.0852  0.0349
6000    0.0842  0.0330
7000    0.0865  0.0326
8000    0.0844  0.0348
9000    0.0862  0.0329
10000   0.0863  0.0340
11000   0.0859  0.0323
12000   0.0849  0.0346
13000   0.0852  0.0346
14000   0.0861  0.0342
15000   0.0863  0.0325
16000   0.0854  0.0338
17000   0.0839  0.0342
18000   0.0844  0.0340
19000   0.0861  0.0343
20000   0.0845  0.0338
21000   0.0836  0.0341
22000   0.0842  0.0340
23000   0.0853  0.0338
24000   0.0842  0.0341
25000   0.0844  0.0344
26000   0.0863  0.0329
27000   0.0846  0.0332
28000   0.0845  0.0335
29000   0.0852  0.0339
30000   0.0854  0.0334
31000   0.0849  0.0339
32000   0.0851  0.0337
33000   0.0846  0.0340
34000   0.0849  0.0334
35000   0.0850  0.0335
36000   0.0846  0.0339
37000   0.0855  0.0337
38000   0.0851  0.0335
39000   0.0849  0.0335
40000   0.0855  0.0330
41000   0.0853  0.0330
42000   0.0847  0.0337
43000   0.0849  0.0330
44000   0.0850  0.0343
45000   0.0850  0.0338
46000   0.0856  0.0337
47000   0.0846  0.0335
48000   0.0854  0.0337
49000   0.0851  0.0334
50000   0.0853  0.0336
```

## Answer by Ezy (score 0, accepted)

https://quant.stackexchange.com/a/43457

Given the formula for S, the variable phi should be a normal standard variable, not with stdev sigma.

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.