1. Cox-Ross-Rubinstein (CRR) Binomial Parameterization
To model asset price evolution over discrete time increments $\Delta t = T / N$, the Cox-Ross-Rubinstein lattice calibrates up factor $u$ and down factor $d$ to match continuous-time log-normal variance $\sigma^2$:
$$u = e^{\sigma \sqrt{\Delta t}}, \qquad d = e^{-\sigma \sqrt{\Delta t}} = \frac{1}{u}$$The Risk-Neutral Probability $p$ of an upward price step is unique and invariant to risk preferences:
$$p = \frac{e^{(r - q) \Delta t} - d}{u - d}$$2. Backward Induction & American Early Exercise
At terminal node $(N, j)$, derivative payoffs are known. Moving backward to node $(n, j)$, the continuation value $V_{n,j}^{\text{cont}}$ is discounted under measure $\mathbb{Q}$:
$$V_{n,j}^{\text{cont}} = e^{-r \Delta t} \left[ p V_{n+1, j+1} + (1 - p) V_{n+1, j} \right]$$For American Options, the holder evaluates optimal early exercise against continuation value at every node:
$$V_{n,j}^{\text{American}} = \max \left( \Phi(S_{n,j}), \, V_{n,j}^{\text{cont}} \right)$$3. Python Numerical Pricing: American Put Binomial Lattice
import numpy as np
def price_american_put_binomial(S0=100.0, K=100.0, r=0.05, sigma=0.20, T=1.0, N=100):
"""
Price American Put option using N-step Cox-Ross-Rubinstein binomial tree.
"""
dt = T / N
u = np.exp(sigma * np.sqrt(dt))
d = 1.0 / u
p = (np.exp(r * dt) - d) / (u - d)
df = np.exp(-r * dt)
# Terminal stock prices at step N
j = np.arange(N + 1)
S_T = S0 * (u**(N - j)) * (d**j)
V = np.maximum(K - S_T, 0.0)
# Backward induction with early exercise check
for n in range(N - 1, -1, -1):
S_n = S0 * (u**(n - np.arange(n + 1))) * (d**np.arange(n + 1))
V_cont = df * (p * V[:-1] + (1.0 - p) * V[1:])
V = np.maximum(K - S_n, V_cont)
return round(V[0], 4)
if __name__ == "__main__":
put_val = price_american_put_binomial(S0=100.0, K=105.0, r=0.05, sigma=0.25, T=1.0, N=200)
print(f"American Put Option Lattice Price: ${put_val}")