Skip to content
All library documents

Correlated Monte Carlo Simulation for a Two-Stock Arithmetic Basket Option

Article Quant Q&A · Author: stud91

Summary

The document discusses Monte Carlo pricing of a European arithmetic basket option on two stocks. The example simulates each stock’s terminal value with a lognormal model, averages the two values, calculates the call payoff, and discounts it. The reported implementation produces a price below the reference value, and the response identifies the missing dependence between the stocks as the key issue.

To model correlation, the answer constructs one standard normal draw from an independent pair: the first stock uses one draw, while the second uses a weighted combination of both draws. The example sets the correlation to one half. This illustrates how correlated shocks affect basket payoffs and how to include a specified correlation in a simulation. The response does not assess other implementation details, such as the reported confidence interval calculation, and its numeric example does not establish a general pricing result.

Key ideas

  • An arithmetic basket option payoff depends on the joint outcomes of its component stocks.
  • Simulating each stock with independent shocks ignores any specified correlation.
  • Correlated standard normal shocks can be built from two independent standard normal draws.
  • The example uses a correlation of one half when generating the second stock’s shock.
  • The answer focuses on correlation and does not review every detail of the pricing implementation.

Tags

Full text
# Basket Option pricing of two stocks


# Basket Option pricing of two stocks












I am trying to use Monte Carlo simulation to price arithmetic basket option consisting of two stocks. There seems to be something wrong in my implementation. According to the inputs

```
S1=100, S2=100, K=100, v1=30%, v2=30%, r=5%, T=3, M=100000, type=call
```

the value should be `24.345`. But for me it's coming out to be `21.913`. Here is my implementation:

```
dt = T
drift1 = exp((r-0.5*v1*v1)*dt)
drift2 = exp((r-0.5*v2*v2)*dt)

S1next = 0.0
S2next = 0.0
arithPayOff = numpy.empty(M, dtype=float)

scipy.random.seed([100])

for i in range(0,M,1):
    growthFactor1 = drift1 * exp(v1*sqrt(dt)*scipy.random.randn(1))
    S1next = S1 * growthFactor1
    growthFactor2 = drift2 * exp(v2*sqrt(dt)*scipy.random.randn(1))
    S2next = S2 * growthFactor2

    # Arithmetic mean
    arithMean = 0.5 * (S1next+S2next)
    arithPayOff[i] = exp(-r*T) * max(callOrPut*(arithMean-K), 0)

# Standard monte carlo
Pmean = numpy.mean(arithPayOff)
Pstd = numpy.std(arithPayOff)

confmc = [Pmean - 1.96*Pstd/sqrt(M), Pmean + 1.96*Pstd/sqrt(M)]
return numpy.mean(confmc)
```

## Answer by Gordon (score 3)

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

The problem in your code is that the correlation is completely ignored. I would replace the loop by the following piece of code:

```
for i in range(0,M,1):
    Rand1 = scipy.random.randn(1)
    Rand2 = scipy.random.randn(1)
    growthFactor1 = drift1 * exp(v1 * sqrt(dt) * Rand1)
    S1next = S1 * growthFactor1
    growthFactor2 = drift2 * exp(v2 * sqrt(dt) * (0.5 * Rand1 + sqrt(0.75) * Rand2))
    S2next = S2 * growthFactor2

    # Arithmetic mean
    arithMean = 0.5 * (S1next+S2next)
    arithPayOff[i] = exp(-r * T) * max(callOrPut * (arithMean - K), 0)
```

Basically, two correlated standard normal random variables $X_1$ and $X_2$ with correlation $\rho$ can be expressed as \begin{align*} X_1 &= \xi,\\ X_2 &= \rho\, \xi + \sqrt{1-\rho^2}\, \eta, \end{align*} where $\xi$ and $\eta$ are two independent standard normal random variables.

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.