In the first part of this blog post about pricing financial options using Monte Carlo simulations, we did the following:

Here in the second part of this blog post we will look at two, more complicated examples, where we unlike the example in the first part cannot find an explicit formula, and we thus need Monte Carlo simulations to price these option contracts.

## Arithmetic basket call in the standard Black&Scholes model

For our first example, we will stay in the standard Black&Scholes model, i.e. the stock dynamics follow a Geometric Brownian Motion:

with the solution:

where $W(T)\sim N(0,T)$, so $S(T)$ has a log-normal distribution. The contract will we look at now, is very similar to the European call options, but instead of having just one underlying stock, we take the arithmetic average of several stocks ($n$ of them). This contract is called an arithmetic basket call option, and has the following payoff at time $T$:

Even if we know the distribution of every stock $S_i$, we do not know the distribution of the arithmetic average of $n$ of them (the log-normality is not preserved under summation). We can therefore not find an explicit formula like the Black&Scholes formula for European call options in this case for the option price:

Our solution will be to use Monte Carlo simulations. For simulation purposes, we will use that the log stock prices $\log(S_1(T)),...,\log(S_n(T))$ follow a multivariate normal distribution. For simplicity, we assume that all stocks have the same initial value $S(0)=s$, same volatility $\sigma$ and that the correlation $\rho$ between all the stocks are the same. The log stock prices will then follow a multivariate normal distribution with the following expected value vector $\mathbf{\mu}$ and covariance matrix $\Sigma$:

Note that $\boldsymbol{\mu}$ is an $n\times 1$-vector and $\boldsymbol{\Sigma}$ is an $n\times n$-matrix. This is useful because we can now simulate from this multivariate normal distribution and then transform the values using the exponential function to get simulations of the stocks. We thus have the following Monte Carlo sampler for estimating the price of the arithmetic basket call option:

So, assuming that we have $n=10$ underlying stocks, that $s=100$, the strike price $K=90$, the risk free interest rate $r=1\%$, the stock volatility $\sigma=0.2$, the correlation $\rho=0.4$ and that the time to maturity $T=1$ year, we can implement the following Monte Carlo sampler in Python:

Running a simulation (with $N=100000$) gives us the following price estimate and 95% confidence interval for the Monte Carlo estimated price:

As mentioned in the first part of this post, we will get different values if we were to repeat the simulations. So if you try and implement this by yourself you would not get exactly the same values, but they should however be very similar.

## European call option in the Heston model

When comparing actual options prices on various financial markets with the prices given by the standard Black&Scholes model, it becomes clear that they generally do not match very well. The standard Black&Scholes model is just not complex enough to explain the stock's price process. There are several adjustments one could make to get a better model. One major drawback of the standard Black&Scholes model is that the stock volatility is constant and deterministic, while the actual stock volatility is a stochastic process just like the stock's price process. We will therefore now look at a model with stochastic stock volatility, namely the Heston model.

In the Heston model, we have dynamics, given as stochastic differential equations, for both the stock and the volatility. These dynamics looks as follows:

where $S(t)$ is the stock's price process as before, and $V(t)$ is the stock's volatility process. $W^{(1)}(t)$ and $W^{(2)}(t)$ are here two independent standard Brownian Motions. Also, $r$ is the risk free interest rate, and $\rho$, $\kappa$, $\theta$ and $\sigma$ are model parameters.

We return to the European call option that we had in the first part of this post. As you might remember, this means that we want to find the option price:

In the standard Black&Scholes model we could find an explicit formula for this price. In the Heston model however, this is not the case. The reason is that we cannot find a closed form solution to the system of stochastic differential equations for $S(t)$ and $V(t)$ above. We will therefore need numerical methods and Monte Carlo simulations to generate a sample of stock prices $S(T)$ that we can use to estimate the option price.

So we cannot solve these stochastic differential equations analytically, and will instead rely on numerical methods. As always when dealing with continuous functions in numerical analysis, we are going to use some kind of discretization scheme to solve these equations. This means that instead of dealing with this as a continuous problem over the interval $[0,T]$, we are reducing this continuous interval to discrete time points $\{t_0,t_1,...,t_{n-1},t_n\}$ where we have that $t_0=0$ and $t_n=T$. We will then, using some discretization scheme, calculating the values of $S(t)$ and $V(t)$ at these time points only.

We start with the differential equation for $S(t)$. We will here use something called the Euler Scheme. For a stochastic differential equation on the form:

where $g$ and $h$ are functions, the Euler scheme is:

for $i=1,...,n$, where $\Delta=t_i-t_{i-1}$ is the size of each time step and $\Delta W=W_{t_i}-W_{t_{i-1}} \sim N(0,\Delta)$ is the increment of the standard Brownian Motion. Comparing with the equation for $S(t)$, the Euler scheme in this case becomes:

for $i=1,...,n$. Note that the stochastic part here are the $\Delta Ws$, so the Monte Carlo aspect will be to simulate these normal random variables. Doing this scheme $N$ times, we will have a Monte Carlo sample of size $N$ of the stock prices $S(T)=S_n$. We must of course simulate the process for $V(t)$ as well. To ensure that the $V_is$ take on only positive values, we add another term to the discretization scheme. We will not go into details here but this is called the Milstein scheme (this extra term can be seen in the code in the end). If you are interested you can check out the Wikipedia page.

So, we have the following Monte Carlo sampler for estimating the price of the European call option:

We assume that the initial stock price is $S(0)=100$, the initial volatility is $V(0)=0.16$, the strike price $K=90$, the risk free interest rate $r=1\%$ and the time to maturity is $T=1$ year. Also, we assume that our model parameters have the values $\kappa=10$, $\theta=0.16$, $\sigma=0.1$ and $\rho=-0.8$. Then, using $n=252$ time steps in the discretization (typically 252 trading days on a year, so daily time steps as $T=1$ year), we can implement the following Monte Carlo sampler in Python:

Running a simulation (with $N=100000$) gives us the following price estimate and 95% confidence interval for the Monte Carlo estimated price:

So, in this second part of this blog post we continued with pricing financial options using Monte Carlo simulations, and we looked at two examples that was a bit more complicated compared to the one in part 1. To summarize the highlights, we have: