EXOT Exotic Options
Beyond vanilla — barriers, Asians, lookbacks, and the pricing challenges they bring
Learning Objectives
- •Know the main types of exotic options
- •Understand why exotics exist (hedging specific risks)
- •Learn how to price exotics (Monte Carlo, FDM)
Explain Like I'm 5
Vanilla options are simple: call or put, exercise at expiration. Exotic options are everything else. Barrier options knock in/out when price hits a level. Asian options pay based on the AVERAGE price. Lookback options pay based on the best price during the option's life. They exist because real-world hedging needs are more nuanced than simple up/down bets.
Think of It This Way
If vanilla options are ordering off the regular menu, exotic options are custom orders. "I want a burger but only if the chef uses organic beef AND it's served before 8pm." More specific, more complex, and often more expensive to create.
1Types of Exotic Options
2Pricing Exotics
Key Formulas
Asian Option Payoff
Asian call payoff based on the arithmetic average of prices over N observation dates. The averaging reduces payoff variance compared to vanilla options.
Hands-On Code
Pricing Exotic Options with Monte Carlo
import numpy as np
def price_asian_option(S, K, T, r, sigma, n_steps=252, n_sims=50000):
"""Price an Asian call option using Monte Carlo."""
dt = T / n_steps
all_averages = []
for _ in range(n_sims):
prices = [S]
for t in range(n_steps):
Z = np.random.standard_normal()
S_next = prices[-1] * np.exp((r - sigma**2/2)*dt + sigma*np.sqrt(dt)*Z)
prices.append(S_next)
avg = np.mean(prices[1:])
all_averages.append(avg)
payoffs = np.maximum(np.array(all_averages) - K, 0)
price = np.exp(-r * T) * np.mean(payoffs)
se = np.exp(-r * T) * np.std(payoffs) / np.sqrt(n_sims)
print(f"=== ASIAN CALL OPTION ===")
print(f" Price: {price:.4f} +/- {1.96*se:.4f}")
return price
def price_barrier_option(S, K, T, r, sigma, barrier, n_steps=252, n_sims=50000):
"""Price a knock-out call option."""
dt = T / n_steps
payoffs = []
knocked_out = 0
for _ in range(n_sims):
path = [S]
alive = True
for t in range(n_steps):
Z = np.random.standard_normal()
S_next = path[-1] * np.exp((r-sigma**2/2)*dt + sigma*np.sqrt(dt)*Z)
path.append(S_next)
if S_next <= barrier:
alive = False
knocked_out += 1
break
payoffs.append(max(path[-1] - K, 0) if alive else 0)
price = np.exp(-r*T) * np.mean(payoffs)
print(f"=== KNOCK-OUT CALL (barrier={barrier}) ===")
print(f" Price: {price:.4f}")
print(f" Knocked out: {knocked_out/n_sims:.1%}")
return pricePrices Asian and barrier options using Monte Carlo simulation, demonstrating how MC handles payoff structures that have no closed-form solution.
Knowledge Check
Q1.An Asian option is cheaper than a vanilla option with the same parameters. Why?
Assignment
Price an Asian call, a knock-out call, and a vanilla call with the same parameters using Monte Carlo. Compare prices and explain why they differ.