量化交易中文教材

第 21a 章 数值方法之一:二叉树与三叉树

BSM 公式只给出了欧式期权的解析价格。实务中大量衍生品没有解析解:美式期权、带离散股息的期权、路径依赖期权、依赖多个标的的期权。原书第 21 章介绍三类基本数值方法来为它们估值:

方法 计算方向 擅长 不擅长
树(trees) 从到期日向后倒推 美式期权等需要在到期前做决策的衍生品 路径依赖;三个以上标的变量
蒙特卡洛模拟(Monte Carlo simulation) 从今天向前模拟 路径依赖收益;多个标的变量 提前行权
有限差分法(finite difference methods) 从到期日向后倒推 美式期权;与树同类的问题 路径依赖;高维

三种方法都能计算 delta、gamma、vega 等希腊字母。它们能处理实务中大多数估值问题;特殊情形需要第 27b 章的改进方法。

本教材把原书第 21 章拆成三章:本章(21a)讲树方法,21b 讲蒙特卡洛与方差缩减,21c 讲有限差分并比较三种方法。第 13 章已经讲过二叉树的原理(无套利、风险中性定价、CRR 参数),本章侧重于把树做成一个可用的数值引擎:通用的递推公式、从树上读出希腊字母、处理股息、提高精度和处理时变参数。

学习目标

  1. 从"匹配均值与方差"出发推导 CRR 参数 \(u=e^{\sigma\sqrt{\Delta t}}\)、\(d=1/u\)、\(p=(a-d)/(u-d)\),并会用 \(q\) 统一处理股指、外汇、期货。
  2. 能手算并编程实现美式期权的倒推,理解"实值并不意味着应该提前行权"。
  3. 会从一棵树上读出 delta、gamma、theta,知道 vega 和 rho 需要重建树。
  4. 掌握已知股息率和已知美元股息两种情形的建树方法,理解"股价减股息现值"法为什么能保持树重合。
  5. 会用控制变量技术改进美式期权估计,并知道它的局限。
  6. 了解等概率树、三叉树、自适应网格和时变参数树的构造。

读前导读

这一章在解决什么问题。 你在 CFA 里做过单步二叉树:股价一步涨到 \(Su\) 或跌到 \(Sd\),用风险中性概率加权、按无风险利率贴现,就得到期权价格。本章把这个"单步"做成"多步",再把它变成一台能算美式期权的机器。为什么需要机器?BSM 公式只能给欧式期权定价;美式期权可以提前行权,持有人在每个时点都要做"现在行权还是继续等"的决定,这个决定依赖未来,没有封闭公式。二叉树的做法是:先把未来所有可能的股价路径画成一张网格,从到期日往回一格一格算,每一格都比较"立刻行权拿到的钱"和"继续持有的价值",取大者。这和公司金融里评估"等待期权"(实物期权)是同一个思路,只是做得更系统。

本章的第二个主题是"一棵树能给出什么"。你熟悉的 delta 是期权价格对股价的敏感度,久期是债券价格对收益率的敏感度,二者都是导数。树上已经算好了邻近股价下的期权价值,所以用"差值除以差值"就能近似出导数,不用重新算一遍。第三个主题是工程细节:股息、外汇、期货怎么统一处理,怎样减少误差,参数随时间变化怎么办。

