CRR 二叉树美式看跌期权定价
American Put Pricing on a CRR Binomial Tree
开始编码基于 Cox-Ross-Rubinstein 二叉树的美式看跌期权,是 quant 桌上「逐节点决定是行权还是继续持有」的标准练习。和欧式看跌不同,持有人可以在任意节点行权,所以单纯对贴现期望连续价值做倒推是错的——每个非终端节点都必须比较 K - S_node 这个内在 payoff 与贴现的连续价值,取较大者。由此自然涌现出的早行权边界,正是 Black-Scholes 不能给出美式期权解析解的根本原因。
请实现 solution(S, K, r, sigma, N_steps) -> float:在到期时间 T = 1.0 上构建 N_steps 步的 CRR 二叉树,对每个非终端节点做带早行权检查的倒推,最终返回根节点现值(单个 float)。
树的机制。 取 dt = 1.0 / N_steps。上、下行因子为 u = exp(sigma * sqrt(dt)) 与 d = 1 / u;每期贴现 disc = exp(-r * dt);风险中性上行概率 p = (exp(r * dt) - d) / (u - d)。注意 r 与 sigma 都是「每期」值(不是年化),所以除了 dt 以外没有额外的时间缩放。这棵树是重组的:第 n 步有 n + 1 个不同节点,沿 i 次上行 + n - i 次下行到达的节点价格为 S * u**i * d**(n - i)。终端层(n = N_steps)用看跌 payoff 初始化:V[i] = max(K - S * u**i * d**(N_steps - i), 0),然后向根节点倒推。
带早行权检查的倒推。 对每个非终端步 n(从 N_steps - 1 倒到 0)和每个 i ∈ {0, ..., n},计算
返回根节点 V[0] 的现值(单个 float)。两种写法都行:递归 + (n, i) 上的 memoization;或迭代式自底向上,用一个长度为 N_steps + 1 的数组原地覆盖。两者都是 O(N_steps**2) 时间、O(N_steps) 空间。
例
solution(100.0, 100.0, 0.05, 0.20, 50) 返回 6.073727985724901:教科书级 ATM 美式看跌,每期 r=5%、每期 sigma=20%、CRR 五十步;早行权边界把价格抬到了对应欧式看跌价 5.5336 之上。注意 r 与 sigma 都是每期值——直接喂年化值会让结果按 N_steps 系数偏掉。
实践背景
只要 Black-Scholes 不够用——美式期权、含分红的标的、可赎回债券、做有限差分的对照基准——CRR 倒推就是 quant 桌的第一道防线。这个套路(叶子上放终端 payoff,每个节点取「内在价值与贴现连续价值的较大者」)几乎不用改就能推广到 Bermudan 行权时点表、Chooser/Shout 等奇异早行权规则、以及三叉/多叉树。生产级实现会再带一份多余 payoff 数组用于双向追踪、再加上对早行权边界的记录,但 O(N2) 的骨架与你这里要写的循环长得完全一样**。
约束条件
- 0 < S, K,二者均为有限浮点数;0 <= r(**每期**利率,**不是**年化)
- 0 < sigma(**每期**波动率,**不是**年化);到期时间 T 固定为 1.0(即一棵完整的树)
- 1 <= N_steps <= 200,整数(即 dt = 1 / N_steps,整棵树共 1 + 2 + ... + (N_steps + 1) = O(N_steps**2) 个节点)
- 实现必须是 O(N_steps**2) 时间、O(N_steps) 空间;朴素非重组的 O(2**N_steps) 在 N_steps = 200 处会超时
- 返回:单个 float(根节点现值);浮点容差 rel_tol = 1e-6、abs_tol = 1e-9
样例
Case 1 · ATM 1-period American put: typical desk benchmark
输入: [100,100,0.05,0.2,50]
期望: 6.073727985724901
教科书级 ATM 美式看跌:S=K=100,每期 r=5%、σ=20%,N_steps=50。注意 r 与 σ 都是「每期」值,dt=T/N=1/50。每个非终端节点都要做 max(K−S_node, 贴现的连续价值) 检查,N=50 时该价值约 6.0737。把 max 换成纯连续价值会得到欧式价 5.5336,差约 0.54。
Case 2 · deep ITM American put: early exercise dominates
输入: [60,100,0,0.2,50]
期望: 40.02261605220453
深度实值看跌(K=100 > S=60),但每期利率为零,所以提前行权与持有等价;价格约等于欧式价 40.023。把这题与下一道 r=5% 的深 ITM 对比就能体会:r 为零时美式≈欧式;r>0 时美式严格大于欧式。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · ATM 1-period American put: typical desk benchmark
输入: [100,100,0.05,0.2,50]
期望: 6.073727985724901
教科书级 ATM 美式看跌:S=K=100,每期 r=5%、σ=20%,N_steps=50。注意 r 与 σ 都是「每期」值,dt=T/N=1/50。每个非终端节点都要做 max(K−S_node, 贴现的连续价值) 检查,N=50 时该价值约 6.0737。把 max 换成纯连续价值会得到欧式价 5.5336,差约 0.54。
Case 2 · deep ITM American put: early exercise dominates
输入: [60,100,0,0.2,50]
期望: 40.02261605220453
深度实值看跌(K=100 > S=60),但每期利率为零,所以提前行权与持有等价;价格约等于欧式价 40.023。把这题与下一道 r=5% 的深 ITM 对比就能体会:r 为零时美式≈欧式;r>0 时美式严格大于欧式。