# How to conduct Monte Carlo simulations to test validity of Black Scholes for a specific option?

In reference to the original Black Scholes model, what approach is best to test the model in a rigorous way? Is there a standard approach that can accomplish this in a reasonable amount of time?

Details I require:

• number of trials,

• which software to use, formulas etc.

• any other information that I should be aware of

* This should be able to be done on a laptop with a Core i5 processor with a graphics card.

-

the original model - you mean the one based on log-normal distribution (3-line formula...) ? \\ Also what kind of validity are you looking for ? That it matches market price - it does if you calibrate it with implied vol... \\ And what is the Monte-Carlo for ? if you assume the same dynamics as BS - there is convergence of MC simulated option price... showed in every textbook – Vytautas Mar 28 '11 at 11:28
– Vytautas Mar 28 '11 at 11:35
I know it converges, but how do I do it for a specific option? What software should I use? I am looking to start with the original Black Scholes and make a few modifications, that's why I asked for a standard approach. – Beatrice Mar 28 '11 at 12:10
– richardh♦ Mar 30 '11 at 13:18

## 5 Answers

1. I recommend to use MATLAB / Excel for simplicity - depends which one do you already know.
2. Write down the SDE for geometic brownian motion (to simulate stock price over time) on paper, as quant_dev mentioned.
1. Discretize it using i.e. forward Euler discretization (see Wikipedia), code up a MC simulation to simulate it for the time period you want to price your options.
2. Don't forget to use the risk-free dynamics in the SDE, otherwise you wont converge to BS price.
3. Code the $f(S_T)$ payoff function for your option payoff.
4. Calculate the expected (average over simulations), discounted payoff.

With 10 000 simulations, or even 100 000, there should be a decent convergence of your simulation (error at $10^{-4}$) - your CPU should handle this in a few mins max.

-

## Did you find this question interesting? Try our newsletter

email address

Write out your model as an SDE, simulate it and compare the result with an analytical solution (if you've got one).

-

On the software end, if you want something quick/dirty I would personally go with Matlab/R/python however if you want something a bit more rigorous (e.g. payoff classes, "better" SDEs) something OO like C++ would really be the route to take.

The basic is fairly simple here's a quick sample of what it should look like:

````double variance = vol*vol*expire; 
double rootVariance = sqrt(variance); 
double halfVar = -0.5*variance;

double SpotPlusOne = s*exp(r*expire+halfVar); 
double Spot; 
double runningSum=0;

for (unsigned long i=0; i < NumOfPaths; i++) 
{ 
double SN = SNByBoxMuller();
Spot = SpotPlusOne*exp(rootVariance*SN); 
double PayOff = Spot – strike;

PayOff = PayOff >0 ? PayOff : 0; 
runningSum += PayOff; 
}

double mean = runningSum / NumOfPaths; 
mean*=exp(-r*expire); 
return mean;
````

The SNByBoxMuller() is just the standard way of generating a random number from a standard normal distribution from Box Muller.

-

I think what you really need to do is test the results of the analytic/simulated solution against the actual AND future historical price. So you need to get historical data for the specific option. That, to me, is much more interesting since it will tell you if Black-Scholes is working vs. the reality. Of course you will need a large number of historical data points to tackle this.

-

It's not that easy, because the simulation will be performed in risk-neutral measure, and historical data give you information about the physical (a.k.a. real-world measure). You can use them to verify your models, but it's not something a beginner will be able to do. – quant_dev Mar 28 '11 at 21:10
Good point.  However if the OP is versed in Monte Carlo simulation, she is not a beginner, and she can make any assumptions she wishes regarding IV, interest rate etc. and let the model run.  The only real constraint is time. – Ralph Winters Mar 31 '11 at 18:36

It seems like everyone here is MC but you can use PDE methods as well.

Anyway there is two things that you can usually check, the Price and ... the Hedge (or replication price).

Let's look at the first case:

• If you have closed-form formulas (as is usually the case in the BS "fantas(ma)tic-wishfull thinking"-setting), then that's all you need. If not, then you are not comfortable with your math (or your model but this is another issue).

• If you don't have such an analytical solution at hand, then usually MC comes in naturally (as every one suggests here) but you could use PDE methods aswell (after all it was the original methods for derivation of the BS Call/Put options prices). And you have plenty of books and nice articles that will tell you how to proceed in both cases (especially in BS settings). An easy check that I recommand, is to compare the "closed-form formulas" vs "MC (and/or PDE)" in the vanilla cases. Moreover those methods provide a good introdution to the replication prices that you might be willing to check in the second case.

Note that by using finite difference (or element) methods for the PDE you get an error and that when using discretization sheme for SDE you get at the of the day "random variable" for your P&L. There it is really a matter of taste in my opinion both methods have pros and cons.

For the second case, that I called replication price then it is usually provided in a (at least in principle) straigthforward manner of the methods you used for the PDE and/or SDE discretization.

Still regarding the replication prices, the very recent article of Wilmott and Ahmad "Which Free Lunch Would You Like Today, Sir?: Delta Hedging, Volatility Arbitrage and Optimal Portfolios" is really illuminating in many ways and stays in the BS setting you want to stay within I think you should read it.

-
{"extraction_info": {"found_math": true, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 0, "mathjax_tag": 0, "mathjax_inline_tex": 2, "mathjax_display_tex": 0, "mathjax_asciimath": 0, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0}, "config": {"markdown_headings": true, "markdown_code": true, "boilerplate_config": {"ratio_threshold": 0.18, "absolute_threshold": 10, "end_threshold": 15, "enable": true}, "remove_buttons": true, "remove_image_figures": true, "remove_link_clusters": true, "table_config": {"min_rows": 2, "min_cols": 3, "format": "plain"}, "remove_chinese": true, "remove_edit_buttons": true, "extract_latex": true}, "english_confidence": 0.9102222323417664, "perplexity_flag": "middle"}