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}")