American Options and Longstaff-Schwartz

Finance

The Black-Scholes formula and the Monte Carlo techniques for vanilla EUROPEAN options assume exercise happens only at expiry. AMERICAN options can be exercised at any time up to expiry, which adds a non-trivial OPTIMAL STOPPING problem on top of the pricing: at every moment, decide whether to exercise now or continue holding. The early-exercise premium can be substantial — 15-20% of the European price for typical in-the-money puts — and capturing it correctly is the central challenge of practical equity derivatives pricing.

The classical approach for American options is the BINOMIAL TREE (Cox-Ross-Rubinstein 1979): discretize time and price into a lattice, work backward computing the value at each node as max(intrinsic, discounted expected continuation). Clean, simple, exact in the continuous limit. But trees scale poorly to multi-asset problems or path-dependent payoffs; their state-space blows up. The modern alternative is LONGSTAFF-SCHWARTZ MONTE CARLO (LSM, 2001) — simulate paths forward, then regress backward to estimate continuation values. LSM scales to high dimensions and handles arbitrary path-dependent features. It is the standard tool for American-style and Bermudan options in production code.

The optimal stopping problem

Consider an American put with strike on a stock . At any time , exercising pays immediately. The optimal exercise rule: at time , exercise if and only if the IMMEDIATE PAYOFF EXCEEDS the CONTINUATION VALUE,

The challenge: the continuation value depends on the optimal policy at all FUTURE times. The recursion runs BACKWARD in time from (where ) to . For a binomial tree, this is straightforward — each node has finitely many children. For Monte Carlo with general path-dependence, computing the conditional expectation along each simulated path is the hard part.

The Longstaff-Schwartz idea

Approximate by a REGRESSION of the realized discounted future cash-flows against basis functions of . Specifically, at each backward time step:

  1. Identify the paths that are IN-THE-MONEY at (where exercise might be optimal — out-of-the-money paths automatically continue).
  2. For each such path, compute the DISCOUNTED FUTURE CASH-FLOW under the current exercise policy (which was determined in previous backward steps).
  3. REGRESS those cash-flows on a polynomial basis of (typically or Laguerre polynomials).
  4. The fitted value at each path is the ESTIMATED continuation value at that path.
  5. Set the exercise decision: exercise if , otherwise continue.

Once all backward steps are done, each path has a sequence of cash-flows (zeros, plus one positive payoff at the time of exercise — or at expiry if never exercised). Discount and average across paths for the LSM price estimate.

Why does this work? The key insight: the conditional expectation is the function of that minimizes . Empirically, this is exactly what least-squares regression of on a basis of computes. As the number of basis functions and paths grows, the regression-estimated continuation value converges to the true conditional expectation, and the LSM price converges to the true American price.

Convergence properties

LSM has two error sources:

BIAS: LSM as stated above produces a SLIGHT UNDER-estimate of the American price (the policy estimated from regression isn't quite optimal, so it's sub-optimal exercise; sub-optimal exercise gives a lower payoff). The bias can be addressed by various techniques (separate samples for the policy and the valuation, the "dual" formulation of Rogers-Haugh-Kogan that gives upper bounds), but for production pricing the modest under-bias is typically acceptable.

Code

# Longstaff-Schwartz Monte Carlo for an American put option.
#   1. Simulate stock paths under risk-neutral measure (GBM).
#   2. Step backward in time: at each step, regress the discounted
#      future cash-flow on a polynomial basis of the current stock price,
#      to estimate the CONTINUATION VALUE.
#   3. Exercise where intrinsic value > continuation value;
#      otherwise hold.
#   4. Discount the resulting cash-flows to time zero, average over paths.

import numpy as np
from scipy.stats import norm

