Module 13: Options & Derivatives
Where stochastic calculus, probability theory, and estimation converge
1. What Are Derivatives?
A derivative is a financial contract whose value derives from the price of an underlying asset. The underlying can be a stock, bond, commodity, interest rate, currency, or even another derivative. Derivatives are the most mathematically rich instruments in finance, and for a statistician, they are where stochastic calculus, probability theory, and estimation all converge.
Derivative = a contract between two parties whose payoff depends on the value of an underlying asset. The four main types are: options (right but not obligation to buy/sell), futures (obligation to buy/sell at a future date), forwards (like futures but traded privately), and swaps (exchange of cash flow streams).
A derivative is a function of a random variable. If S is the price of the underlying (a random variable), then the derivative's payoff is g(S) for some function g. Pricing the derivative means computing E[g(S) · e−rT] under the appropriate probability measure. This is expected value of a transformation — the same operation you perform when computing E[g(X)] in any probability course.
This module focuses on options, the most commonly traded and conceptually rich type of derivative.
1.1 Why Derivatives Exist
Derivatives serve three fundamental purposes:
| Purpose | Description | Statistical Analogue |
|---|---|---|
| Hedging | Reduce risk by offsetting an existing exposure | Variance reduction technique (like control variates) |
| Speculation | Make leveraged bets on price direction | Concentrated portfolio (high variance, high expected return) |
| Price discovery | Derivative prices reveal market expectations | Inverse problem — extracting latent parameters from observables |
2. Call and Put Options
2.1 Call Options
A call option gives the holder the right, but not the obligation, to buy the underlying asset at a specified price (the strike price K) on or before a specified date (the expiration date T). The payoff at expiration is:
If ST > K, you exercise the option and profit ST − K. If ST ≤ K, the option expires worthless and your payoff is zero.
The call payoff max(ST − K, 0) is a truncated random variable. If ST follows a continuous distribution, the call payoff is the positive part of (ST − K). Its expected value is: E[max(ST − K, 0)] = ∫K∞ (s − K) f(s) ds, where f is the density of ST. This is the partial expectation or truncated mean that appears frequently in actuarial science and survival analysis.
2.2 Put Options
A put option gives the holder the right to sell the underlying at the strike price. The payoff at expiration is:
If ST < K, you exercise and profit K − ST. If ST ≥ K, the put expires worthless. The put is like insurance against a price decline.
The put payoff is the mirror truncation of the call: it captures the left tail of the distribution. Together, call and put payoffs decompose the absolute deviation |ST − K| into positive and negative parts: max(S − K, 0) − max(K − S, 0) = S − K. This identity underlies put-call parity, which we derive later.
2.3 Option Terminology
| Term | Meaning | For Calls | For Puts |
|---|---|---|---|
| In the money (ITM) | Option has positive intrinsic value | S > K | S < K |
| At the money (ATM) | Strike equals current price | S ≈ K | S ≈ K |
| Out of the money (OTM) | Option has zero intrinsic value | S < K | S > K |
| Intrinsic value | Payoff if exercised now | max(S − K, 0) | max(K − S, 0) |
| Time value | Option price minus intrinsic value | The premium for optionality; always ≥ 0 | |
| Premium | Price paid to buy the option | The upfront cost; your maximum loss as a buyer | |
2.4 Profit Diagrams
The profit (not payoff) accounts for the premium paid upfront. For a call buyer with premium c:
For a put buyer with premium p:
The breakeven point for a call is ST = K + c, and for a put is ST = K − p. Note the fundamental asymmetry: the buyer's maximum loss is the premium paid (bounded), but the potential gain is unlimited for calls and large for puts.
Options create asymmetric payoff distributions. A call buyer has a right-skewed payoff: small probability of large gains, high probability of a small fixed loss (the premium). This is the opposite of selling insurance — you pay a small regular cost for protection against a large adverse event. Conversely, the option seller has a left-skewed payoff: frequent small gains (collecting premium) with rare large losses.
3. The Black-Scholes Formula
The Black-Scholes formula (1973) is one of the most important equations in finance. It provides a closed-form solution for the price of a European call or put option on a non-dividend-paying stock.
3.1 The Model Assumptions
Black-Scholes rests on several strong assumptions. A statistician should know each one and its implications:
| Assumption | Mathematical Form | Reality Check |
|---|---|---|
| Stock follows geometric Brownian motion | dS = μS dt + σS dW | Approximate but tails are fatter in reality |
| Volatility is constant | σ = constant | Violated — vol clusters and changes over time |
| Log-returns are normally distributed | ln(ST/S0) ~ N((μ − σ²/2)T, σ²T) | Approximately true for moderate horizons; fails in tails |
| No arbitrage opportunities | Risk-neutral pricing applies | Approximately true in liquid markets |
| Continuous trading is possible | Can rebalance hedge at every instant | Impossible in practice; introduces hedging error |
| No transaction costs or taxes | Frictionless markets | Costs are small but nonzero |
| Risk-free rate is constant and known | r = constant | Rates fluctuate; less important for short-dated options |
The geometric Brownian motion (GBM) assumption means log-returns follow a random walk with drift: ln(St+1/St) = μdt + σdWt, where dWt ~ N(0, dt). This is a Gaussian AR(0) model for log-returns: no autocorrelation, constant variance, normally distributed innovations. Every empirical finance paper since the 1960s has shown these assumptions are violated (fat tails, volatility clustering, serial correlation), yet Black-Scholes remains the industry standard benchmark because of its elegant closed form.
3.2 The Black-Scholes Formulas
For a European call option:
For a European put option:
where:
d2 = d1 − σ√T
and N(·) is the standard normal CDF.
The Black-Scholes formula is a discounted expected value under the risk-neutral measure: C = e−rT EQ[max(ST − K, 0)]. The terms N(d1) and N(d2) are tail probabilities of the standard normal distribution. Specifically, N(d2) is the risk-neutral probability that the option expires in the money: PQ(ST > K). The quantity d2 is a z-score — how many standard deviations the log-forward price is above the log-strike.
Notice that μ (the stock's expected return) does not appear in the Black-Scholes formula. This is the profound insight of risk-neutral pricing: we replace the real-world drift μ with the risk-free rate r and price the option as a discounted expectation under this modified probability measure. The option price does not depend on how fast the stock is expected to grow — only on how much it is expected to fluctuate (σ).
4. The Greeks: Partial Derivatives of Option Price
The "Greeks" are the partial derivatives of the option price with respect to various inputs. They measure how the option price changes when one parameter changes while all others are held constant. For a statistician, these are simply a sensitivity analysis.
| Greek | Symbol | Definition | Measures | Statistical Analogue |
|---|---|---|---|---|
| Delta | Δ | ∂V/∂S | Price sensitivity to underlying | Regression coefficient (slope) |
| Gamma | Γ | ∂²V/∂S² | Rate of change of delta | Curvature; second derivative (like convexity for bonds) |
| Theta | Θ | ∂V/∂t | Time decay (value lost per day) | Depreciation rate of the option's time value |
| Vega | ν | ∂V/∂σ | Sensitivity to volatility | Sensitivity of estimator to dispersion parameter |
| Rho | ρ | ∂V/∂r | Sensitivity to interest rate | Often negligible for short-dated options |
4.1 Delta in Depth
Delta is the most important Greek. For a call option under Black-Scholes:
This means delta is always between 0 and 1 for calls, and between −1 and 0 for puts. An at-the-money call has delta ≈ 0.5: the option price moves about 50 cents for every $1 move in the stock.
Delta = N(d1) is the standard normal CDF evaluated at d1. As the option goes deeper in the money (d1 → ∞), delta approaches 1 (the option behaves like the stock). As it goes deeper out of the money (d1 → −∞), delta approaches 0 (the option is almost worthless). Delta traces out the sigmoid curve of the normal CDF — the same curve that appears in logistic regression as the link function.
4.2 Gamma: The Curvature
Gamma measures how fast delta changes. It is highest for at-the-money options near expiration, when small moves in the stock can flip the option from worthless to valuable.
where φ is the standard normal PDF. Gamma is always positive for both calls and puts. High gamma means the option's delta is changing rapidly — the position is becoming more or less sensitive to the underlying price.
4.3 Theta: Time Decay
Theta measures how much value the option loses as time passes, all else equal. Options are wasting assets — they lose value every day due to the decreasing time until expiration. The rate of decay accelerates as expiration approaches.
Time decay is not linear. An option with 30 days to expiration loses value slowly. The same option with 5 days to expiration loses value rapidly. Theta scales approximately as 1/√T, meaning the last few days see the steepest decay. If you are long options, this time decay drag is a constant cost you bear. If you are short options, theta works in your favor — you earn "theta income" each day.
4.4 Vega: Sensitivity to Volatility
Vega measures sensitivity to volatility. Since volatility is the key input to option pricing, vega is arguably the most economically important Greek for traders:
Vega is always positive for both calls and puts: higher volatility increases option values because it increases the probability of large moves, which benefits the option holder (due to the truncated payoff).
There is a deep relationship between the Greeks: the Black-Scholes PDE states that Θ + (1/2)σ²S²Γ + rSΔ = rV. This means theta, gamma, and delta are not independent — they are connected through a partial differential equation. If you know any two, you can derive the third. This is analogous to constraints in a statistical model that reduce the number of free parameters.
5. Implied Volatility
All inputs to Black-Scholes are directly observable (stock price, strike, time to expiration, risk-free rate) except one: volatility (σ). The implied volatility is the value of σ that makes the Black-Scholes price equal to the observed market price:
Finding implied volatility is an inverse problem: given the output (market price) and the model (Black-Scholes), find the parameter (σ) that produces that output. There is no closed-form solution, so we use numerical methods (Newton-Raphson, bisection). This is exactly like solving a maximum likelihood equation: find the parameter that makes the model best fit the observed data. The gradient needed for Newton-Raphson is vega — the sensitivity of price to volatility.
5.1 Why Implied Volatility Matters
Implied volatility has become the market's preferred way of quoting option prices. Instead of saying an option costs $5.30, traders say the implied vol is 25%. This has several advantages:
- Comparability: Implied vol normalizes for strike, maturity, and underlying price, making options on different stocks comparable.
- Forward-looking: Unlike historical volatility (computed from past returns), implied vol reflects the market's expectation of future volatility.
- Market sentiment: High implied vol signals fear or uncertainty; low implied vol signals complacency.
The VIX index (often called the "fear gauge") is a weighted average of implied volatilities on S&P 500 options. A VIX of 20 means the market expects the S&P 500 to move ±20%/√12 ≈ ±5.8% over the next month (annualized to a monthly number). The VIX typically spikes during market crashes and falls during calm periods.
6. The Volatility Smile and Skew
If Black-Scholes were perfectly correct, implied volatility would be the same for all strikes and maturities. In reality, it is not. When you plot implied volatility against strike price, you see a distinctive pattern:
6.1 The Volatility Smile
For short-dated options (especially on currencies and indices), implied vol is higher for both deep out-of-the-money calls and puts than for at-the-money options. This creates a U-shaped curve — the volatility smile.
6.2 The Volatility Skew
For equity index options (like S&P 500), the pattern is typically a skew: implied vol is higher for low strikes (OTM puts) and lower for high strikes (OTM calls). This creates a downward-sloping curve rather than a symmetric smile.
The volatility smile/skew tells us the market rejects the log-normal assumption. Higher implied vol at low strikes means the market assigns more probability to large downward moves than a normal distribution would predict — fat left tails. Higher implied vol at high strikes means fat right tails. The smile is the market's way of encoding its true distributional beliefs into the Black-Scholes framework, which only has one free parameter (σ). The smile is a misspecification diagnostic — if the model were correct, the smile would be flat.
| Pattern | Where Observed | What It Reveals |
|---|---|---|
| Symmetric smile | Currency options | Fat tails in both directions; kurtosis > 3 |
| Left skew (smirk) | Equity index options | Left tail fear (crash risk); negative skewness |
| Right skew | Some commodity options | Supply shock risk; positive skewness |
| Flat | Theoretical (BS world) | Log-normal distribution holds perfectly |
The volatility skew became much more pronounced after the 1987 crash ("Black Monday"), when the S&P 500 fell 22% in a single day. Before 1987, the smile was relatively flat. After 1987, the market permanently "remembered" that extreme left-tail events are more likely than normal distributions predict. The skew is a scar from a tail event that permanently updated the market's prior distribution.
7. Put-Call Parity
Put-call parity is one of the most elegant results in finance. It states:
or equivalently:
This is not a model — it is an arbitrage identity that must hold regardless of which option pricing model you use. It says that a call plus cash equals a put plus stock.
Put-call parity is a constraint equation. It reduces the number of free parameters: if you know the call price, stock price, and interest rate, the put price is determined (and vice versa). This is analogous to a linear constraint in estimation — like knowing that probabilities must sum to one, which means you only need to estimate k−1 probabilities for a k-category distribution.
7.1 Proof by No-Arbitrage
Consider two portfolios at time 0:
- Portfolio A: Buy a call + invest K e−rT in the risk-free asset
- Portfolio B: Buy a put + buy one share of stock
At expiration T:
| Scenario | Portfolio A value | Portfolio B value |
|---|---|---|
| ST > K | (ST − K) + K = ST | 0 + ST = ST |
| ST ≤ K | 0 + K = K | (K − ST) + ST = K |
Both portfolios have identical payoffs in every state of the world. By no-arbitrage, they must have the same price today. Therefore: C + K e−rT = P + S0.
Put-call parity only holds exactly for European options (exercisable only at expiration). For American options (exercisable any time before expiration), parity becomes an inequality: S − K ≤ C − P ≤ S − K e−rT. The early exercise feature introduces additional value for American options, particularly for puts on non-dividend-paying stocks and calls on dividend-paying stocks.
8. Python: Black-Scholes Pricer, Greeks, and Payoffs
8.1 Black-Scholes Implementation
Pythonimport numpy as np from scipy.stats import norm from scipy.optimize import brentq class BlackScholes: """ Black-Scholes option pricer with Greeks computation. All formulas assume European options on non-dividend-paying stocks. """ def __init__(self, S, K, T, r, sigma): """ S : current stock price K : strike price T : time to expiration (years) r : risk-free rate (annualized) sigma : volatility (annualized) """ self.S = S self.K = K self.T = T self.r = r self.sigma = sigma # Precompute d1 and d2 self.d1 = (np.log(S / K) + (r + sigma**2 / 2) * T) / (sigma * np.sqrt(T)) self.d2 = self.d1 - sigma * np.sqrt(T) def call_price(self): return (self.S * norm.cdf(self.d1) - self.K * np.exp(-self.r * self.T) * norm.cdf(self.d2)) def put_price(self): return (self.K * np.exp(-self.r * self.T) * norm.cdf(-self.d2) - self.S * norm.cdf(-self.d1)) def delta(self, option_type='call'): if option_type == 'call': return norm.cdf(self.d1) return norm.cdf(self.d1) - 1 def gamma(self): return norm.pdf(self.d1) / (self.S * self.sigma * np.sqrt(self.T)) def theta(self, option_type='call'): # Per calendar day (divide by 365) term1 = -(self.S * norm.pdf(self.d1) * self.sigma) / (2 * np.sqrt(self.T)) if option_type == 'call': term2 = -self.r * self.K * np.exp(-self.r * self.T) * norm.cdf(self.d2) else: term2 = self.r * self.K * np.exp(-self.r * self.T) * norm.cdf(-self.d2) return (term1 + term2) / 365 def vega(self): # Per 1% change in volatility return self.S * norm.pdf(self.d1) * np.sqrt(self.T) / 100 def rho(self, option_type='call'): if option_type == 'call': return self.K * self.T * np.exp(-self.r * self.T) * norm.cdf(self.d2) / 100 return -self.K * self.T * np.exp(-self.r * self.T) * norm.cdf(-self.d2) / 100 # === Example: Price an option and compute all Greeks === bs = BlackScholes(S=100, K=100, T=0.25, r=0.05, sigma=0.20) print("=== ATM Option (S=100, K=100, T=3mo, vol=20%) ===") print(f" Call price: ${bs.call_price():.4f}") print(f" Put price: ${bs.put_price():.4f}") print(f" Call delta: {bs.delta('call'):.4f}") print(f" Put delta: {bs.delta('put'):.4f}") print(f" Gamma: {bs.gamma():.4f}") print(f" Theta (call): ${bs.theta('call'):.4f}/day") print(f" Vega: ${bs.vega():.4f} per 1% vol") print(f" Rho (call): ${bs.rho('call'):.4f} per 1% rate") # Verify put-call parity parity_lhs = bs.call_price() - bs.put_price() parity_rhs = bs.S - bs.K * np.exp(-bs.r * bs.T) print(f"\nPut-Call Parity Check:") print(f" C - P = {parity_lhs:.6f}") print(f" S - Ke^(-rT) = {parity_rhs:.6f}") print(f" Difference: {abs(parity_lhs - parity_rhs):.2e}")
8.2 Implied Volatility Solver
Pythondef implied_vol(market_price, S, K, T, r, option_type='call'): """ Find implied volatility using Brent's method (root finding). """ def objective(sigma): bs = BlackScholes(S, K, T, r, sigma) if option_type == 'call': return bs.call_price() - market_price return bs.put_price() - market_price # Brent's method: find sigma in [0.01, 5.0] where objective = 0 return brentq(objective, 0.01, 5.0) # Example: extract implied vol from market prices print("=== Implied Volatility Extraction ===") market_prices = { 90: 12.50, # Deep ITM call 95: 8.20, # ITM call 100: 4.80, # ATM call 105: 2.40, # OTM call 110: 1.00, # Deep OTM call } print(f"{'Strike':>8} {'Market Price':>14} {'Implied Vol':>13}") for strike, price in market_prices.items(): iv = implied_vol(price, S=100, K=strike, T=0.25, r=0.05) print(f" {strike:>5} ${price:>10.2f} {iv:>10.1%}") print("\nNote: if implied vol varies with strike, you're seeing") print("the volatility smile/skew -- evidence of non-lognormal tails.")
8.3 Payoff and Profit Diagrams
Pythonimport numpy as np def print_payoff_table(S_range, K, call_premium, put_premium): """ Display call and put payoff/profit at various stock prices. """ print(f"{'S_T':>6} {'Call Payoff':>13} {'Call Profit':>13} " f"{'Put Payoff':>12} {'Put Profit':>12}") print("-" * 60) for S in S_range: call_pay = max(S - K, 0) call_prof = call_pay - call_premium put_pay = max(K - S, 0) put_prof = put_pay - put_premium print(f"${S:>5.0f} ${call_pay:>10.2f} ${call_prof:>+10.2f} " f"${put_pay:>9.2f} ${put_prof:>+9.2f}") # ATM option at K=100 print("=== Payoff/Profit Table: K=100, Call=$4.80, Put=$3.56 ===") S_values = np.arange(80, 121, 5) print_payoff_table(S_values, K=100, call_premium=4.80, put_premium=3.56) print("\nBreakeven (call): S_T = K + premium = 100 + 4.80 = 104.80") print("Breakeven (put): S_T = K - premium = 100 - 3.56 = 96.44") print("Max loss (buyer): limited to premium paid") print("Max gain (call): unlimited") print("Max gain (put): K - premium = 96.44 (if stock goes to 0)")
8.4 Greeks Across Strike Prices
Python# Show how Greeks vary across strike prices for a fixed option print("=== Call Greeks Across Strikes (S=100, T=0.25, vol=20%) ===") print(f"{'Strike':>8} {'Price':>8} {'Delta':>8} {'Gamma':>8} " f"{'Theta':>8} {'Vega':>8}") print("-" * 50) for K in range(80, 121, 5): bs = BlackScholes(S=100, K=K, T=0.25, r=0.05, sigma=0.20) print(f" {K:>5} ${bs.call_price():>6.2f} {bs.delta('call'):>.4f} " f" {bs.gamma():>.4f} {bs.theta('call'):>+.4f} {bs.vega():>.4f}")
9. Summary
This module has covered the statistical foundations of options and derivatives:
| Finance Concept | Statistical / Mathematical Analogue |
|---|---|
| Derivative payoff g(S) | Function of a random variable; E[g(X)] computation |
| Call payoff max(S-K, 0) | Truncated random variable (positive part) |
| Put payoff max(K-S, 0) | Mirror truncation (negative part) |
| Black-Scholes formula | Discounted expectation under risk-neutral measure using normal CDF |
| d2 in Black-Scholes | z-score: standardized log-moneyness |
| Delta = N(d1) | Normal CDF: the sigmoid / logistic link function |
| Greeks | Partial derivatives (sensitivity analysis) |
| Implied volatility | Inverse problem: find parameter from observation (like MLE) |
| Volatility smile | Model misspecification diagnostic (non-constant residual variance) |
| Put-call parity | Constraint equation reducing free parameters |
In the next module, we leave the world of pure financial instruments and enter the realm of physical assets: commodities, gold, and oil. We will see how supply and demand for real goods create unique pricing dynamics that differ fundamentally from stocks and bonds.