MC Monte Carlo Pricing
When the math gets too complex for formulas — simulate it
Learning Objectives
- •Understand Monte Carlo simulation for derivative pricing
- •Learn variance reduction techniques
- •See how MC connects to production validation frameworks
Explain Like I'm 5
Some derivatives are too complex for clean formulas. Monte Carlo is the brute force approach: simulate thousands of possible price paths, compute the payoff on each, average them — that's your price. More paths equals more accuracy. This is the same concept production systems use for Monte Carlo validation — simulate thousands of equity curves and see how often things blow up.
Think of It This Way
Monte Carlo pricing is like estimating the area of an oddly-shaped pool by throwing random tennis balls from a helicopter. If you throw 1000 balls at a rectangular field containing the pool, and 300 land in the pool, the pool is about 30% of the field. More balls = better estimate. Same idea but with random price paths instead of tennis balls.
1Monte Carlo for Option Pricing
2Variance Reduction
3MC Beyond Options: Validation
4Common MC Pitfalls
Monte Carlo Convergence: Call Price vs Number of Simulations
Key Formulas
GBM Price Path
Generates a random terminal stock price under geometric Brownian motion. Z is a standard normal random variable. This is the building block of Monte Carlo simulation.
MC Price Estimate
Monte Carlo option price = discounted average of simulated payoffs. Standard error decreases as 1/sqrt(N) — need 4x more paths for 2x more accuracy.
Hands-On Code
Monte Carlo Option Pricing
import numpy as np
def mc_option_price(S, K, T, r, sigma, n_sims=100000, option_type='call'):
"""Monte Carlo pricing with antithetic variates."""
Z = np.random.standard_normal(n_sims // 2)
Z = np.concatenate([Z, -Z]) # antithetic variates
# Terminal prices under GBM
S_T = S * np.exp((r - sigma**2/2)*T + sigma*np.sqrt(T)*Z)
# Payoffs
if option_type == 'call':
payoffs = np.maximum(S_T - K, 0)
else:
payoffs = np.maximum(K - S_T, 0)
# Discounted average
price = np.exp(-r * T) * np.mean(payoffs)
se = np.exp(-r * T) * np.std(payoffs) / np.sqrt(n_sims)
print(f"=== MONTE CARLO PRICING ({n_sims:,} sims) ===")
print(f" {option_type.upper()}: {price:.4f} +/- {1.96*se:.4f} (95% CI)")
print(f" Standard error: {se:.6f}")
return price, sePrices European options using Monte Carlo with antithetic variates for variance reduction, then compares to the analytical Black-Scholes price.
Knowledge Check
Q1.You need the Monte Carlo standard error to be half as large. How many more simulations do you need?
Assignment
Implement Monte Carlo pricing with and without antithetic variates. Compare convergence speed. Then price an Asian option that Black-Scholes can't handle.