Monte Carlo Simulation for Derivative Pricing › Multi-Asset Options

Michael BrenndoerferDecember 2, 20255 min read
Quantitative FinanceAll chapters
Part 6 of 15Numerical Methods for Derivative Pricing
Chapter 34Monte Carlo Simulation for Derivative Pricing › Multi-Asset Options
Reading section 9 of 13 · Multi-Asset Options · 5 minSection 9 of 13 · 5 min

Book contents

Section 9 of 13 · 5 min read

Monte Carlo Simulation for Derivative Pricing › Multi-Asset OptionsOne section · Sections in this chapter9 / 13 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

Monte Carlo extends naturally to options on multiple correlated assets, such as basket options or spread options. The key challenge in multi-asset simulation is generating random variables with the correct correlation structure. For two assets with correlation ρ\rho, we generate correlated normal random variables using the Cholesky decomposition, a mathematical technique for expressing the correlation structure in a computationally convenient form.

If Z1,Z2Z_1, Z_2 are independent standard normals, then the following transformation produces correlated standard normals:

ϵ1=Z1ϵ2=ρZ1+1−ρ2Z2\begin{aligned} \epsilon_1 &= Z_1 \\ \epsilon_2 &= \rho Z_1 + \sqrt{1 - \rho^2} Z_2 \end{aligned}

where:

  • ϵ1,ϵ2\epsilon_1, \epsilon_2: correlated standard normal variables
  • Z1,Z2Z_1, Z_2: independent standard normal variables
  • ρ\rho: correlation coefficient
  • ρZ1\rho Z_1: component of the second asset's return driven by the common factor
  • 1−ρ2Z2\sqrt{1 - \rho^2} Z_2: idiosyncratic component unique to the second asset

This construction preserves unit variance for both ϵ1\epsilon_1 and ϵ2\epsilon_2 (since ρ2+(1−ρ2)=1\rho^2 + (1-\rho^2) = 1) while ensuring the correct correlation. The intuition is that we decompose the second asset's randomness into two parts: a portion ρZ1\rho Z_1 that comes from the same source as the first asset (the "common factor"), and a portion 1−ρ2Z2\sqrt{1 - \rho^2} Z_2 that is unique to the second asset (the "idiosyncratic factor"). When ρ=1\rho = 1, the second asset moves perfectly with the first. When ρ=0\rho = 0, they are independent. When ρ=−1\rho = -1, they move in opposite directions.

For a basket call option on two assets with weights w1,w2w_1, w_2, the payoff is simply the call payoff applied to the weighted sum:

Payoff=max⁡(w1S1,T+w2S2,T−K,0)\text{Payoff} = \max(w_1 S_{1,T} + w_2 S_{2,T} - K, 0)

where:

  • Payoff\text{Payoff}: cash flow received at expiration
  • w1,w2w_1, w_2: weights of the assets in the basket
  • S1,T,S2,TS_{1,T}, S_{2,T}: asset prices at time TT
  • KK: strike price
In[28]:
Code
def monte_carlo_basket_call(
    S1_0, S2_0, K, T, r, sigma1, sigma2, rho, w1, w2, n_simulations
):
    """
    Price a call option on a weighted basket of two assets.

    Payoff = max(w1*S1_T + w2*S2_T - K, 0)
    """
    # Generate correlated normals
    Z1 = np.random.standard_normal(n_simulations)
    Z2 = np.random.standard_normal(n_simulations)

    eps1 = Z1
    eps2 = rho * Z1 + np.sqrt(1 - rho**2) * Z2

    # Simulate terminal prices
    S1_T = S1_0 * np.exp((r - 0.5 * sigma1**2) * T + sigma1 * np.sqrt(T) * eps1)
    S2_T = S2_0 * np.exp((r - 0.5 * sigma2**2) * T + sigma2 * np.sqrt(T) * eps2)

    # Basket value
    basket_T = w1 * S1_T + w2 * S2_T

    # Payoffs
    payoffs = np.maximum(basket_T - K, 0)

    discount_factor = np.exp(-r * T)
    price = discount_factor * np.mean(payoffs)
    std_error = discount_factor * np.std(payoffs) / np.sqrt(n_simulations)

    return price, std_error
In[29]:
Code
np.random.seed(42)

# Equal-weighted basket of two assets
basket_price, basket_se = monte_carlo_basket_call(
    S1_0=100,
    S2_0=100,
    K=100,
    T=1.0,
    r=0.05,
    sigma1=0.2,
    sigma2=0.3,
    rho=0.5,
    w1=0.5,
    w2=0.5,
    n_simulations=100000,
)
basket_ci_width = 1.96 * basket_se
Out[30]:
Console
Basket call price: $11.1603 ± $0.1007

The basket option benefits from diversification. Even though one asset has 30% volatility, the combined basket has lower volatility due to imperfect correlation. This makes basket calls cheaper than calls on the individual assets with equivalent total notional.

Out[31]:
Visualization
Scatter plot of two positively correlated terminal asset prices, with out-of-the-money points below the dashed basket-strike boundary and in-the-money points above it.
Joint distribution of correlated terminal asset prices for the basket option. The upward-sloping, right-skewed cloud reflects positive correlation between the lognormal asset prices. The dashed line shows where the weighted basket equals the strike price, separating in-the-money scenarios (upper right) from out-of-the-money scenarios.

For higher dimensions with more than two assets, the Cholesky decomposition of the correlation matrix generalizes this approach systematically:

ϵ=LZ\boldsymbol{\epsilon} = \mathbf{L} \mathbf{Z}

where:

  • ϵ\boldsymbol{\epsilon}: vector of correlated random variables
  • L\mathbf{L}: lower triangular Cholesky matrix
  • Z\mathbf{Z}: vector of independent standard normal variables
  • R\mathbf{R}: correlation matrix (R=LLT\mathbf{R} = \mathbf{L}\mathbf{L}^T)

The Cholesky decomposition factors the correlation matrix R\mathbf{R} into the product of a lower triangular matrix L\mathbf{L} and its transpose. By multiplying a vector of independent standard normals by L\mathbf{L}, we obtain a vector of correlated normals with exactly the desired correlation structure. This procedure generalizes efficiently to any number of assets.

Key Parameters

The key parameters for multi-asset basket options are:

  • S: Initial asset prices (S1,0,S2,0S_{1,0}, S_{2,0}).
  • σ: Volatilities of the individual assets.
  • ρ: Correlation coefficient between asset returns.
  • w: Weights of the assets in the basket.