需要先想起来的数学。

  • 指数函数的泰勒展开。 \(e^x\approx1+x+\frac12x^2\),\(x\) 越小越准。例:\(e^{0.02}=1.020201\),而 \(1+0.02+0.0002=1.0202\)。本章验证 CRR 参数时,就是把 \(u=e^{\sigma\sqrt{\Delta t}}\) 展开到 \(\Delta t\) 这一阶,再比较两边。见 第 00 册第 02 章 导数与泰勒展开。
  • 大 O 记号。 \(O(\Delta t^2)\) 读作"量级与 \(\Delta t^2\) 相当的误差项"。当 \(\Delta t=0.01\) 时,\(\Delta t^2=0.0001\),比 \(\Delta t\) 小两个数量级,所以可以忽略。\(O(N^2)\) 用在计算量上,意思是"步数翻倍,计算量约翻四倍"。见 第 00 册第 07 章 概率中的分析工具。
  • 用差商近似导数。 导数 \(f'(S)\) 可以用 \(\frac{f(S+h)-f(S-h)}{2h}\) 近似;二阶导数(gamma)是"一阶导数的变化率",用两个一阶差商再做一次差商。例:\(f(S)=S^2\) 在 \(S=10\),取 \(h=1\),\((121-81)/2=20\),正好等于 \(2S\)。见 第 00 册第 02 章。
  • 方差的平移不变性。 \(\mathrm{Var}(X+c)=\mathrm{Var}(X)\),\(\mathrm{Var}(X)=E[X^2]-(E[X])^2\)。这两条你在 CFA 统计里都见过,本章推导方差条件时直接使用。
  • 远期利率。 由两个即期利率推出一段未来区间的利率,CFA 固定收益里学过。21.5 节把同样的想法用到股息率和方差率上。

怎么读这一章。 21.1 节是核心,必须读透:参数推导、例 21.1 的手算、代数递推、从树上读希腊字母。建议拿纸笔把例 21.1 的节点 A、B 算一遍,体会"同样实值、一个该行权一个不该"。21.2 节很短,记住那张 \(q\) 的对照表即可。21.3 节的"股价减股息现值"法和控制变量技术是实务常用的,值得读。21.4 节的三叉树推导和 21.5 节的时变参数第一次可以只看结论。最后的"量化实战"代码建议对照 21.1 节的公式逐行读,它几乎是公式的直接翻译。


21.1 二叉树

基本设定

把期权期限 \(T\) 分成 \(N\) 个长度为 \(\Delta t\) 的小区间。假设在每个小区间内,资产价格从 \(S\) 变为 \(Su\) 或 \(Sd\)(\(u>1\),\(d<1\)),上升概率为 \(p\),下降概率为 \(1-p\)(原书图 21.1)。

估值使用第 13 章的风险中性定价:

  1. 假设所有可交易资产的期望收益都等于无风险利率 \(r\);
  2. 衍生品的价值等于其收益期望值按无风险利率贴现。

BSM 与二叉树基于相同的假设。第 13 章附录证明了:步数趋于无穷时,二叉树的欧式期权价格收敛到 BSM 价格。所以对欧式期权二叉树并无必要;它的用武之地是美式期权(美式期权没有解析解,只有一些解析近似,如原书 Technical Note 8 的二次近似法)。

确定 \(p\)、\(u\)、\(d\)

参数的选取原则是:让 \(\Delta t\) 内资产价格变化的均值和方差与风险中性世界一致。

均值条件。资产提供收益率 \(q\) 时,风险中性世界中资本利得的期望收益率是 \(r-q\),所以区间末的期望价格为 \(Se^{(r-q)\Delta t}\):

\[e^{(r-q)\Delta t}=pu+(1-p)d\tag{21.1}\]

方差条件。令 \(R\) 为 \(\Delta t\) 内的百分比变化,\(1+R\) 以概率 \(p\) 取 \(u\)、以 \(1-p\) 取 \(d\)。加一个常数不改变方差,所以 \(R\) 的方差就是 \(1+R\) 的方差:

\[pu^2+(1-p)d^2-e^{2(r-q)\Delta t}=\sigma^2\Delta t\]

由 (21.1) 可得恒等式 \(e^{(r-q)\Delta t}(u+d)=pu^2+(1-p)d^2+ud\)(把 \(p u+(1-p)d\) 乘以 \(u+d\) 展开即可验证),代入得

\[e^{(r-q)\Delta t}(u+d)-ud-e^{2(r-q)\Delta t}=\sigma^2\Delta t\tag{21.2}\]

推导拆解:方差条件和 (21.2) 是怎么来的。 第一步,方差公式 \(\mathrm{Var}(X)=E[X^2]-(E[X])^2\) 用在 \(X=1+R\) 上:\(E[X^2]=pu^2+(1-p)d^2\),\(E[X]=e^{(r-q)\Delta t}\)(由均值条件 (21.1))。所以 \(\mathrm{Var}(1+R)=pu^2+(1-p)d^2-e^{2(r-q)\Delta t}\),令它等于 \(\sigma^2\Delta t\),就是上面第一个式子。这里把"\(\Delta t\) 内收益率的方差"设为 \(\sigma^2\Delta t\),和你熟悉的"年化波动率乘以 \(\sqrt{\text{时间}}\)"是同一件事。 第二步,恒等式:\((pu+(1-p)d)(u+d)=pu^2+pud+(1-p)du+(1-p)d^2=pu^2+(1-p)d^2+ud\)(中间两项合并成 \(ud\))。左边的 \(pu+(1-p)d\) 又等于 \(e^{(r-q)\Delta t}\)。 第三步,把恒等式移项得 \(pu^2+(1-p)d^2=e^{(r-q)\Delta t}(u+d)-ud\),代回方差式,\(p\) 就消掉了,得到只含 \(u,d\) 的 (21.2)。这一步的意义是:先用方差条件定 \(u,d\),再用均值条件定 \(p\)。

第三个条件。两个方程三个未知数,需要再加一个条件。Cox、Ross、Rubinstein(CRR,1979)取

\[u=1/d\tag{21.3}\]

忽略高于 \(\Delta t\) 阶的项,解为

\[p=\frac{a-d}{u-d}\tag{21.4}\]
\[u=e^{\sigma\sqrt{\Delta t}}\tag{21.5}\]
\[d=e^{-\sigma\sqrt{\Delta t}}\tag{21.6}\]
\[a=e^{(r-q)\Delta t}\tag{21.7}\]

\(a\) 称为增长因子(growth factor)。

验证:(21.4)(21.7) 精确满足 (21.1),(21.5)(21.6) 精确满足 (21.3)。对 (21.2),用展开 \(u\approx1+\sigma\sqrt{\Delta t}+\frac12\sigma^2\Delta t\),\(d\approx1-\sigma\sqrt{\Delta t}+\frac12\sigma^2\Delta t\),\(e^{(r-q)\Delta t}\approx1+(r-q)\Delta t\)。于是 \(u+d\approx2+\sigma^2\Delta t\),\(ud=1\),左边 \(\approx(1+(r-q)\Delta t)(2+\sigma^2\Delta t)-1-(1+2(r-q)\Delta t)=\sigma^2\Delta t+O(\Delta t^2)\),在 \(\Delta t\) 阶上成立。

推导拆解:这段验证在做什么。 \(u\) 的展开用的是 \(e^x\approx1+x+\frac12x^2\),取 \(x=\sigma\sqrt{\Delta t}\),于是 \(\frac12x^2=\frac12\sigma^2\Delta t\)。注意 \(\sqrt{\Delta t}\) 比 \(\Delta t\) 大得多(\(\Delta t=0.01\) 时 \(\sqrt{\Delta t}=0.1\)),所以展开到 \(x^2\) 才能保留全部 \(\Delta t\) 阶的项。 \(u+d\) 中 \(\pm\sigma\sqrt{\Delta t}\) 两项抵消,剩下 \(2+\sigma^2\Delta t\)。\(e^{2(r-q)\Delta t}\approx1+2(r-q)\Delta t\)。 把乘积展开:\((1+(r-q)\Delta t)(2+\sigma^2\Delta t)=2+\sigma^2\Delta t+2(r-q)\Delta t+(r-q)\sigma^2\Delta t^2\),减去 \(1\) 再减去 \(1+2(r-q)\Delta t\),只剩 \(\sigma^2\Delta t\) 和一个 \(\Delta t^2\) 项。 "在 \(\Delta t\) 阶上成立"的含义:误差是 \(\Delta t^2\) 量级,每步误差很小;步数越多(\(\Delta t\) 越小),这些误差累积起来也趋于零,所以树价格最终收敛。

资产价格树

在时刻 \(i\Delta t\),树上有 \(i+1\) 个节点,价格为

\[S_0u^jd^{i-j},\quad j=0,1,\dots,i\]

由于 \(u=1/d\),先升后降与先降后升回到同一价格,例如 \(j=2,i=3\) 时 \(S_0u^2d=S_0u\)。这样的树称为重合的(recombining)。重合性让节点数从 \(2^N\) 降到 \(O(N^2)\),这是树方法可用的关键。

倒推

从到期日 \(T\) 开始:看跌期权节点值为 \(\max(K-S_T,0)\),看涨为 \(\max(S_T-K,0)\)。往前每一步,节点值等于下一步两个节点值的风险中性期望,按 \(r\) 贴现 \(\Delta t\)。美式期权在每个节点还要比较提前行权的价值和继续持有的价值,取较大者。

例 21.1:美式看跌

5 个月期美式看跌,不付息股票,\(S_0=K=50\),\(r=10\%\),\(\sigma=40\%\),\(T=0.4167\),\(q=0\)。分 5 步,\(\Delta t=0.0833\):

\[u=e^{0.4\sqrt{0.0833}}=1.1224,\quad d=0.8909,\quad a=e^{0.1\times0.0833}=1.0084\]
\[p=\frac{1.0084-0.8909}{1.1224-0.8909}=0.5073,\quad1-p=0.4927\]

每步贴现因子 \(e^{-0.1\times0.0833}=0.9917\)(原书图 21.3)。

几个节点的计算:

  • 终值节点 G:股价 \(50\times0.8909^5=35.36\),期权值 \(50-35.36=14.64\)。
  • 节点 E(\(i=4\),股价 50):继续持有的价值为 \((0.5073\times0+0.4927\times5.45)\times0.9917=2.66\);行权价值为 0。取 2.66。
  • 节点 A(\(i=4,j=1\),股价 \(50\times1.1224\times0.8909^3=39.69\)):继续持有 \((0.5073\times5.45+0.4927\times14.64)\times0.9917=9.90\);行权 \(50-39.69=10.31>9.90\)。应提前行权,取 10.31。
  • 节点 B(\(i=2,j=0\),股价同为 39.69):行权价值 10.31,继续持有 \((0.5073\times6.38+0.4927\times14.64)\times0.9917=10.36\)。不应提前行权。

节点 A 和 B 股价相同、实值程度相同,但一个该行权、一个不该。原因是 B 距到期还有 3 步,股价回升的可能性带来的期权价值超过了提前拿到 \(K\) 的利息收益。实值并不总意味着应该提前行权。

金融直觉:为什么 A 该行权、B 不该。提前行权看跌期权,你今天就拿到 \(K-S\),并能把 \(K\) 存起来赚利息;代价是放弃了"股价继续下跌、看跌期权更值钱"的那部分时间价值。A 只剩 1 步,时间价值很小,利息收益占上风;B 还剩 3 步,股价还有不少下跌空间,时间价值大于利息。这和债券里的可赎回条款类似:发行人是否赎回,不只看当前利率低不低,还要看等下去利率会不会更低。

倒推到初始节点,期权价值为 4.49。实务中会用更多步:30、50、100、500 步分别得到 4.263、4.272、4.278、4.283。

代数表达

把上面的计算写成通用公式。期限分 \(N\) 段,节点 \((i,j)\) 表示时刻 \(i\Delta t\) 自下而上的第 \(j\) 个节点(\(0\le i\le N\),\(0\le j\le i\)),资产价格 \(S_0u^jd^{i-j}\),期权值 \(f_{i,j}\)。

终值条件:

\[f_{N,j}=\max(S_0u^jd^{N-j}-K,0)\ \ \text{(看涨)},\qquad f_{N,j}=\max(K-S_0u^jd^{N-j},0)\ \ \text{(看跌)}\]

递推:从 \((i,j)\) 以概率 \(p\) 到 \((i+1,j+1)\),以 \(1-p\) 到 \((i+1,j)\)。

  • 欧式:\(f_{i,j}=e^{-r\Delta t}[pf_{i+1,j+1}+(1-p)f_{i+1,j}]\)
  • 美式看涨:\(f_{i,j}=\max\{S_0u^jd^{i-j}-K,\ e^{-r\Delta t}[pf_{i+1,j+1}+(1-p)f_{i+1,j}]\}\)
  • 美式看跌:\(f_{i,j}=\max\{K-S_0u^jd^{i-j},\ e^{-r\Delta t}[pf_{i+1,j+1}+(1-p)f_{i+1,j}]\}\)

因为从 \(T\) 倒推,时刻 \(i\Delta t\) 的值不仅反映了在该时刻提前行权的可能,也反映了之后各时刻提前行权的可能——这就是动态规划。\(\Delta t\to0\) 时得到美式看跌的精确值;实务中 \(N=30\) 通常已给出合理结果。

白话解释:动态规划(dynamic programming)就是"把一个多期决策拆成很多个单期决策,从最后一期往前解"。站在节点 \((i,j)\) 时,你只需要知道下一步两个节点的价值,而那两个值已经包含了"之后每一步都按最优方式决定"的结果。所以每个节点只做一次比较,就等于考虑了所有未来的行权时点。如果从今天往后正向推,你需要列出所有路径上所有可能的行权时间组合,那是天文数字。 符号说明:\(f_{i,j}\) 的下标 \(i\) 是时间(第几步),\(j\) 是这一步里上升了几次。\(\Delta t\to0\) 读作"\(\Delta t\) 趋于 0",即步数无限加密的极限。

收敛特性:原书图 21.4 显示,例 21.1 的价格随步数增加呈振荡收敛——奇数步和偶数步交替偏高偏低。这是因为执行价相对于终值节点的位置随 \(N\) 周期性变化。实务中常把相邻两个 \(N\) 的结果平均,或用外推技术加速收敛。

复杂度:\(N\) 步树有 \((N+1)(N+2)/2=O(N^2)\) 个节点,计算量 \(O(N^2)\);倒推时只需保存一列,内存 \(O(N)\)。

从树上估计希腊字母

一棵树已经包含了邻近股价下的期权价值,因此 delta、gamma、theta 可以直接读出。

Delta。在时刻 \(\Delta t\),股价 \(S_0u\) 对应 \(f_{1,1}\),股价 \(S_0d\) 对应 \(f_{1,0}\):

\[\Delta=\frac{f_{1,1}-f_{1,0}}{S_0u-S_0d}\tag{21.8}\]

Gamma。在时刻 \(2\Delta t\) 有两个 delta 估计:在 \((S_0u^2+S_0)/2\) 处为 \((f_{2,2}-f_{2,1})/(S_0u^2-S_0)\),在 \((S_0+S_0d^2)/2\) 处为 \((f_{2,1}-f_{2,0})/(S_0-S_0d^2)\)。两点间距 \(h=0.5(S_0u^2-S_0d^2)\),gamma 为 delta 的变化除以 \(h\):

\[\Gamma=\frac{[(f_{2,2}-f_{2,1})/(S_0u^2-S_0)]-[(f_{2,1}-f_{2,0})/(S_0-S_0d^2)]}{h}\tag{21.9}\]

严格地说,(21.8) 是时刻 \(\Delta t\) 的 delta,(21.9) 是时刻 \(2\Delta t\) 的 gamma,实务中把它们当作时刻 0 的估计。若要更精确,可以从 \(-2\Delta t\) 开始建树,让 \(S_0\) 恰好位于 \(-2\Delta t\) 之后两步的中间节点,从而在时刻 0 得到三个股价下的期权价值。

推导拆解:gamma 公式是"差商的差商"。 第一步,在时刻 \(2\Delta t\) 有三个节点:\(S_0d^2\)、\(S_0\)、\(S_0u^2\)(中间那个是 \(S_0ud=S_0\))。相邻两点各算一个斜率,就得到两个 delta:上半段的 delta 代表股价在 \(S_0\) 与 \(S_0u^2\) 中点附近的斜率,下半段代表 \(S_0d^2\) 与 \(S_0\) 中点附近的斜率。 第二步,gamma 是 delta 对股价的变化率,所以用"两个 delta 之差 ÷ 两个中点之间的距离"。两个中点分别是 \((S_0u^2+S_0)/2\) 和 \((S_0+S_0d^2)/2\),相减正好是 \(h=0.5(S_0u^2-S_0d^2)\)。 这和你在固定收益里用"收益率上下各移 1bp 重算价格"来估计有效久期和有效凸性是同一套做法:久期对应 delta,凸性对应 gamma。区别只在于树上的"上下移动"是树自然给出的,不需要额外重算。

Theta。节点 \((0,0)\) 与 \((2,1)\) 股价相同(\(S_0ud=S_0\)),时间差 \(2\Delta t\):

\[\Theta=\frac{f_{2,1}-f_{0,0}}{2\Delta t}\tag{21.10}\]

Vega 和 rho。一棵树里波动率和利率是固定的,无法直接读出。做法是把波动率改变一个小量 \(\Delta\sigma\),保持步数不变重建树得到 \(f^*\),则 \(\mathcal V=(f^*-f)/\Delta\sigma\)。rho 类似。保持步数不变很重要:振荡误差与步数有关,步数相同时两次计算的误差大体抵消。

例 21.2:例 21.1 的希腊字母

  • \(f_{1,0}=6.96\),\(f_{1,1}=2.16\):\(\Delta=\dfrac{2.16-6.96}{56.12-44.55}=-0.41\)
  • 由节点 B、C、F:\(\Gamma=\dfrac{[(0.64-3.77)/(62.99-50.00)]-[(3.77-10.36)/(50.00-39.69)]}{11.65}=0.03\)
  • 由节点 D、C:\(\Theta=\dfrac{3.77-4.49}{0.1667}=-4.3\)(每年),即每日历日 \(-0.012\)

用 50 步时,DerivaGem 给出 delta \(-0.415\)、gamma 0.034、theta \(-0.0117\)(每日历日);改变参数重建树得 vega 0.123、rho \(-0.072\)。


21.2 股指、外汇和期货期权的树

股指、货币和期货都可以看作提供已知收益率 \(q\) 的资产,只需在 (21.7) 中正确解释 \(q\):

标的 \(q\) 取 增长因子 \(a\)
股指 成分股的股息率 \(e^{(r-q)\Delta t}\)
外汇 外国无风险利率 \(r_f\) \(e^{(r-r_f)\Delta t}\)
期货 本国无风险利率 \(r\) \(1\)

期货一行的道理是:建立期货头寸不需要成本,在风险中性世界里期货价格的期望增长率为零(第 18 章),所以 \(a=1\)。

例 21.3:美式指数期货看涨

4 个月期,\(F_0=K=300\),\(r=8\%\),\(\sigma=30\%\),\(T=0.3333\),4 步,\(\Delta t=0.0833\)。

\[a=1,\quad u=e^{0.3\sqrt{0.0833}}=1.0905,\quad d=0.9170,\quad p=\frac{1-d}{u-d}=0.4784\]

4 步树(原书图 21.5)估值 19.16;50 步 20.18,100 步 20.22。

例 21.4:美式英镑看跌

1 年期,\(S_0=1.61\),\(K=1.60\),\(r=8\%\),\(r_f=9\%\),\(\sigma=12\%\),4 步,\(\Delta t=0.25\)。

\[a=e^{(0.08-0.09)\times0.25}=0.9975,\quad u=1.0618,\quad d=0.9418,\quad p=0.4642\]

4 步估值 0.0710;50 步和 100 步均为 0.0738。


21.3 付息股票的二叉树

本节"股息"指除息日因股息导致的股价下降额。

已知股息率

对长期期权,常为方便起见假设股票支付已知的连续股息率 \(q\),完全按股指期权的方法处理。

更精确的做法是假设已知股息率离散支付。若期内只有一次除息,股息率 \(\delta\)(股息占股价的比例)已知:

  • \(u,d,p\) 按无股息情形计算;
  • 除息日之前的时刻 \(i\Delta t\),节点价格为 \(S_0u^jd^{i-j}\);
  • 除息日之后,节点价格为 \(S_0(1-\delta)u^jd^{i-j}\)(原书图 21.7)。

树仍然是重合的。多次除息时,令 \(\delta_i\) 为 0 到 \(i\Delta t\) 之间所有除息日的累计股息率,节点价格为 \(S_0(1-\delta_i)u^jd^{i-j}\)。

已知美元股息

期权期限较短时,假设已知股息金额更符合现实。但如果坚持股价波动率 \(\sigma\) 恒定,树会不重合(原书图 21.8):

设单次股息 \(D\),除息日 \(\tau\) 在 \(k\Delta t\) 与 \((k+1)\Delta t\) 之间。

  • \(i\le k\):节点为 \(S_0u^jd^{i-j}\),共 \(i+1\) 个;
  • \(i=k+1\):节点为 \(S_0u^jd^{i-j}-D\);
  • \(i=k+2\):从每个节点出发得到 \((S_0u^jd^{i-1-j}-D)u\) 和 \((S_0u^jd^{i-1-j}-D)d\)。以除息前价格 \(x\) 为例:先升后降得 \((xu-D)d=x-Dd\),先降后升得 \((xd-D)u=x-Du\),两者不等,树不再重合,节点数为 \(2i\) 而非 \(i+1\);
  • \(i=k+m\):节点数为 \(m(k+2)\),而非 \(k+m+1\)。

多次除息时节点数增长更快,计算很快变得不可行。

解决办法(与第 15b 章 15.12 节一致):把股价分成两部分——期权期内股息的现值(确定),以及其余的不确定部分 \(S^*\)。

  • 对于时刻 \(i\Delta t>\tau\):\(S^*=S\);
  • 对于时刻 \(i\Delta t\le\tau\):\(S^*=S-De^{-r(\tau-i\Delta t)}\)。

假设 \(S^*\) 的波动率 \(\sigma^*\) 恒定,用 \(\sigma^*\) 代替 \(\sigma\) 计算 \(p,u,d\),为 \(S^*\) 建一棵常规的重合树。然后在每个节点加上未来股息的现值,转回 \(S\) 的树:

\[S_{i,j}=\begin{cases}S_0^*u^jd^{i-j}+De^{-r(\tau-i\Delta t)}, & i\Delta t<\tau\\ S_0^*u^jd^{i-j}, & i\Delta t>\tau\end{cases}\]

这棵树重合,时刻 \(i\Delta t\) 有 \(i+1\) 个节点,可以直接推广到多次股息。

白话解释:问题的根源是"减法"和"乘法"不能交换顺序。树的每一步是乘以 \(u\) 或 \(d\);股息是减去一个固定金额 \(D\)。先减后乘时,\(D\) 被乘上了 \(u\) 或 \(d\),不同路径减掉的有效金额不一样,节点就对不齐。 解决办法是把股价拆成两块:一块是"确定会作为股息流出的现金"(它的现值随时间按无风险利率增长,与股价涨跌无关),另一块是"真正有风险的部分" \(S^*\)。只对 \(S^*\) 做乘法,树自然重合;确定部分在每个时点都是同一个数,加到同一列所有节点上不会破坏重合。 金融上,这相当于把股票看成"一笔已知现金流 + 一个无股息的风险资产",和你在估值里把企业价值拆成"确定现金流现值 + 有风险部分"是同一种思路。

这种处理还有一层一致性上的理由:美式期权必须与欧式期权使用同一个模型。否则,一个在任何情况下都不应提前行权的美式期权,其价格会与对应欧式期权不同,这是不合理的。BSM 对离散股息的标准处理正是"股价减股息现值",所以树也应如此。实务中分析师从市价隐含出的波动率本来就是 \(\sigma^*\),通常无须显式区分 \(\sigma\) 和 \(\sigma^*\)。

例 21.5

5 个月期美式看跌,期内一次股息 2.06 美元,除息日在 3.5 个月;\(S_0=52\),\(K=50\),\(r=10\%\),\(\sigma=40\%\)。

股息现值 \(2.06e^{-0.2917\times0.1}=2.00\),所以 \(S_0^*=52-2=50\)。若 40% 指 \(S^*\) 的波动率,那么 \(S^*\) 的树就是图 21.3 那棵树。在除息日之前的每个节点加上股息现值,得到原书图 21.9(概率仍为 0.5073 和 0.4927)。倒推得期权价格 4.44;50 步 4.202,100 步 4.212。

控制变量技术

树的误差主要来自离散化,而这部分误差对美式和欧式期权很相似。**控制变量技术(control variate technique)**利用这一点:

  1. 用同一棵树同时计算美式期权价值 \(f_A\) 和对应欧式期权价值 \(f_E\);
  2. 用 BSM 公式算出欧式期权的真值 \(f_{BSM}\);
  3. 假设树为欧式期权定价的误差 \(f_{BSM}-f_E\) 等于为美式期权定价的误差,则美式期权的改进估计为
\[f_A+(f_{BSM}-f_E)\]

例:把图 21.3 的期权当作欧式期权重算(原书图 21.10),\(f_E=4.32\);BSM 欧式真值 \(f_{BSM}=4.08\);美式 \(f_A=4.49\)。控制变量估计为

\[4.49+(4.08-4.32)=4.25\]

而 100 步的良好估计为 4.278。5 步树的原始估计误差约 0.21,控制变量后约 0.03,改进明显。

本质上,控制变量就是用树只计算美式与欧式价格之差(提前行权溢价),欧式部分交给解析公式。差值的离散误差通常比各自的误差小得多。

金融直觉:控制变量和对冲是同一个想法。你持有一个难以定价的头寸(美式期权的树价格,含误差),再"做空"一个与它误差高度相关、但真值已知的头寸(欧式期权的树价格),两者的误差相互抵消。公式 \(f_A+(f_{BSM}-f_E)\) 可以读成:树算出的美式价格,加上"树在欧式期权上少算了多少"的修正。修正有效的前提是两种误差高度正相关,就像对冲有效的前提是两个资产高度相关。21b 章的蒙特卡洛方差缩减里会再次见到同名的技术。

不过这个假设只是近似:本章"量化实战"会看到,对某些步数,控制变量的误差反而与原始误差相当甚至更大。


21.4 构造树的其他方法

等概率树

风险中性世界中,\(\Delta t\) 内 \(\ln S\) 变化的均值为 \((r-q-\sigma^2/2)\Delta t\),标准差为 \(\sigma\sqrt{\Delta t}\)。可以令 \(p=0.5\),

\[u=e^{(r-q-\sigma^2/2)\Delta t+\sigma\sqrt{\Delta t}},\qquad d=e^{(r-q-\sigma^2/2)\Delta t-\sigma\sqrt{\Delta t}}\]

验证:\(\ln S\) 的变化以各 0.5 的概率取 \((r-q-\sigma^2/2)\Delta t\pm\sigma\sqrt{\Delta t}\),均值和标准差都正确。

  • 优点:无论 \(\sigma\) 和步数如何,概率总是 0.5。CRR 树在时间步过大、以致 \(\sigma<|(r-q)\sqrt{\Delta t}|\) 时会出现负概率(\(a\) 落到 \([d,u]\) 之外),等概率树没有这个问题。
  • 缺点:树不再以初始股价为中心(\(ud\neq1\)),从树上计算 delta、gamma、theta 没有那么直接。

例 21.6:9 个月美式外币看涨,\(S_0=0.79\),\(K=0.795\),\(r=6\%\),\(r_f=10\%\),\(\sigma=4\%\),\(T=0.75\),3 步,\(\Delta t=0.25\),\(p=0.5\):

\[u=e^{(0.06-0.10-0.0008)\times0.25+0.04\sqrt{0.25}}=1.0098,\quad d=e^{(0.06-0.10-0.0008)\times0.25-0.02}=0.9703\]

(原书图 21.11)期权值 0.0026。

三叉树

每个节点有三个分支(原书图 21.12):上升、不变、下降,概率为 \(p_u,p_m,p_d\)。对股息率 \(q\) 的资产,匹配 \(\ln S\) 变化均值与标准差的参数为

\[u=e^{\sigma\sqrt{3\Delta t}},\qquad d=1/u\]
\[p_d=-\sqrt{\frac{\Delta t}{12\sigma^2}}\left(r-q-\frac{\sigma^2}{2}\right)+\frac16,\qquad p_m=\frac23,\qquad p_u=\sqrt{\frac{\Delta t}{12\sigma^2}}\left(r-q-\frac{\sigma^2}{2}\right)+\frac16\]

推导思路:令 \(\Delta x=\sigma\sqrt{3\Delta t}\),\(\nu=r-q-\sigma^2/2\)。三个条件为:概率和为 1;\(E[\Delta\ln S]=(p_u-p_d)\Delta x=\nu\Delta t\);\(E[(\Delta\ln S)^2]=(p_u+p_d)\Delta x^2\approx\sigma^2\Delta t\)(忽略 \(\nu^2\Delta t^2\))。由第三式 \(p_u+p_d=\sigma^2\Delta t/\Delta x^2=1/3\),故 \(p_m=2/3\);由第二式 \(p_u-p_d=\nu\Delta t/\Delta x=\nu\sqrt{\Delta t/(3\sigma^2)}\)。两式联立即得上面的 \(p_u,p_d\)。

推导拆解:把"联立"展开写出来。 第二式:\(\Delta\ln S\) 以 \(p_u\) 取 \(+\Delta x\)、\(p_m\) 取 0、\(p_d\) 取 \(-\Delta x\),期望是 \((p_u-p_d)\Delta x\)。令它等于 \(\nu\Delta t\),得 \(p_u-p_d=\nu\Delta t/(\sigma\sqrt{3\Delta t})=\nu\sqrt{\Delta t}/(\sigma\sqrt3)\)。 第三式:\((\Delta\ln S)^2\) 取 \(\Delta x^2\) 或 0,期望是 \((p_u+p_d)\Delta x^2=(p_u+p_d)\cdot3\sigma^2\Delta t\)。它应等于方差加均值平方,即 \(\sigma^2\Delta t+\nu^2\Delta t^2\),忽略高阶项后 \(p_u+p_d=1/3\)。这也解释了为什么选 \(\Delta x=\sigma\sqrt{3\Delta t}\):正是这个"3"让 \(p_m\) 成为整齐的 \(2/3\)。 联立:\(p_u=\frac12\left(\frac13+\frac{\nu\sqrt{\Delta t}}{\sigma\sqrt3}\right)=\frac16+\nu\sqrt{\frac{\Delta t}{12\sigma^2}}\)(因为 \(\frac{1}{2\sqrt3\,\sigma}=\sqrt{\frac{1}{12\sigma^2}}\)),\(p_d\) 同理取减号。

三叉树的倒推与二叉树类似:每个节点比较行权价值与继续持有价值 \(e^{-r\Delta t}(p_uf_u+p_mf_m+p_df_d)\)。21c 章将说明,三叉树等价于显式有限差分法。

自适应网格模型

Figlewski & Gao 提出自适应网格模型(adaptive mesh model):在低分辨率(大 \(\Delta t\))的树上嫁接高分辨率(小 \(\Delta t\))的树,只在需要的地方加密。对普通美式期权,最需要高分辨率的区域是到期前、执行价附近——那里期权价值的曲率最大,离散误差也最大。


21.5 时变参数

实务中 \(r\)、\(q\)、\(r_f\)、\(\sigma\) 往往随时间变化。在 \(t\) 到 \(t+\Delta t\) 之间,使用这些量的远期值(远期股息率、远期方差率的计算方式与远期利率相同;方差率是波动率的平方)。

时变利率与收益率

在 CRR 树中,时刻 \(t\) 的节点使用

\[a=e^{[f(t)-g(t)]\Delta t}\tag{21.11}\]

其中 \(f(t)\) 为 \(t\) 到 \(t+\Delta t\) 的远期利率,\(g(t)\) 为 \(q\)(或 \(r_f\))的远期值。\(u,d\) 不依赖 \(a\),所以树的几何形状不变,只有分支概率随时间变化:

\[p=\frac{e^{[f(t)-g(t)]\Delta t}-d}{u-d},\qquad1-p=\frac{u-e^{[f(t)-g(t)]\Delta t}}{u-d}\tag{21.12}\]

步数足够多时这些概率总是正的。\(t\) 到 \(t+\Delta t\) 的贴现使用 \(f(t)\)。

时变波动率

时变波动率要难一些,因为 \(u,d\) 依赖 \(\sigma\),波动率变化会破坏重合性。一种方法是让每一步的长度与该步的平均方差率成反比,从而使每一步的总方差相同、\(u,d\) 处处一样:

  1. 设 \(\sigma(t)\) 为期限 \(t\) 的期权定价所用的波动率,定义总方差 \(V=\sigma(T)^2T\);
  2. 令 \(t_i\) 为第 \(i\) 步的终点,选取 \(t_i\) 使 \(\sigma(t_i)^2t_i=iV/N\);
  3. 令 \(u=e^{\sqrt{V/N}}\),\(d=1/u\),\(p\) 按常数波动率公式计算。

这样时间步长不等,但每一步的方差都是 \(V/N\),树保持重合。这种方法可以与时变利率方法结合。

白话解释:可以把树的每一步理解为"消耗一份相同的方差预算",而不是"走过一段相同的日历时间"。波动率高的时段,一份方差预算很快用完,所以那一步很短;波动率低的时段,同样的方差要更长时间才累积到,那一步就长。\(\sigma(t)^2t\) 是"从今天到 \(t\) 累积的总方差",第 2 步条件要求累积方差在 \(N\) 个步点上等分。这和固定收益里"按久期而不是按日历时间来衡量风险暴露"的想法相近。


量化实战

本章内容在量化交易中的用途

  1. 美式期权定价引擎。个股期权(美股、港股的个股期权多为美式)、ETF 期权、商品期货期权的定价和隐含波动率反解,最常用的就是二叉树。一个可靠的实现需要:支持 \(q\)(股息率/外币利率/期货)、离散美元股息、提前行权、从树上读希腊字母。
  2. 隐含波动率反解。对美式期权反解隐含波动率时,需要在根求解器(如 Brent 法)的每次迭代中重建树。此时一定要固定步数,否则振荡误差会让价格对波动率不单调,求解器可能失败。
  3. 风险计算。delta、gamma、theta 从同一棵树读出,几乎零额外成本;vega、rho 需要扰动参数重建树。批量计算组合希腊字母时,这部分是主要开销。
  4. 数值稳健性。CRR 在大步长、低波动率、高利差时会出现负概率;等概率树和三叉树更稳健。生产系统应当检查概率是否在 \([0,1]\) 之内。

Python 示例:一个通用的 CRR 引擎

下面的函数实现了 21.1–21.3 节的全部内容:通用 \(q\)、美式/欧式、离散美元股息(股价减股息现值法)、从树上读 delta/gamma/theta。代码复算原书的例 21.1–21.5,比较控制变量的效果,并实现一个三叉树。

import numpy as np
from scipy.stats import norm

def crr(S0, K, T, r, sig, N, q=0.0, kind="put", american=True, div=None):
    """CRR 二叉树。div=(D, tau):单次美元股息,按"股价减股息现值"建树。
    返回 (价格, delta, gamma, theta)。"""
    dt = T / N
    u = np.exp(sig*np.sqrt(dt)); d = 1/u
    a = np.exp((r - q)*dt); p = (a - d)/(u - d); disc = np.exp(-r*dt)
    D, tau = div if div else (0.0, -1.0)
    Sstar0 = S0 - D*np.exp(-r*tau) if div else S0
    def spot(i):                                  # 时刻 i*dt 的全部节点股价
        j = np.arange(i+1)
        s = Sstar0 * u**j * d**(i-j)
        t = i*dt
        if div and t < tau:
            s = s + D*np.exp(-r*(tau - t))        # 加回未来股息现值
        return s
    pay = (lambda s: np.maximum(K - s, 0)) if kind == "put" else (lambda s: np.maximum(s - K, 0))
    f = pay(spot(N))
    keep = {}
    for i in range(N-1, -1, -1):
        f = disc*(p*f[1:] + (1-p)*f[:-1])
        if american:
            f = np.maximum(f, pay(spot(i)))      # 比较行权与继续持有
        if i <= 2:
            keep[i] = (spot(i), f.copy())
    s1, f1 = keep[1]; s2, f2 = keep[2]
    delta = (f1[1] - f1[0])/(s1[1] - s1[0])                       # (21.8)
    h = 0.5*(s2[2] - s2[0])
    gamma = ((f2[2]-f2[1])/(s2[2]-s2[1]) - (f2[1]-f2[0])/(s2[1]-s2[0]))/h   # (21.9)
    theta = (f2[1] - keep[0][1][0])/(2*dt)                        # (21.10)
    return keep[0][1][0], delta, gamma, theta

def bs_put(S, K, T, r, sig, q=0.0):
    d1 = (np.log(S/K)+(r-q+0.5*sig**2)*T)/(sig*np.sqrt(T)); d2 = d1-sig*np.sqrt(T)
    return K*np.exp(-r*T)*norm.cdf(-d2) - S*np.exp(-q*T)*norm.cdf(-d1)

# 例 21.1 / 21.2
args = dict(S0=50, K=50, T=5/12, r=0.10, sig=0.40)
v, de, ga, th = crr(**args, N=5)
print("例21.1  5步: 价格 %.2f  delta %.2f  gamma %.3f  theta %.2f/年" % (v, de, ga, th))
for N in (30, 50, 100, 500):
    print(f"   N={N:4d}: {crr(**args, N=N)[0]:.3f}")
v50 = crr(**args, N=50)
print("   N=50 希腊字母: delta %.3f gamma %.3f theta/天 %.4f" % (v50[1], v50[2], v50[3]/365))
b = crr(**args, N=50)[0]; up = crr(**{**args, "sig": 0.41}, N=50)[0]   # 同步数重建树
print("   vega (每1%%波动率) %.3f" % (up - b))

# 控制变量
fA = crr(**args, N=5)[0]
fE = crr(**args, N=5, american=False)[0]
fBS = bs_put(50, 50, 5/12, 0.10, 0.40)
print("\n控制变量  fA=%.2f fE=%.2f fBSM=%.2f  => %.2f" % (fA, fE, fBS, fA + fBS - fE))
true = 4.2842                                  # N=5000 左右的收敛值
for N in (5, 10, 25, 50, 100):
    a_ = crr(**args, N=N)[0]; e_ = crr(**args, N=N, american=False)[0]
    print(f"   N={N:3d}  原始 {a_:.4f} (误差 {a_-true:+.4f})   控制变量 {a_+fBS-e_:.4f} (误差 {a_+fBS-e_-true:+.4f})")

# 例 21.3 期货期权(q=r),例 21.4 外汇期权(q=rf),例 21.5 离散美元股息
print("\n例21.3  期货美式看涨:", [round(float(crr(300, 300, 1/3, 0.08, 0.30, N, q=0.08, kind="call")[0]), 2) for N in (4, 50, 100)])
print("例21.4  英镑美式看跌:", [round(float(crr(1.61, 1.60, 1.0, 0.08, 0.12, N, q=0.09)[0]), 4) for N in (4, 50, 100)])
print("例21.5  付息美式看跌:", [round(float(crr(52, 50, 5/12, 0.10, 0.40, N, div=(2.06, 3.5/12))[0]), 3) for N in (5, 50, 100)])

# 三叉树(u = exp(sig*sqrt(3dt)), pm = 2/3)
def trinomial(S0, K, T, r, sig, N, q=0.0, american=True):
    dt = T/N; dx = sig*np.sqrt(3*dt); nu = r - q - 0.5*sig**2
    pu = np.sqrt(dt/(12*sig**2))*nu + 1/6; pm = 2/3; pd = 1/6 - np.sqrt(dt/(12*sig**2))*nu
    disc = np.exp(-r*dt)
    S = lambda i: S0*np.exp(dx*np.arange(-i, i+1))
    f = np.maximum(K - S(N), 0)
    for i in range(N-1, -1, -1):
        f = disc*(pu*f[2:] + pm*f[1:-1] + pd*f[:-2])
        if american: f = np.maximum(f, K - S(i))
    return f[0]
print("\n三叉树 例21.1:", [round(float(trinomial(50, 50, 5/12, 0.10, 0.40, N)), 4) for N in (50, 100, 500)])

关键输出:

例21.1  5步: 价格 4.49  delta -0.41  gamma 0.034  theta -4.30/年
   N=  30: 4.263
   N=  50: 4.272
   N= 100: 4.278
   N= 500: 4.283
   N=50 希腊字母: delta -0.415 gamma 0.034 theta/天 -0.0117
   vega (每1%波动率) 0.123

控制变量  fA=4.49 fE=4.32 fBSM=4.08  => 4.25
   N=  5  原始 4.4885 (误差 +0.2043)   控制变量 4.2454 (误差 -0.0388)
   N= 10  原始 4.2201 (误差 -0.0641)   控制变量 4.3456 (误差 +0.0614)
   N= 25  原始 4.3282 (误差 +0.0440)   控制变量 4.2802 (误差 -0.0040)
   N= 50  原始 4.2720 (误差 -0.0122)   控制变量 4.2974 (误差 +0.0132)
   N=100  原始 4.2781 (误差 -0.0061)   控制变量 4.2908 (误差 +0.0066)

例21.3  期货美式看涨: [19.16, 20.18, 20.22]
例21.4  英镑美式看跌: [0.071, 0.0738, 0.0738]
例21.5  付息美式看跌: [4.44, 4.208, 4.214]

三叉树 例21.1: [4.2598, 4.2722, 4.2819]

读输出:

  • 例 21.1–21.4 的价格、50 步希腊字母和 vega 与原书完全一致。例 21.5 的 5 步结果 4.44 一致;50 步、100 步为 4.208、4.214,与原书(4.202、4.212)在第三位小数上略有差别,可能来自 DerivaGem 对除息日落在两步之间时的处理细节。
  • 控制变量在 \(N=5\) 和 \(N=25\)(奇数步)时把误差降了一个数量级,但在 \(N=10、50、100\)(偶数步)时误差与原始估计相当、符号相反。原因是平值期权的欧式和美式价格的振荡误差并不总是同号同幅。这提醒我们:控制变量的前提"两种期权的误差相同"是一个近似,用之前最好像这里一样做一次收敛性检查。
  • 三叉树在相同步数下的误差与二叉树同一量级,但收敛更平滑。

本章小结

树方法把期权期限切成 \(N\) 步,每步让资产价格乘以 \(u\) 或 \(d\),参数的选取使风险中性世界中每步价格变化的均值与方差正确。CRR 树取 \(u=e^{\sigma\sqrt{\Delta t}}\)、\(d=1/u\)、\(p=(a-d)/(u-d)\)、\(a=e^{(r-q)\Delta t}\),股指、外汇、期货只需把 \(q\) 分别解释为股息率、外国利率和本国利率。从到期日向后倒推,美式期权在每个节点取立即行权与继续持有的较大值;实值并不意味着应当提前行权。一棵树可直接读出 delta、gamma、theta,vega 和 rho 要在相同步数下扰动参数重建树。离散美元股息会破坏重合性,解决方法是对"股价减股息现值"建树再加回现值。控制变量技术用树只计算提前行权溢价,通常能显著提高精度,但不是每个步数都有效。等概率树避免负概率,三叉树收敛更平滑,自适应网格只在执行价附近加密,时变参数可用远期利率调整概率、用不等步长处理时变波动率。

概念/公式 内容
CRR 参数 \(u=e^{\sigma\sqrt{\Delta t}}\),\(d=1/u\),\(a=e^{(r-q)\Delta t}\),\(p=\dfrac{a-d}{u-d}\)
\(q\) 的解释 股指:股息率;外汇:\(r_f\);期货:\(r\)(\(a=1\))
美式递推 \(f_{i,j}=\max\{\text{行权值},\ e^{-r\Delta t}[pf_{i+1,j+1}+(1-p)f_{i+1,j}]\}\)
树上 delta \(\Delta=\dfrac{f_{1,1}-f_{1,0}}{S_0u-S_0d}\)
树上 gamma (21.9),用 \(2\Delta t\) 时三个节点
树上 theta \(\Theta=\dfrac{f_{2,1}-f_{0,0}}{2\Delta t}\)
离散美元股息 对 \(S^*=S-\text{PV(股息)}\) 建树,节点再加回股息现值
控制变量 \(f_A+(f_{BSM}-f_E)\)
等概率树 \(p=0.5\),\(u,d=e^{(r-q-\sigma^2/2)\Delta t\pm\sigma\sqrt{\Delta t}}\)
三叉树 \(u=e^{\sigma\sqrt{3\Delta t}}\),\(p_m=2/3\),\(p_{u,d}=\frac16\pm\sqrt{\frac{\Delta t}{12\sigma^2}}(r-q-\frac{\sigma^2}{2})\)
时变参数 \(a=e^{[f(t)-g(t)]\Delta t}\);时变波动率用 \(\sigma(t_i)^2t_i=iV/N\) 定步长
复杂度 节点数 \(O(N^2)\),计算量 \(O(N^2)\)

练习

基础

  1. 一棵二叉树能直接估计哪些希腊字母?哪些需要重建树?为什么重建时要保持步数不变? 提示:delta、gamma、theta 可直接读出;vega、rho 需要扰动参数重建树。保持步数不变是为了让两次计算的离散误差大致抵消(原书习题 21.1)。

  2. 手算:不付息股票美式看跌,\(S_0=60\),\(K=60\),\(r=10\%\),\(\sigma=45\%\),\(T=3\) 个月,3 步(每步 1 个月)。求期权价格。 提示:\(u=e^{0.45\sqrt{1/12}}=1.1387\),\(d=0.8782\),\(p=(e^{0.1/12}-d)/(u-d)\approx0.4997\);逐节点比较行权与继续持有,结果约 5.16。用本章 crr 函数核对(原书习题 21.2 类型)。

  3. 例 21.3 中为什么期货的增长因子 \(a=1\)?如果把同样的参数用于一个以期货价格 300 为标的价格、但 \(q=0\) 的"股票",美式看涨价格会怎样变化? 提示:风险中性下期货价格期望增长率为零;\(q=0\) 的不付息股票美式看涨不会提前行权,价格等于欧式 BSM 价格(大于期货期权)。

  4. 写出 CRR 树出现负概率的条件。 提示:\(p<0\) 要求 \(a<d\),\(p>1\) 要求 \(a>u\)。即 \(|(r-q)\Delta t|>\sigma\sqrt{\Delta t}\)(一阶近似),也就是 \(\sigma<|(r-q)\sqrt{\Delta t}|\)(原书习题 21.7)。

  5. 解释为什么离散美元股息会让 CRR 树不重合,而对 \(S^*\) 建树能恢复重合。 提示:除息后节点为 \((x-D)\),再乘 \(u\) 或 \(d\) 时 \(D\) 被放大不同倍数;\(S^*\) 的树是纯乘法的,加上的股息现值只依赖时间不依赖节点(原书习题 21.6)。

进阶

  1. 能否用二叉树为"到期股价超过 0 到 \(T\) 期间平均股价的部分"这种收益的期权定价?为什么? 提示:收益依赖整条路径的平均值,重合树的节点丢失了路径信息;需要在节点上增加状态变量(第 27b 章)或改用蒙特卡洛(原书习题 21.5)。

  2. 验证等概率树的 \(u,d\) 在 \(\Delta t\) 阶上使 \(S\)(而不只是 \(\ln S\))的均值正确:证明 \(0.5u+0.5d=e^{(r-q)\Delta t}+O(\Delta t^2)\)。再按"量化实战"代码的风格实现等概率树,为例 21.6 定价。 提示:\(0.5(u+d)=e^{(r-q-\sigma^2/2)\Delta t}\cosh(\sigma\sqrt{\Delta t})\approx e^{(r-q-\sigma^2/2)\Delta t}(1+\sigma^2\Delta t/2)\);例 21.6 的 3 步结果应为 0.0026(原书习题 21.29)。

  3. 用本章 crr 函数,对例 21.1 比较 \(N\) 与 \(N+1\) 结果的平均值和单独的 \(N\) 步结果,看平均能否抑制振荡。再把控制变量与"相邻步数平均"结合,观察误差。 提示:振荡误差在奇偶步之间交替,平均可以抵消大部分(原书习题 21.30 的思路)。

  4. 用 21.5 节的方法构造时变波动率树:设 \(\sigma(t)\) 从 0.2(\(t\to0\))线性上升到 0.3(\(t=1\)),即期限 \(t\) 的期权使用 \(\sigma(t)=0.2+0.1t\)。求 10 步树的各步终点 \(t_i\),并为 1 年期平值欧式看涨定价,与用 \(\sigma(1)=0.3\) 的 BSM 价格比较。 提示:\(V=0.09\),解 \((0.2+0.1t_i)^2t_i=0.009i\);由于 \(u=e^{\sqrt{V/N}}\) 只依赖总方差,欧式期权价格应接近 BSM(\(\sigma=0.3\))的价格;但要注意 \(p\) 中 \(\Delta t\) 应取每步的实际长度。

  5. 美国铜期货价格的期限结构给出各期限的期货价格。解释为什么可以用"期货价格 = 风险中性期望价格"来设定每一步的增长因子,并说明这如何对应 21.5 节的时变参数思想。 提示:\(a_i=F(t_{i+1})/F(t_i)\),概率按 (21.12) 的形式随时间变化,树的几何不变(原书习题 21.19、21.20)。

原书推荐习题:21.2、21.10(手算美式看跌二叉树,熟悉倒推与提前行权判断);21.12、21.27(离散美元股息的树构造);21.13、21.26(控制变量技术);21.19、21.20(由期货期限结构构造非恒定增长率的树);21.29(从矩匹配角度推导树参数);21.30(编程研究收敛性、控制变量与隐含波动率反解)。此外 21.4、21.11(玉米、小麦期货美式看涨)、21.14、21.33(指数美式看跌与希腊字母)、21.25(瑞郎美式看跌)、21.31、21.32(例 21.3、21.4 的延伸)可作为额外练手。


原书对照

本章小节 原书章节 PDF 页码
章首导言 Chapter 21 introduction p.473
21.1 二叉树 21.1 Binomial Trees(例 21.1、21.2,图 21.1–21.4) p.473–481
21.2 股指、外汇、期货 21.2 Using the Binomial Tree for Options on Indices, Currencies, and Futures Contracts(例 21.3、21.4) p.481–483
21.3 付息股票 21.3 Binomial Model for a Dividend-Paying Stock(例 21.5,控制变量技术) p.483–488
21.4 其他构造方法 21.4 Alternative Procedures for Constructing Trees(例 21.6,三叉树,自适应网格) p.488–491
21.5 时变参数 21.5 Time-Dependent Parameters p.491–492
习题 Practice Questions 21.1–21.33 中与树相关的部分 p.513–516

蒙特卡洛模拟(21.6–21.7 节)见第 21b 章,有限差分法(21.8 节)与本章小结见第 21c 章。延伸阅读:Cox, Ross & Rubinstein (1979);Figlewski & Gao (1999) 自适应网格;Hull & White (1988) 控制变量在数值方法中的应用;Rendleman & Bartter (1979);Clewlow & Strickland《Implementing Derivatives Models》。