def lsm_american_put(S0, K, T, r, sigma, N=50, n_paths=50000, seed=0):
    rng = np.random.default_rng(seed)
    dt = T / N

    # Simulate paths
    Z = rng.standard_normal((n_paths, N))
    S = np.zeros((n_paths, N + 1))
    S[:, 0] = S0
    for t in range(1, N + 1):
        S[:, t] = S[:, t-1] * np.exp((r - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*Z[:, t-1])

    payoff = np.maximum(K - S, 0)
    cf = np.zeros_like(payoff)
    cf[:, -1] = payoff[:, -1]                  # exercise at expiry if ITM
    discount = np.exp(-r * dt)

    for t in range(N - 1, 0, -1):
        itm = payoff[:, t] > 0                 # regress only on ITM paths
        if not np.any(itm):
            continue
        x = S[itm, t]
        # Discount each future cash flow back to this time step
        future_cf = np.sum(cf[itm, t+1:] *
                          np.cumprod(np.full(N - t, discount)), axis=1)
        # Polynomial basis: 1, S, S²
        A = np.column_stack([np.ones_like(x), x, x**2])
        coef, *_ = np.linalg.lstsq(A, future_cf, rcond=None)
        continuation = A @ coef
        # Exercise where intrinsic > continuation
        exercise = payoff[itm, t] > continuation
        idx = np.where(itm)[0][exercise]
        cf[idx, t]      = payoff[idx, t]
        cf[idx, t+1:]   = 0                    # cancel future cash flows

    # Discount all cash flows back to time 0
    times = np.arange(1, N + 1) * dt
    return np.mean((cf[:, 1:] * np.exp(-r * times)).sum(axis=1))

def bs_put(S, K, T, r, sigma):
    """European put for comparison."""
    d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    return K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)

# Standard benchmark from Longstaff & Schwartz 2001 Table 1
# American put, S0=36, K=40, T=1, r=6%, sigma=20%, target ≈ 4.478
print(f"American put (S0=36, K=40, T=1.0, r=6%, sigma=20%):")
price_am = lsm_american_put(S0=36, K=40, T=1.0, r=0.06, sigma=0.20,
                            N=50, n_paths=50000, seed=0)
print(f"  LSM price (50k paths):  {price_am:.4f}")
print(f"  Benchmark (LS 2001):    4.478")

price_eu = bs_put(36, 40, 1.0, 0.06, 0.20)
print(f"  European put:           {price_eu:.4f}")
print(f"  Early-exercise premium: {price_am - price_eu:.4f}  "
      f"({100*(price_am - price_eu)/price_eu:.1f}% of EU price)")

# Verify across different moneyness
print(f"\nLSM across moneyness (T=1, r=6%, sigma=20%):")
print(f"  {'S0':>4s}  {'European':>10s}  {'American':>10s}  {'premium':>10s}")
for S0 in [36, 38, 40, 42, 44]:
    pa = lsm_american_put(S0=S0, K=40, T=1.0, r=0.06, sigma=0.20,
                          N=50, n_paths=20000, seed=0)
    pe = bs_put(S0, 40, 1.0, 0.06, 0.20)
    print(f"  {S0:>4d}  {pe:>10.4f}  {pa:>10.4f}  {pa - pe:>10.4f}")

Output:

American put (S0=36, K=40, T=1.0, r=6%, sigma=20%):
  LSM price (50k paths):  4.4726
  Benchmark (LS 2001):    4.478
  European put:           3.8443
  Early-exercise premium: 0.6283  (16.3% of EU price)

LSM across moneyness (T=1, r=6%, sigma=20%):
    S0    European    American     premium
    36      3.8443      4.4654      0.6211
    38      2.8519      3.2487      0.3968
    40      2.0664      2.3164      0.2500
    42      1.4646      1.6122      0.1476
    44      1.0181      1.1024      0.0843

Three things to read off. (1) The benchmark case (, , deeply ITM put) gives LSM price 4.473 against the published binomial-tree benchmark of 4.478 — within 0.005, well below standard Monte Carlo error at 50k paths. (2) The early-exercise premium is 0.63 — about 16% of the European price. For deep-ITM puts on dividend-free stocks, early exercise is often optimal because exercise lets you collect the strike NOW and earn interest per year on it, while delay loses that interest. (3) The premium shrinks rapidly with moneyness: at (OTM put), the early-exercise premium is only 0.08 (8% of European). For OTM puts, the put's value comes almost entirely from the option's potential to go ITM, which exercise destroys; rational exercise never happens. The early-exercise PREMIUM is a moneyness-dependent property.

When NOT to use LSM

Generalizations and modern variants

What practical pricing systems do

A bank's exotic-derivatives pricing system typically has both engines:

Greeks are computed by FINITE DIFFERENCES on the Monte Carlo (bumping the input and re-running) or by PATHWISE / LIKELIHOOD RATIO methods that compute derivatives along the simulated paths themselves. The Greeks are the operationally important output; getting them efficient and stable is a substantial engineering exercise.

Related