欧式期权有 Black-Scholes 封闭解,美式期权没有。原因很本质:美式期权可以在到期前任意时点行权,而”现在行权还是继续持有”是一个依赖未来的最优停止问题——你今天的决定取决于”如果我持有下去,未来能值多少”,而未来还没发生。这没有解析解。
结论先放这:Longstaff-Schwartz(2001) 的最小二乘蒙特卡洛(LSM)是给美式期权定价最通用、最接地气的引擎。它的思路极其 pragmatic——先模拟大量标的路径,然后从到期日倒着往回走,在每个行权日用最小二乘回归,用”当前标的价格 S”去估计”继续持有下去的价值”,只要”立即行权价值 > 继续持有价值”就在那条路径上提前行权。本文从零实现 LSM,画出提前行权边界与收敛曲线,并对照欧式价验证”美式价 ≥ 欧式价、提前行权溢价为正”。
和二叉树比,LSM 的最大卖点是维度:二叉树每多一个标的,网格节点数指数级膨胀,三个标的就基本跑不动;LSM 的路径数只随标的数线性增加,五六个标的的篮子期权照样能算。这也是为什么工业界给美式、百慕大、甚至带路径依赖的期权定价,几乎都首选 LSM 或其变体。

一、为什么美式没有 BS 公式#
欧式期权只需在到期日比较”行权价 vs 现货”,现金流确定,于是 BS 用无套利复制给出了封闭解。美式期权多了一个最优停止时间 :
对停止时间取,意味着你要对所有可能的行权时机找最优的那个——这在连续时间、多标的下没有封闭解。早期的办法是二叉树 / 有限差分,但那是维度灾难:标的一多(篮子期权、多资产雪球),网格立刻爆炸。
LSM 的聪明之处在于:蒙特卡洛天然支持高维和路径依赖,它把”最优停止”翻译成”在每个行权日做一次最小二乘回归”这样可计算的子问题。
换个角度理解:最优停止要求你”在不知道未来时决定现在”,而蒙特卡洛恰好给了你大量”已经发生的未来”——模拟出来的整条路径。于是你可以先看到每条路径最终值多少,再倒回去问”如果当时在某个价位行权,是不是比走到最后更划算”。回归做的就是这件”倒回去问”的事,且只对价内路径问,因为价外行权价值为 0、问了也是白问。
二、LSM 算法#
设定:标的服从 GBM, 个时间步, 条路径,行权价 ,无风险利率 。
第 1 步:模拟路径。 对每条路径 ,从 出发用 GBM 走到到期:
第 2 步:初始化现金流。 到期日 的 payoff 贴现到 :
第 3 步:从 倒推到 (核心)。 对每个行权日:
- 只看价内路径 (价外立即行权价值为 0,参与回归只会污染)
- 用基函数把未来的现金流对当前标的价格回归。本文用三次多项式(用 moneyness 提升数值条件): 在 上最小二乘拟合 对 ,得到系数 ,于是继续持有价值
- 计算立即行权价值(贴现到 e_t = (K-S_{j,t}),e^{-rt\Delta t}$
- 对路径 ,若 ,就提前行权:把 更新为
- 非价内、或不提前行权的路径,保留原来的(更晚行权/到期的)现金流
第 4 步:定价。 所有路径走完后,期权价格就是平均现金流:
直觉:倒推时,回归给出”持有下去大概值多少”,只要有路径”现在行权比持有更值钱”,这条路径就在当下 lock in 利润。这就是最优停止的近似解。
三、从零实现(Python)#
下面这段代码与配图完全一致,可直接跑(经典 LS 参数 ):
import numpy as np
S0, K, r, sigma, T = 36.0, 40.0, 0.06, 0.20, 1.0
M = 50
dt = T / M
def simulate_paths(n_paths, seed=20260711):
rng = np.random.default_rng(seed)
Z = rng.standard_normal((n_paths, M))
S = np.zeros((n_paths, M + 1)); S[:, 0] = S0
drift = (r - 0.5*sigma**2)*dt; vol = sigma*np.sqrt(dt)
for i in range(1, M + 1):
S[:, i] = S[:, i-1]*np.exp(drift + vol*Z[:, i-1])
return S
def basis(x):
return np.column_stack([np.ones_like(x), x, x**2, x**3])
def lsm_price(n_paths, seed=20260711):
S = simulate_paths(n_paths, seed)
CF = np.maximum(K - S[:, -1], 0.0) * np.exp(-r*T) # 到期 payoff,贴现到 t=0
for t in range(M - 1, 0, -1):
itm = S[:, t] < K
if not itm.any():
continue
x = S[itm, t] / K
X = basis(x)
beta, *_ = np.linalg.lstsq(X, CF[itm], rcond=None) # 回归:继续持有价值
cont = X @ beta
exercise_t0 = (K - S[itm, t]) * np.exp(-r*t*dt)
do_ex = itm.copy(); do_ex[itm] = exercise_t0 > cont
CF[do_ex] = (K - S[do_ex, t]) * np.exp(-r*t*dt) # 提前行权
return CF.mean()
# 欧式看跌 BS 价(下界参考)
from math import log, sqrt, exp, erf
d1 = (log(S0/K) + (r+0.5*sigma**2)*T)/(sigma*sqrt(T)); d2 = d1 - sigma*sqrt(T)
N = lambda z: 0.5*(1+erf(z/sqrt(2)))
eu_put = K*exp(-r*T)*N(-d2) - S0*N(-d1)
print(f"美式(LSM, 8万路径) = {lsm_price(80000):.4f}")
print(f"欧式(BS) = {eu_put:.4f} (美式≥欧式,提前行权溢价为正)")python跑出来:美式约 4.48,欧式约 3.84,提前行权溢价为正 ~0.64——这正是美式期权比欧式”贵”的那部分。
四、结果:提前行权边界与收敛性#
LSM 最有信息量的产物是提前行权边界 :在每个时点,股价高于某个临界值就不值得现在行权(持有更划算),低于它就该立刻行权。下图在某行权日把”继续持有价值”和”立即行权价值”画在一起,红色区域就是提前行权区:

把每个时点的临界股价 连起来,得到一条随时间下降/上升的边界。对美式看跌,规律很稳:越临近到期,临界股价越高——因为越晚行权,剩下的”等待期权”价值越小,你越愿意在更高一点的股价上就把利润 lock in:

最后是收敛性。LSM 价格随模拟路径数增加稳定收敛,且始终 ≥ 欧式价(无套利的下界约束被 LSM 天然满足):

五、真实陷阱(别拿 LSM 当黑箱)#
- 基函数选择:多项式阶数太低 → 拟合不足,提前行权边界歪;太高 → 过拟合 + 数值病态(高次项量级爆炸)。用 moneyness 而不是原始 做回归量是关键,必要时换 Legendre / 切比雪夫基。一般 3 次足够,超过 5 次要谨慎。
- 只在价内回归:价外路径的立即行权价值为 0,绝不该进回归样本,否则会把”0 现金流”当成信号污染 continuation 估计。
- 蒙特卡洛误差:每次模拟路径不同,价格有随机误差。严肃报告要带标准误,或用 对偶变量 / 控制变量 降方差,或用 LSM 的上下界(Andersen-Broadie)收窄置信区间。
- 高维扩展:LSM 对多标的美式(篮子期权)依然有效,但基函数要覆盖交叉项(如 ),维度上升后回归变难、需要更多路径。
- 利率与分红:模型用了常数 。若标的带股息率 ,漂移应改成 ;常数 假设在利率曲线陡峭时不成立,要用期限结构贴现。
- 边界是概率性的:LSM 用回归近似 continuation,边界不是硬阈值——深度价内可能过早、深度价外可能过晚行权,需要足够路径数才能让边界稳定。
结论#
LSM 把”最优停止”这个没有封闭解的问题,翻译成”每个行权日做一次最小二乘回归”这样朴素可算的子问题,是美式 / 百慕大 / 路径依赖期权最通用的定价引擎——它天然支持高维、天然满足”美式 ≥ 欧式”的无套利约束。记住它给的是估计值而非精确解:基函数形态和路径数量决定了精度,价外路径不能进回归,正式交付要带蒙特卡洛标准误。把它当成”用回归逼近最优停止”的工具,而不是能凭空给出精确美式价的神谕。
工程上还有两个常用增强:一是用对偶变量(antithetic variates)让正负扰动路径成对出现,方差能砍掉一大截;二是 Andersen-Broadie 上下界,用一组”嵌套”模拟给出价格的高估与低估,让你在交付前就能报告一个置信区间,而不是只给一个会随随机种子抖动点儿的数字。