Option Pricing & Delta Hedging under Black–Scholes
1. Asset Dynamics & Second-Order Taylor / Itô Expansion
Over a small time increment $\Delta t$, we model the underlying asset price $S_t$ via Geometric Brownian Motion with drift $\mu$ and volatility $\sigma$:
Because the random shock $\Delta W$ scales with $\sqrt{\Delta t}$, its square has expectation $\mathbb{E}[(\Delta W)^2] = \Delta t$ and variance of order $(\Delta t)^2$. Expanding a smooth option value $V(S, t)$ in a second-order Taylor series and retaining all terms of order $\Delta t$ yields Itô's Lemma:
2. Delta-Hedging Argument, Black–Scholes PDE & The Greeks
Consider a self-financing portfolio $\Pi = V(S,t) - \Delta S$ that is long one option and short $\Delta$ shares of the underlying stock. Over an infinitesimal step $dt$, the change in portfolio value is:
Differentiating $C(S,t)$ gives the closed-form sensitivities (Greeks) governing portfolio risk and discrete rebalancing error:
3. Risk-Neutral Monte Carlo Validation ($10^6$ Paths)
Because the Black–Scholes PDE is independent of $\mu$, the option price equals the discounted expected payoff under the risk-neutral dynamics $S_T = S_0 \exp\!\big((r - \frac{1}{2}\sigma^2)T + \sigma\sqrt{T}\,Z\big)$ with $Z \sim \mathcal{N}(0,1)$. Evaluating our benchmark European call ($S_0 = 100, K = 100, r = 0.05, \sigma = 0.20, T = 1.0$) across $M = 10^6$ Monte Carlo paths validates the analytic solution within standard error:
4. Discrete Delta-Hedging Simulation & $\mathcal{O}(N^{-1/2})$ Decay
In continuous time ($N \to \infty$), rebalancing $\Delta_t = \Phi(d_1)$ eliminates hedging error completely. In practice, a portfolio can only be rebalanced at $N$ discrete dates $t_k = k\Delta t$ ($\Delta t = T/N$). Over each step $\Delta t$, the unhedged second-order curvature ($\Gamma$) produces a local replication error:
Summing $N$ independent step errors of variance $\mathcal{O}((\Delta t)^2) = \mathcal{O}(N^{-2})$ implies that the total terminal hedging-error variance scales as $N \cdot \mathcal{O}(N^{-2}) = \mathcal{O}(N^{-1})$, so the standard deviation of the terminal hedging error decays as:
| Rebalances $N$ | Step Size $\Delta t$ | Hedging Error Std Dev (20,000 Paths) | Analytic $\mathcal{O}(N^{-1/2})$ Estimate |
|---|---|---|---|
| 4 | 0.2500 yr | 4.28 | 4.34 |
| 16 | 0.0625 yr | 2.18 | 2.17 |
| 64 | 0.0156 yr | 1.10 | 1.09 |
| 252 (Daily) | 0.0040 yr | 0.56 | 0.55 |
| Fitted Log–Log Slope (20,000 Paths) | −0.49 | −0.50 (Theoretical) | |
Python Implementation — Black–Scholes Greeks, $10^6$ Monte Carlo & Discrete Delta Hedging [Show / Hide Code]
import numpy as np
from scipy.stats import norm
def bs_call_and_delta(S: np.ndarray, K: float, r: float, sigma: float, tau: np.ndarray):
tau = np.maximum(tau, 1e-12)
d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * tau) / (sigma * np.sqrt(tau))
d2 = d1 - sigma * np.sqrt(tau)
price = S * norm.cdf(d1) - K * np.exp(-r * tau) * norm.cdf(d2)
delta = norm.cdf(d1)
return price, delta
def simulate_discrete_delta_hedge(S0=100.0, K=100.0, r=0.05, sigma=0.20, T=1.0,
N=64, M=20_000, seed=42) -> float:
rng = np.random.default_rng(seed)
dt = T / N
S = np.full(M, S0)
c0, delta = bs_call_and_delta(S, K, r, sigma, T)
cash = c0 - delta * S # self-financing initial bond position
for step in range(1, N + 1):
Z = rng.standard_normal(M)
S = S * np.exp((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z)
cash *= np.exp(r * dt)
if step < N:
_, new_delta = bs_call_and_delta(S, K, r, sigma, T - step * dt)
cash -= (new_delta - delta) * S
delta = new_delta
payoff = np.maximum(S - K, 0.0)
hedging_error = (delta * S + cash) - payoff
return float(np.std(hedging_error, ddof=1))