量化交易中文教材

第 27b 章 数值方法补充:可转债、路径依赖、障碍、多资产与美式蒙特卡洛

第 21a–21c 章介绍了二叉树、三叉树、蒙特卡洛和有限差分三类基本数值方法。它们各有所长:树和有限差分擅长处理提前行权,蒙特卡洛擅长处理路径依赖和多个随机变量。真实的产品往往同时具有好几种特征:可转债既有提前转换又有发行人赎回还有信用风险;美式亚式期权既路径依赖又可提前行权;百慕大互换期权既有提前行权又依赖整条曲线。本章介绍把这些方法推广到复杂产品的五种技术:

  1. 在二叉树中加入违约分支给可转债定价;
  2. 在树的每个节点为路径函数选代表值并插值,处理路径依赖;
  3. 让树的节点落在障碍上,解决障碍期权收敛慢的问题;
  4. 为两个相关资产建树的三种方法;
  5. 用最小二乘回归或行权边界参数化让蒙特卡洛处理美式期权。

这些技术在今天的定价库中依然是标准做法,尤其是第 5 种(Longstaff–Schwartz 方法),几乎所有带提前终止条款的结构化产品都靠它定价。

学习目标

  1. 会构造带违约分支的股价二叉树,理解节点规则 \(\max[\min(Q_1,Q_2),Q_3]\),复现例 27.1 的可转债价值 106.93。
  2. 理解 Hull–White 路径依赖树的两个适用条件,会用"代表值 + 插值"给美式回望和美式亚式期权定价。
  3. 解释树方法给障碍期权定价时收敛慢的原因(内障碍与外障碍),会用"节点落在障碍上"的三叉树修正。
  4. 了解两相关资产建树的三种方法:变量变换、非矩形树、调整概率。
  5. 掌握 Longstaff–Schwartz 最小二乘蒙特卡洛的每个细节,理解为什么它给出的是下界,以及行权边界参数化方法。

读前导读

这一章在解决什么问题

你在 CFA 里见过单步二叉树:用无套利定出风险中性概率,再把期末收益按这个概率求平均、按无风险利率贴现。第 21a–21c 章把它扩展成多步树、蒙特卡洛和有限差分。本章不再引入新理论,只做一件事:把这几种工具"改装"一下,去对付真实世界里条款复杂的产品。

可以把本章看成五个独立的"改装案例"。可转债的难点是同时存在三方选择(持有人转股、发行人赎回、公司可能违约),办法是在树上加一个"违约分支",并在每个节点比较三种价值。亚式、回望期权的难点是收益取决于整条路径,办法是让每个节点多记一个"路径摘要"(平均价或最高价)。障碍期权的难点是树上的节点不恰好落在障碍上,导致误差很大,办法是调整步长让节点踩在障碍上。两资产期权的难点是相关性,办法是变量变换或调整分支概率。美式期权用蒙特卡洛的难点是"继续持有值多少"是一个条件期望,办法是用回归来估它,这就是业界最常用的 Longstaff–Schwartz(LSM)。

和你熟悉的知识对照:LSM 里的回归就是 CFA 二级的多元回归,只不过因变量是"继续持有后实际拿到的贴现现金流",自变量是当前股价的多项式;回归的拟合值被当作"继续持有的公允价值"。可转债的 \(\lambda\) 就是信用分析里的违约强度,和 CDS 利差大致满足"利差 ≈ \(\lambda\times(1-\)回收率\()\)"。

需要先想起来的数学

1. 矩匹配。 树的分支概率和步长不是随便选的,而是让树上一步的均值和方差等于连续模型在 \(\Delta t\) 内的均值和方差。例如二叉树要求 \(pu+(1-p)d=e^{r\Delta t}\)(均值对上)。本章的可转债树、障碍三叉树都是这样解两三个方程得到概率。可回顾 第 00 册第 07 章 概率中的分析工具 中期望与矩的部分。

2. 大 O 记号。 \(O(\sqrt{\Delta t})\) 表示"误差大约和 \(\sqrt{\Delta t}\) 成正比"。步数翻 4 倍,\(\Delta t\) 变成 1/4,\(\sqrt{\Delta t}\) 只减半,误差也大致只减半,所以收敛慢。见 第 00 册第 07 章 中大 O 小 o 一节。

3. 线性插值。 已知 \(x_1\) 处值 \(y_1\)、\(x_2\) 处值 \(y_2\),求中间 \(x\) 处的值:\(y=\dfrac{(x-x_1)y_2+(x_2-x)y_1}{x_2-x_1}\),即按距离反比加权。例:\(x_1=0,y_1=10\),\(x_2=4,y_2=18\),则 \(x=1\) 处为 \((1\times18+3\times10)/4=12\)。

4. 方差与协方差的运算。 \(\mathrm{Var}(aX+bY)=a^2\mathrm{Var}X+b^2\mathrm{Var}Y+2ab\,\mathrm{Cov}(X,Y)\)。这和组合方差公式完全一样,27.7 节的变量变换就靠它验证"新变量不相关"。见 第 00 册第 06 章 线性代数速成 的协方差矩阵部分。

5. 条件期望与回归。 "继续持有价值"\(=\mathbb{E}[\text{未来贴现现金流}\mid \text{当前股价}]\)(\(\mathbb{E}[\cdot\mid\cdot]\) 读作"在已知……的条件下的期望")。最小二乘回归的拟合值正是条件期望的最佳近似(在所选函数族中)。见 第 00 册第 07 章 条件期望一节。

怎么读这一章

核心必读是 27.4(可转债)和 27.8 的最小二乘法(LSM)。这两部分在 A 股转债和雪球类产品中天天用到,建议对照原文的数值例子手算一两个节点。27.6 只需理解"为什么普通树对障碍不准"和"让节点落在障碍上"这个思路,三叉树概率公式第一次可以只看结论。27.5 的代表值插值法思路简单,看懂节点 X 的计算即可。27.7 两资产树第一次可只读方法三(调整概率),方法一、二留待需要时再看。行权边界参数化和上界部分,理解"为什么是下界"这一个结论就够了。


27.4 可转换债券

产品特征

可转换债券(convertible bond)的持有人可以在未来某些时间把债券换成发行公司的股票。转换比率(conversion ratio)为每张债可换的股数,可以随时间变化。可转债几乎总是可赎回的:发行人可以在某些时间按预定价格买回。被赎回时持有人总有权先转换,所以赎回条款的实际作用是迫使持有人比自愿更早地转换。有时赎回权以股价高于某水平为前提(A 股转债的"强赎"条款就是这一类)。

信用风险很重要。 忽略信用风险会高估票息和本金的价值。Ingersoll(1977)用类似 Merton(1974,第 24 章)的模型:假设发行人的总资产服从几何布朗运动,把股权、可转债和其他债务都当作公司资产的或有索取权。这在理论上完美,但公司资产不可观测,实务中很少用。

实务常用的简化模型

直接对股价建模:股价服从几何布朗运动,但在每个 \(\Delta t\) 内有 \(\lambda\Delta t\) 的概率违约,违约时股价跌到 0,债券获得回收值。\(\lambda\) 是第 24.2 节的风险中性违约强度(hazard rate)。修改后的二叉树每个节点有三个分支:

  1. 概率 \(p_u\) 上涨比例 \(u\);
  2. 概率 \(p_d\) 下跌比例 \(d\);
  3. 概率 \(\lambda\Delta t\)(更准确地,\(1-e^{-\lambda\Delta t}\))违约,股价变为 0。

匹配股价分布的前两阶矩可得

\[p_u=\frac{a-de^{-\lambda\Delta t}}{u-d},\quad p_d=\frac{ue^{-\lambda\Delta t}-a}{u-d},\quad u=e^{\sqrt{(\sigma^2-\lambda)\Delta t}},\quad d=\frac1u,\quad a=e^{(r-q)\Delta t}.\]
注意 \(u\) 中用的是 \(\sigma^2-\lambda\):违约分支本身贡献了一部分方差,所以非违约分支的波动要相应减小。

推导拆解:\(p_u\)、\(p_d\) 来自两个条件。 第一,三个分支概率加起来为 1,违约概率是 \(1-e^{-\lambda\Delta t}\),所以不违约的两个分支合计 \(p_u+p_d=e^{-\lambda\Delta t}\)。 第二,风险中性下股价的期望增长率必须是 \(r-q\),即 \(p_u\cdot uS+p_d\cdot dS+(1-e^{-\lambda\Delta t})\cdot 0=aS\)。违约时股价为 0,这一项直接消失。 两式联立:由第一式 \(p_d=e^{-\lambda\Delta t}-p_u\),代入第二式得 \(p_u u+(e^{-\lambda\Delta t}-p_u)d=a\),整理即 \(p_u=\dfrac{a-de^{-\lambda\Delta t}}{u-d}\);\(p_d\) 同理。 直观上,违约分支把股价打到 0,拉低了期望,所以不违约时股价要"涨得更多一点"来补偿,\(p_u\) 因此比普通树略大。这正是信用风险高的公司股票隐含更高的漂移。

树的期限等于可转债的期限。末端节点按持有人的转换权估值;倒推时,在允许转换的节点检查转换是否最优,并检查发行人赎回能否改善自己的地位(若赎回,再检查持有人是否转换)。这等价于节点价值

\[\max[\min(Q_1,Q_2),Q_3],\]
\(Q_1\) 为倒推得到的继续持有价值(既不转换也不赎回),\(Q_2\) 为赎回价,\(Q_3\) 为转换价值。内层 \(\min\) 反映发行人要最小化债券价值,外层 \(\max\) 反映持有人要最大化。

金融直觉:把每个节点想成一个两人回合。发行人先手:如果"继续持有价值"\(Q_1\) 高于赎回价 \(Q_2\),发行人就赎回,把债券价值压到 \(Q_2\),否则不动,所以先取 \(\min(Q_1,Q_2)\)。持有人后手:无论发行人做什么,他都能选择转股拿 \(Q_3\),所以再取 \(\max(\cdot,Q_3)\)。 这和你熟悉的"可赎回债券价值 = 普通债 − 发行人看涨期权"、"可转债 ≈ 纯债 + 看涨期权"是同一件事,只是树把这些期权在每个节点上逐一兑现,而不是假设它们可以简单相加。 例 27.1 的节点 B、D 就是"强赎逼转股":持有人本想继续持有(118.31 > 115.19),发行人用 113 赎回逼他转股,价值从 118.31 降到 115.19。A 股转债发强赎公告后转债价格向转股价值收敛,就是这个机制。

例 27.1 XYZ 公司发行 9 个月期零息可转债,面值 $100,可随时换 2 股,发行人可随时以 $113 赎回。股价 $50,波动率 30%,无股息,违约强度 \(\lambda=1\%\)/年,无风险利率 5%,违约时债券值 $40(回收率 40%)。

用三步树(\(\Delta t=0.25\)):\(u=e^{\sqrt{(0.09-0.01)\times0.25}}=1.1519\),\(d=0.8681\),\(a=e^{0.0125}=1.0126\),\(p_u=0.5167\),\(p_d=0.4808\),每步违约概率 \(1-e^{-0.0025}=0.002497\)。

原书图 27.2 各节点(股价 / 可转债价值):A 50.00 / 106.93;B 57.60 / 115.19;C 43.41 / 101.20;D 66.34 / 132.69;E 50.00 / 106.36;F 37.68 / 98.61;G 76.42 / 152.85;H 57.60 / 115.19;I 43.41 / 100.00;J 32.71 / 100.00。

  • 末端节点:G、H 转换(价值为 2 倍股价);I、J 不转换(价值 100)。
  • 节点 E:转换价值 100;不转换的价值 \((0.5167\times115.19+0.4808\times100+0.002497\times40)e^{-0.0125}=106.36>100\),不转换;发行人也不会以 113 赎回一张只值 106.36 的债券。
  • 节点 B:转换价值 \(2\times57.596=115.19\),不转换价值 118.31,持有人本不愿转换;但发行人会以 113 赎回,此时持有人宁可转换(115.19 > 113),节点价值 115.19。
  • 节点 D:不转换价值 132.79,但赎回迫使转换,价值降为 132.69。

可转债价值为节点 A 的 106.93。

扩展。 有票息时,在不转换情形下的估值中加入下一步应付票息的现值;\(\lambda\) 可以从公司债券价格或 CDS 利差估计(第 24、25 章);若 \(\sigma,\lambda,r\) 是时间的函数,改用三叉树(第 21.4 节)。这个模型的缺点是违约概率与股价无关,而现实中股价越低越容易违约。有研究者建议用隐式有限差分实现,并让 \(\lambda\) 依赖股价和时间,例如 Andersen & Buffum(2003/04)假设 \(\lambda\propto S^{-\alpha}\)。


27.5 路径依赖衍生品

问题与条件

路径依赖(path-dependent,或历史依赖)衍生品的收益取决于标的的整条路径,不只是终值,亚式和回望期权就是例子。没有解析解时,可以用蒙特卡洛(第 21b 章):在风险中性世界中抽样路径,计算收益,按无风险利率贴现,取平均。但它有两个问题:达到所需精度的计算时间可能很长;美式路径依赖产品难以处理。

Hull & White(1993)把二叉树推广到一类路径依赖衍生品,能处理美式,对欧式也比蒙特卡洛高效。适用的两个条件:

  1. 收益只依赖于路径的单一函数 \(F\)(如最高价、平均价);
  2. \(F\) 可以递推:\(\tau+\Delta t\) 时的 \(F\) 能由 \(\tau\) 时的 \(F\) 和 \(\tau+\Delta t\) 时的标的价格算出。

最高价满足 \(F_{new}=\max(F,S_{new})\),平均价满足 \(F_{new}=\frac{iF+S_{new}}{i+1}\),都符合。

白话解释:条件 2 的意思是"只要记住一个数,就不用记住整条历史"。好比算年化平均收益时,你只需要"已有期数"和"当前平均值",新来一期数据就能更新,不用翻回每一期。 平均价公式 \(\frac{iF+S_{new}}{i+1}\) 的约定是:旧平均 \(F\) 由 \(i\) 个价格算出,\(iF\) 就是旧总和,加上新价格再除以新个数 \(i+1\)。代码里第 \(i\) 步的平均含 \(S_0,\dots,S_i\) 共 \(i+1\) 个价格,所以写成 \(\frac{(i+1)F+S_{new}}{i+2}\)。两种写法只是计数起点不同,做法一样:旧总和加新价格,再除以新个数。 树能处理它的原因是:给每个节点再加一个维度 \(F\),"(股价, \(F\))"这一对就完整描述了未来所需的全部信息,倒推照常进行。

例:美式浮动回望看跌

无股息股票,\(S_0=50\),\(\sigma=40\%\),\(r=10\%\),期限 3 个月,三步树:\(\Delta t=0.08333\),\(u=1.1224\),\(d=0.8909\),\(a=1.0084\),\(p=0.5073\)。在 \(\tau\) 行权时得到 0 到 \(\tau\) 的最高价超过当前价的部分。这里 \(F\) 为至今的最高价。

原书图 27.3 中每个节点列出股价、到达该节点时所有可能的最高价,以及每个最高价对应的衍生品价值。末端价值 = 最高价 − 股价。以节点 A(\(t=2\Delta t\)、股价 50 的节点,经"先涨后跌"到达时最高价为 56.12,经"先跌后涨"到达时为 50)为例:

  • 最高价为 50:上涨则最高价变为 56.12、价值 0;下跌则最高价仍为 50、价值 5.45。不提前行权的价值 \((0\times0.5073+5.45\times0.4927)e^{-0.1\times0.08333}=2.66\);此时行权收益为 0,不行权。
  • 最高价为 56.12:不行权价值 \((0\times0.5073+11.57\times0.4927)e^{-0.008333}=5.65\);行权得 \(56.12-50=6.12>5.65\),应提前行权。

倒推得到美式浮动回望看跌的价值 $5.47。(更高效的美式回望方法见 Technical Note 13。)

一般化:代表值与插值

回望的例子里,\(n\) 步树每个节点最高价的可能取值不超过 \(n\) 个,可以全部列出。但平均价的可能取值随步数指数增长,无法穷举。Hull & White 的办法是在每个节点只对少量代表值计算,其他值用插值:

  1. 正向遍历树,确定每个节点 \(F\) 的最大值和最小值(由条件 2 可以递推);
  2. 在每个节点选代表值,简单规则是最大值、最小值以及两者之间的若干等距值;
  3. 倒推时对每个代表值估值;需要的其他 \(F\) 值用相邻代表值插值。

例:算术平均价格看涨

沿用例 26.3:\(S_0=K=50\),\(r=10\%\),\(\sigma=40\%\),\(T=1\)。用 20 步树:\(\Delta t=0.05\),\(u=1.0936\),\(d=0.9144\),\(p=0.5056\)。平均值包含初始价和当前价。

原书图 27.4 展示了节点 X(0.2 年处的中心节点,股价 50):到达 X 的所有路径的平均值范围为 46.65–53.83。X 可以上行到 Y(股价 54.68,平均值范围 47.99–57.39)或下行到 Z(股价 45.72,平均值范围 43.88–52.48)。每个节点取 4 个等距代表值:X 为 46.65、49.04、51.44、53.83;Y 为 47.99、51.12、54.26、57.39;Z 为 43.88、46.75、49.61、52.48。

以 X 处平均值 51.44 为例:

  • 上行到 Y,新平均值 \((5\times51.44+54.68)/6=51.98\)(X 处平均含 5 个价格,加上新价格共 6 个)。它落在 Y 的代表值 51.12(价值 8.101)与 54.26(价值 8.635)之间,线性插值得
    \[\frac{(51.98-51.12)\times8.635+(54.26-51.98)\times8.101}{54.26-51.12}=8.247.\]
  • 下行到 Z,新平均值 \((5\times51.44+45.72)/6=50.49\),在 Z 的代表值间插值得 4.182。
  • X 处的价值为 \((0.5056\times8.247+0.4944\times4.182)e^{-0.1\times0.05}=6.206\)。

推导拆解:节点 X 在 0.2 年,即第 4 步,平均值包含 \(S_0\) 到 \(S_4\) 共 5 个价格。走到 Y 后多了一个价格 54.68,新平均 \(=(5\times51.44+54.68)/6\):先把旧平均还原成总和(乘 5),加上新价格,再除以 6。 插值那一步:51.98 离 51.12 有 0.86,离 54.26 有 2.28,越近的代表值权重越大,所以 54.26 对应的 8.635 拿到权重 \(0.86/3.14\),51.12 对应的 8.101 拿到 \(2.28/3.14\),加权得 8.247。 最后一步就是普通二叉树:上下两个价值按风险中性概率加权,再贴现一步。和普通树唯一的区别是,"下一节点的价值"不是一个数,而要先按新平均值去查表(插值)。

全树(20 步、每节点 4 个代表值)给出 7.17;60 步、每节点 100 个代表值时收敛到 5.58(例 26.3 的连续平均矩匹配近似为 5.62,第 26a 章的蒙特卡洛为 5.57)。美式版本只需在每个节点对每个代表值检验提前行权(行权决策同时依赖路径函数值和标的价格):20 步 4 个代表值为 7.77,60 步 100 个代表值为 6.17。用二次插值代替线性插值可以提高效率。本章代码完整实现了这一算法,所有数字与原书一致。


27.6 障碍期权的数值方法

为什么普通树收敛慢

原则上可以用二叉树或三叉树给障碍期权定价:以向上敲出期权为例,按普通期权倒推,但遇到障碍以上的节点时把价值设为 0。三叉树比二叉树好,但这种简单做法收敛非常慢,需要大量步数才能得到合理的精度。

Boyle & Lau(1994)指出了原因:树隐含的障碍与真实障碍不同。 定义内障碍为紧靠真实障碍内侧的一排节点,外障碍为紧靠外侧的一排节点(原书图 27.5)。通常的树计算隐含地把外障碍当作真实障碍,因为障碍条件首先作用在外障碍节点上。时间步长为 \(\Delta t\) 时节点的纵向间距为 \(O(\sqrt{\Delta t})\),所以误差也是 \(O(\sqrt{\Delta t})\),而且随步数变化呈锯齿状跳动:步数稍变,外障碍的位置就跳到另一排节点。

白话解释:树上的股价只能取离散的几个值,比如某个时点的节点是 …、92、100、108、…(数字仅作示意)。真实障碍 95 落在 92 和 100 之间。树只能在节点上检查"是否敲出",股价在 100 时没敲出,到 92 才敲出,相当于把障碍挪到了 92。障碍低了,向下敲出期权更难被敲掉,所以树给的价格偏高(例中 8.12 远高于 5.50)。 节点间距 \(\approx S\sigma\sqrt{\Delta t}\),所以"挪动的距离"最多一个间距,误差和 \(\sqrt{\Delta t}\) 同阶,这就是 \(O(\sqrt{\Delta t})\)(读作"与 \(\sqrt{\Delta t}\) 同一量级")。普通欧式期权的树误差是 \(O(\Delta t)\),障碍期权慢了一个量级。 锯齿的原因:步数从 100 变到 200,节点网格整体移动,离 95 最近的外侧节点可能从 93 跳到 94.8,误差忽大忽小,所以"多加步数"不是可靠的解决办法。

本章代码给出一个直观的例子:向下敲出看涨(\(S_0=K=100\),\(H=95\),\(\sigma=30\%\),\(r=5\%\),\(T=1\)),解析值 5.498。普通二叉树在 50、100、200、400 步时分别给出 8.12、6.25、6.55、6.25,误差超过 13% 且不随步数单调下降。

改进方法

方法一:内外障碍插值。 分别假设内障碍、外障碍是真实障碍,计算两个价格,再按真实障碍的位置在两者之间插值。

方法二:让节点恰好落在障碍上。 三叉树中价格每步上升比例 \(u\)、不变、或下降比例 \(d=1/u\)。选择 \(u\) 使 \(H=S_0u^N\)(\(N\) 为正或负整数),即 \(\ln H=\ln S_0+N\ln u\)。第 21.4 节建议 \(\ln u=\sigma\sqrt{3\Delta t}\),这里让 \(\ln u\) 尽量接近这个值,同时满足上面的整数条件:

\[\ln u=\frac{\ln H-\ln S_0}{N},\qquad N=\text{int}\Big[\frac{\ln H-\ln S_0}{\sigma\sqrt{3\Delta t}}+0.5\Big]\]
(\(N\) 取最接近的整数;向下障碍时 \(N\) 为负,原书图 27.6)。分支概率按匹配收益前两阶矩确定:
\[p_d=-\frac{(r-q-\sigma^2/2)\Delta t}{2\ln u}+\frac{\sigma^2\Delta t}{2(\ln u)^2},\quad p_m=1-\frac{\sigma^2\Delta t}{(\ln u)^2},\quad p_u=\frac{(r-q-\sigma^2/2)\Delta t}{2\ln u}+\frac{\sigma^2\Delta t}{2(\ln u)^2}.\]
代码中,节点落在障碍上的三叉树在 50 步时就给出 5.500,误差不到 0.05%。

推导拆解:设对数价格每步变化 \(X\in\{+\ln u,0,-\ln u\}\),概率 \(p_u,p_m,p_d\)。要求三件事: (1) 概率和为 1;(2) 均值 \(\mathbb{E}[X]=(p_u-p_d)\ln u=(r-q-\sigma^2/2)\Delta t\)(这是 \(\ln S\) 在风险中性下的漂移);(3) 二阶矩 \(\mathbb{E}[X^2]=(p_u+p_d)(\ln u)^2=\sigma^2\Delta t\)(忽略 \(\Delta t^2\) 的小项)。 由 (3) 得 \(p_u+p_d=\sigma^2\Delta t/(\ln u)^2\),代入 (1) 得 \(p_m\);由 (2) 得 \(p_u-p_d=(r-q-\sigma^2/2)\Delta t/\ln u\)。和与差各除以 2 就是 \(p_u\)、\(p_d\)。 这里的关键是:\(\ln u\) 可以自由选,只要 \(p_m\ge0\)(即 \(\ln u\ge\sigma\sqrt{\Delta t}\))就行。所以可以把 \(\ln u\) 从推荐值 \(\sigma\sqrt{3\Delta t}\) 稍微挪一点,让 \(\ln(H/S_0)\) 恰好是它的整数倍。注意向下障碍时 \(N\) 为负,\(\ln u\) 公式里的分子分母都是负数,\(\ln u\) 仍为正。

方法三:自适应网格模型。 方法二在初始价不靠近障碍时效果很好。初始价非常接近障碍时,即使节点落在障碍上,障碍附近的格点也太稀疏。Figlewski & Gao(1999)的自适应网格模型(adaptive mesh model,第 21.4 节已介绍)在粗树上需要的区域"嫁接"细树(原书图 27.7):在障碍附近用细网格,几何安排使节点落在障碍上,分支概率照常匹配前两阶矩。计算时先在粗树上照常倒推,再计算附加节点的价值,最后在细树上倒推。


27.7 两个相关资产的期权

对依赖两个相关资产的美式期权,需要三维树(时间 + 两个价格)。原书介绍三种方法。

方法一:变量变换(Hull & White 1990)。两个不相关变量很容易建三维树:各建一棵二维树(如 CRR),合并后每个节点有 4 个分支,概率为各自概率的乘积:\(p_1p_2\)(都上)、\(p_1(1-p_2)\)、\((1-p_1)p_2\)、\((1-p_1)(1-p_2)\)。对相关资产,风险中性过程为 \(dS_i=(r-q_i)S_i\,dt+\sigma_iS_i\,dz_i\),相关系数 \(\rho\),\(d\ln S_i=(r-q_i-\sigma_i^2/2)dt+\sigma_idz_i\)。定义

\[x_1=\sigma_2\ln S_1+\sigma_1\ln S_2,\qquad x_2=\sigma_2\ln S_1-\sigma_1\ln S_2,\]
则
\[dx_1=[\sigma_2(r-q_1-\sigma_1^2/2)+\sigma_1(r-q_2-\sigma_2^2/2)]dt+\sigma_1\sigma_2\sqrt{2(1+\rho)}\,dz_A,\]
\[dx_2=[\sigma_2(r-q_1-\sigma_1^2/2)-\sigma_1(r-q_2-\sigma_2^2/2)]dt+\sigma_1\sigma_2\sqrt{2(1-\rho)}\,dz_B,\]
\(dz_A,dz_B\) 不相关(可以直接验证 \(x_1,x_2\) 增量的协方差为 \(\sigma_2^2\sigma_1^2-\sigma_1^2\sigma_2^2=0\))。对 \(x_1,x_2\) 各建二叉树,合并为三维树;每个节点由逆变换求资产价格:
\[S_1=\exp\Big(\frac{x_1+x_2}{2\sigma_2}\Big),\qquad S_2=\exp\Big(\frac{x_1-x_2}{2\sigma_1}\Big).\]

方法二:非矩形树(Rubinstein 1994)。从节点 \((S_1,S_2)\) 出发,以各 0.25 的概率移动到 \((S_1u_1,S_2A)\)、\((S_1u_1,S_2B)\)、\((S_1d_1,S_2C)\)、\((S_1d_1,S_2D)\),其中

\[u_1=\exp[(r-q_1-\sigma_1^2/2)\Delta t+\sigma_1\sqrt{\Delta t}],\quad d_1=\exp[(r-q_1-\sigma_1^2/2)\Delta t-\sigma_1\sqrt{\Delta t}],\]
\[A=\exp[\mu_2\Delta t+\sigma_2\sqrt{\Delta t}(\rho+\sqrt{1-\rho^2})],\quad B=\exp[\mu_2\Delta t+\sigma_2\sqrt{\Delta t}(\rho-\sqrt{1-\rho^2})],\]
\[C=\exp[\mu_2\Delta t-\sigma_2\sqrt{\Delta t}(\rho-\sqrt{1-\rho^2})],\quad D=\exp[\mu_2\Delta t-\sigma_2\sqrt{\Delta t}(\rho+\sqrt{1-\rho^2})],\]
\(\mu_2=r-q_2-\sigma_2^2/2\)。(原书第四个点误印为 \(S_2d_1\),应为 \((S_1d_1,S_2D)\)。)相关系数为 0 时,等价于对两个资产分别使用第 21.4 节的等概率二叉树。

方法三:调整概率(Hull & White 1994,最初用于两因子利率树)。先假设不相关,对两个资产都用等概率(0.5)二叉树,合并后四个分支概率均为 0.25(原书表 27.2);再按相关系数调整(表 27.3):两者同向(都上或都下)的概率为 \(0.25(1+\rho)\),反向的概率为 \(0.25(1-\rho)\)。这样两资产对数价格增量的协方差恰好为 \(\rho\sigma_1\sigma_2\Delta t\)。方法三最容易编程,本章代码用它给交换期权定价,200 步时结果 9.5825,与 Margrabe 公式 9.5846 一致。

推导拆解:等概率树里每个资产的对数增量为 \(\pm\sigma_i\sqrt{\Delta t}\)(扣掉漂移后)。两者乘积在同向时为 \(+\sigma_1\sigma_2\Delta t\),反向时为 \(-\sigma_1\sigma_2\Delta t\)。于是协方差 \(=[2\times0.25(1+\rho)-2\times0.25(1-\rho)]\sigma_1\sigma_2\Delta t=\rho\sigma_1\sigma_2\Delta t\),正好是目标值。 同时每个资产单独看,上涨概率仍是 \(0.25(1+\rho)+0.25(1-\rho)=0.5\),边缘分布没有被改动。这是它最方便的地方:单资产的树完全不用动,只改联合概率。\(\rho=\pm1\) 时有两个分支概率为 0,仍然合法;只有 \(|\rho|>1\) 才会出现负概率,所以实务中更要注意的是 \(\rho\) 估计值的合理性。


27.8 蒙特卡洛模拟与美式期权

蒙特卡洛适合路径依赖和多变量问题,树和有限差分适合美式期权。两者兼具时怎么办?27.5 节的树方法是一种答案,但它受限于"单一路径函数"。许多研究者(最早是 Tilley 1993)寻求用蒙特卡洛给美式期权定价,以下两种方法最重要。

最小二乘法(Longstaff–Schwartz)

在每个可以提前行权的时点,持有人要在"立即行权"与"继续持有"之间选择。行权价值容易计算;难点在于继续持有的价值,它是一个条件期望。Longstaff & Schwartz(2001)的最小二乘法(least-squares Monte Carlo,LSM)用横截面回归来估计它:在每个决策时点,用所有(实值)路径上"继续持有实际得到的贴现现金流"对"当前状态变量的函数"做回归,回归的拟合值就是继续持有价值的估计。

白话解释:在树上,同一个节点后面有很多分支,可以直接把它们平均来求继续持有价值。蒙特卡洛的每条路径都是一条"单线",在 \(t=2\) 股价 0.97 的只有一条路径,它后面只有一个结果,拿它当期望太嘈杂。 LSM 的办法是"借邻居的信息":把所有路径在 \(t=2\) 的股价放在横轴、各自继续持有后实际拿到的贴现现金流放在纵轴,画一张散点图,拟合一条二次曲线。曲线在 \(S=0.97\) 处的高度,就是"股价为 0.97 时继续持有的平均价值"的估计。 这和 CFA 里的回归完全一样:拟合值是"给定 \(X\) 时 \(Y\) 的条件均值"的估计。只不过这里 \(Y\) 是单条路径的现金流(噪声很大),\(X\) 是 \(1,S,S^2\)。

例(取自 Longstaff–Schwartz 论文)。 3 年期美式看跌,无股息,只能在第 1、2、3 年末行权,\(r=6\%\)(连续复利),\(S_0=1.00\),\(K=1.10\)。8 条样本路径(原书表 27.4,时刻 1/2/3 的股价):

路径 \(t=1\) \(t=2\) \(t=3\)
1 1.09 1.08 1.34
2 1.16 1.26 1.54
3 1.22 1.07 1.03
4 0.93 0.97 0.92
5 1.11 1.56 1.52
6 0.76 0.77 0.90
7 0.92 0.84 1.01
8 0.88 1.22 1.34

(实务中要抽样多得多的路径。)

  1. 第 3 年:只在到期行权的现金流(表 27.5)——路径 3、4、6、7 分别为 0.07、0.18、0.20、0.09,其余为 0。
  2. 第 2 年:实值路径为 1、3、4、6、7,股价 \(S\) 为 1.08、1.07、0.97、0.77、0.84;继续持有得到的现金流贴现到第 2 年为 0、\(0.07e^{-0.06}\)、\(0.18e^{-0.06}\)、\(0.20e^{-0.06}\)、\(0.09e^{-0.06}\)。回归 \(V=a+bS+cS^2\) 得
    \[V=-1.070+2.983S-1.813S^2.\]
    拟合的继续价值为 0.0369、0.0461、0.1176、0.1520、0.1565,行权价值为 0.02、0.03、0.13、0.33、0.26。所以路径 4、6、7 在第 2 年行权(表 27.6:路径 3 第 3 年得 0.07;路径 4、6、7 第 2 年分别得 0.13、0.33、0.26,它们第 3 年的现金流作废)。
  3. 第 1 年:实值路径为 1、4、6、7、8,股价 1.09、0.93、0.76、0.92、0.88;继续持有的现金流贴现到第 1 年为 0、\(0.13e^{-0.06}\)、\(0.33e^{-0.06}\)、\(0.26e^{-0.06}\)、0。回归得 \(V=2.038-3.335S+1.356S^2\),继续价值 0.0139、0.1092、0.2866、0.1175、0.1533;行权价值 0.01、0.17、0.34、0.18、0.22。所以路径 4、6、7、8 在第 1 年行权(表 27.7)。
  4. 期权价值:
    \[\frac18\big(0.07e^{-0.18}+0.17e^{-0.06}+0.34e^{-0.06}+0.18e^{-0.06}+0.22e^{-0.06}\big)=0.1144,\]
    大于立即行权的 0.10,所以今天不行权。

两个关键细节。 第一,回归只用实值路径:虚值路径不会行权,把它们放进回归只会降低拟合在关键区域的精度。第二,回归值只用来决定是否行权,计入的现金流是路径上实际实现的现金流,而不是拟合值。如果把拟合值当作价值往回传,回归误差会逐期累积并产生向上的偏差。

扩展。 可行权时点很多时(真正的美式),用大量离散行权点近似;回归函数可以更复杂(三次多项式、Laguerre 多项式等);多个状态变量时,假设继续价值是它们的某个函数形式,用最小二乘估计参数——这正是 LSM 对多因子问题的优势所在。

行权边界参数化(Andersen 2000)

另一种思路是把提前行权边界参数化,从期末向前迭代,逐期选出最优参数。看跌期权在 \(t\) 时的边界可以由一个临界价 \(S^*(t)\) 表示:\(S<S^*(t)\) 时行权。\(S^*(3)=1.10\)。

  • 确定 \(S^*(2)\):若 \(S^*(2)<0.77\),第 2 年都不行权,8 条路径第 2 年的价值为 0、0、\(0.07e^{-0.06}\)、\(0.18e^{-0.06}\)、0、\(0.20e^{-0.06}\)、\(0.09e^{-0.06}\)、0,均值 0.0636。\(S^*(2)=0.77\) 时(路径 6 行权得 0.33)均值 0.0813;\(S^*(2)\) 取 0.84、0.97、1.07、1.08 时均值为 0.1032、0.0982、0.0938、0.0963。最优 \(S^*(2)=0.84\)(准确地说 \(0.84\le S^*(2)<0.97\)),此时各路径第 2 年价值为 0、0、0.0659、0.1695、0、0.33、0.26、0。
  • 确定 \(S^*(1)\):若 \(S^*(1)<0.76\),都不行权,第 1 年价值 \(0.1032e^{-0.06}=0.0972\);\(S^*(1)=0.76\) 时均值 0.1008;取 0.88、0.92、0.93、1.09 时均值为 0.1283、0.1202、0.1215、0.1228。最优 \(S^*(1)=0.88\)。
  • 0 时刻不行权的价值 \(0.1283e^{-0.06}=0.1208\),大于立即行权的 0.10。

实务中先用数万次模拟确定边界,然后丢弃这些路径,用一组新的独立路径按该边界估值。原因是:在同一组路径上优化边界会"过拟合"这组路径,产生向上的偏差(本例中 0.1208 高于 LSM 的 0.1144,部分就是这个原因)。复杂情形需要对边界的参数形式作假设。

上界

两种方法都使用一个次优的行权策略(真实最优策略未知),而任何行权策略产生的价值都不超过最优策略的价值,所以在样本外估值时它们给出的是下界。Andersen & Broadie(2004)提出了原始–对偶(primal–dual)方法给出上界,可以与任何产生下界的算法结合,把真实价值夹在一个区间内。区间越窄,说明行权策略越接近最优。

金融直觉:美式期权的价值是"用最聪明的行权策略能拿到的最多钱"。你用回归得到的策略只是一个"还不错"的策略,按它执行拿到的钱只会少不会多,所以是下界。 为什么一定要用新路径估值?如果在同一组路径上既定策略又估值,策略会"看到"这批路径的未来(例如恰好在某条路径后来跌了之前选择不行权),相当于偷看答案,估值会虚高。这和回测里的"样本内过拟合"是同一个问题:参数在样本内优化,业绩必须在样本外检验。 上界的直观是:假设持有人能预知未来(事后看每条路径最佳的行权时点),价值一定偏高;原始–对偶方法在这个"先知价值"里减去一个用鞅构造的惩罚项,把它压低到尽量接近真实值。

本章代码用 20 万条路径(含对偶变量)、50 个行权点给一个美式看跌定价(\(S_0=36\)、\(K=40\)、\(\sigma=20\%\)、\(r=6\%\)、\(T=1\)),LSM 得 4.469,2000 步二叉树得 4.487。差距一部分来自只有 50 个行权点(百慕大 vs 美式),一部分来自回归带来的次优策略,两者都使 LSM 偏低,与"下界"的结论一致。


量化实战

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

  1. 可转债量化。A 股可转债市场的定价模型、"双低"等策略的理论价值计算,都以本章的违约分支树为雏形。实务中还要加入下修条款(转股价下调)、回售条款(持有人在股价低时按价回售,相当于一个看跌期权)、强赎触发条件("连续 30 个交易日中至少 15 日收盘价不低于转股价的 130%",这是巴黎期权式的条件,需要路径依赖技术)。
  2. 雪球、凤凰等自动敲出产品。这类产品是离散观测的障碍期权加路径依赖票息,通常用蒙特卡洛定价;涉及发行人提前赎回或投资者选择权时,用 LSM。障碍附近的收敛问题在 PDE/树方法中要用"节点落在障碍上"或自适应网格处理。
  3. 利率产品。百慕大互换期权、可赎回债券是 LSM 在固定收益中的主要应用,在 LIBOR 市场模型(第 32 章)中只能用蒙特卡洛,LSM 几乎是唯一选择。
  4. 系统实现要点。LSM:只对实值路径回归、传递实现现金流、定边界与估值用不同路径、报告下界与上界。路径依赖树:代表值数量决定精度,插值方法决定效率。两资产树:调整概率法最容易实现,但 \(|\rho|\) 接近 1 时注意概率非负。
  5. LSM 的思想迁移。"用横截面回归估计条件期望"本身就是一种近似动态规划,在最优执行、库存管理、最优止损等最优停止问题上同样适用。

Python 示例:五种数值技术

代码依次完成:(1) 复现例 27.1 可转债树;(2) 实现 Hull–White 代表值插值法,复现图 27.4 的节点范围与 7.17、7.77、5.58、6.17;(3) 复现 LSM 的 8 路径例子;(4) 大样本 LSM 与二叉树对比;(5) 障碍期权:普通二叉树与"节点落在障碍上"的三叉树对比;(6) 用调整概率的两资产树给交换期权定价。

import numpy as np
from scipy.stats import norm

N = norm.cdf

# ---------- 1) 可转债树:例 27.1 ----------
def convertible(S0=50., sig=.30, lam=.01, r=.05, T=.75, steps=3, face=100., ratio=2.,
                call_px=113., recovery=40.):
    dt = T/steps
    u = np.exp(np.sqrt((sig**2 - lam)*dt)); d = 1/u; a = np.exp(r*dt)
    pu = (a - d*np.exp(-lam*dt))/(u - d); pd = (u*np.exp(-lam*dt) - a)/(u - d)
    pdef = 1 - np.exp(-lam*dt)
    S = S0*u**np.arange(steps, -steps - 1, -2)              # 末端股价(从高到低)
    V = np.maximum(ratio*S, face)                            # 末端:转换或拿面值
    for i in range(steps - 1, -1, -1):
        S = S0*u**np.arange(i, -i - 1, -2)
        Q1 = (pu*V[:-1] + pd*V[1:] + pdef*recovery)*np.exp(-r*dt)   # 继续持有
        V = np.maximum(np.minimum(Q1, call_px), ratio*S)            # max[min(Q1,Q2),Q3]
    return u, d, pu, pd, pdef, V[0]

u, d, pu, pd, pdef, v = convertible()
print("例27.1 u=%.4f d=%.4f pu=%.4f pd=%.4f 违约概率=%.6f  可转债价值=%.2f" % (u, d, pu, pd, pdef, v))

# ---------- 2) 路径依赖树:Hull-White 代表值 + 插值,算术平均价格看涨(例 26.3 参数)----------
def asian_tree(S0, K, r, sig, T, steps, nrep, american=False):
    dt = T/steps; u = np.exp(sig*np.sqrt(dt)); d = 1/u
    p = (np.exp(r*dt) - d)/(u - d); disc = np.exp(-r*dt)
    price = lambda i, j: S0*u**j*d**(i - j)                 # j = 上涨次数
    # 正向:每个节点平均值(含 S0 与当前价,共 i+1 个价格)的最大、最小值
    amax = [np.array([S0])]; amin = [np.array([S0])]
    for i in range(1, steps + 1):
        s = price(i, np.arange(i + 1))
        mx = np.full(i + 1, -np.inf); mn = np.full(i + 1, np.inf)
        for j in range(i + 1):
            for jp in (j - 1, j):                              # 前驱节点
                if 0 <= jp <= i - 1:
                    mx[j] = max(mx[j], (i*amax[i-1][jp] + s[j])/(i + 1))
                    mn[j] = min(mn[j], (i*amin[i-1][jp] + s[j])/(i + 1))
        amax.append(mx); amin.append(mn)
    reps = lambda i, j: np.linspace(amin[i][j], amax[i][j], nrep) if amax[i][j] > amin[i][j] + 1e-12 \
        else np.full(nrep, amin[i][j])
    A = [reps(steps, j) for j in range(steps + 1)]
    V = [np.maximum(a - K, 0) for a in A]
    for i in range(steps - 1, -1, -1):
        newA, newV = [], []
        for j in range(i + 1):
            a = reps(i, j)
            au = ((i + 1)*a + price(i + 1, j + 1))/(i + 2)
            ad = ((i + 1)*a + price(i + 1, j))/(i + 2)
            vu = np.interp(au, A[j + 1], V[j + 1]); vd = np.interp(ad, A[j], V[j])
            v = disc*(p*vu + (1 - p)*vd)
            if american:
                v = np.maximum(v, a - K)
            newA.append(a); newV.append(v)
        A, V = newA, newV
    return V[0][0], (amin[4][2], amax[4][2])

v, rngX = asian_tree(50, 50, .1, .4, 1, 20, 4)
print("亚式看涨树: 20步/4个代表值 = %.2f (美式 %.2f);节点X平均范围 = %.2f–%.2f" % (
    v, asian_tree(50, 50, .1, .4, 1, 20, 4, american=True)[0], *rngX))
for steps, nrep in ((60, 100),):
    print("  %d步/%d个代表值: 欧式 %.2f, 美式 %.2f" % (
        steps, nrep, asian_tree(50, 50, .1, .4, 1, steps, nrep)[0],
        asian_tree(50, 50, .1, .4, 1, steps, nrep, american=True)[0]))

# ---------- 3) 最小二乘蒙特卡洛(LSM):原书 8 条路径的例子 ----------
paths = np.array([[1.09, 1.08, 1.34], [1.16, 1.26, 1.54], [1.22, 1.07, 1.03], [0.93, 0.97, 0.92],
                  [1.11, 1.56, 1.52], [0.76, 0.77, 0.90], [0.92, 0.84, 1.01], [0.88, 1.22, 1.34]])

def lsm_put(paths, K, r, dt, basis_deg=2, verbose=False):
    n, m = paths.shape
    cash = np.maximum(K - paths[:, -1], 0)          # 现金流(以发生时刻计)
    t_cash = np.full(n, m)                          # 现金流发生的时点
    for t in range(m - 1, 0, -1):                   # 时点 t = m-1, ..., 1(索引 t-1)
        S = paths[:, t - 1]
        itm = K - S > 0
        Y = cash[itm]*np.exp(-r*dt*(t_cash[itm] - t))   # 用实现的现金流(不是拟合值)
        X = np.vander(S[itm], basis_deg + 1, increasing=True)
        beta = np.linalg.lstsq(X, Y, rcond=None)[0]
        cont = X @ beta
        ex = (K - S[itm]) > cont
        if verbose:
            print("  t=%d 回归系数 a,b,c = %s, 行权路径 %s" % (t, np.round(beta, 3), np.where(itm)[0][ex] + 1))
        idx = np.where(itm)[0][ex]
        cash[idx] = K - S[idx]; t_cash[idx] = t
    return np.mean(cash*np.exp(-r*dt*t_cash))

print("LSM 8 条路径:")
print("  期权价值 = %.4f" % lsm_put(paths, 1.10, .06, 1.0, verbose=True))

# ---------- 4) LSM 大样本 vs 二叉树:美式看跌 ----------
def binomial_american_put(S0, K, r, sig, T, steps=2000):
    dt = T/steps; u = np.exp(sig*np.sqrt(dt)); d = 1/u
    p = (np.exp(r*dt) - d)/(u - d); disc = np.exp(-r*dt)
    S = S0*u**np.arange(steps, -steps - 1, -2); V = np.maximum(K - S, 0)
    for i in range(steps - 1, -1, -1):
        S = S0*u**np.arange(i, -i - 1, -2)
        V = np.maximum(disc*(p*V[:-1] + (1 - p)*V[1:]), K - S)
    return V[0]

S0, K, r, sig, T, m = 36., 40., .06, .2, 1., 50
rng = np.random.default_rng(0)
z = rng.standard_normal((100_000, m))
z = np.vstack([z, -z])                                       # 对偶变量
P = S0*np.exp(np.cumsum((r - .5*sig**2)*T/m + sig*np.sqrt(T/m)*z, axis=1))
print("美式看跌 S0=36,K=40: LSM(50个行权点,20万路径,基函数1,S,S^2) = %.3f, 二叉树(连续行权) = %.3f"
      % (lsm_put(P/S0, K/S0, r, T/m)*S0, binomial_american_put(S0, K, r, sig, T)))

# ---------- 5) 障碍期权:普通二叉树的锯齿收敛 vs 节点落在障碍上的三叉树 ----------
def do_call_exact(S, K, H, T, r, sig):
    lam = (r + .5*sig**2)/sig**2; sT = sig*np.sqrt(T)
    y = np.log(H**2/(S*K))/sT + lam*sT
    d1 = (np.log(S/K) + (r + .5*sig**2)*T)/sT
    c = S*N(d1) - K*np.exp(-r*T)*N(d1 - sT)
    cdi = S*(H/S)**(2*lam)*N(y) - K*np.exp(-r*T)*(H/S)**(2*lam - 2)*N(y - sT)
    return c - cdi

def do_call_binomial(S0, K, H, T, r, sig, steps):
    dt = T/steps; u = np.exp(sig*np.sqrt(dt)); d = 1/u
    p = (np.exp(r*dt) - d)/(u - d); disc = np.exp(-r*dt)
    S = S0*u**np.arange(steps, -steps - 1, -2)
    V = np.where(S > H, np.maximum(S - K, 0), 0.0)
    for i in range(steps - 1, -1, -1):
        S = S0*u**np.arange(i, -i - 1, -2)
        V = np.where(S > H, disc*(p*V[:-1] + (1 - p)*V[1:]), 0.0)
    return V[0]

def do_call_trinomial_on_barrier(S0, K, H, T, r, sig, steps):
    dt = T/steps
    Nb = int((np.log(H) - np.log(S0))/(sig*np.sqrt(3*dt)) - 0.5)   # 负整数,取整使 ln u 接近 σ√(3Δt)
    lnu = (np.log(H) - np.log(S0))/Nb
    nu = r - .5*sig**2
    pu = nu*dt/(2*lnu) + sig**2*dt/(2*lnu**2)
    pd = -nu*dt/(2*lnu) + sig**2*dt/(2*lnu**2)
    pm = 1 - sig**2*dt/lnu**2
    disc = np.exp(-r*dt)
    k = np.arange(steps, -steps - 1, -1)
    S = S0*np.exp(k*lnu)
    V = np.where(S > H*(1 + 1e-12), np.maximum(S - K, 0), 0.0)
    for i in range(steps - 1, -1, -1):
        k = np.arange(i, -i - 1, -1); S = S0*np.exp(k*lnu)
        V = disc*(pu*V[:-2] + pm*V[1:-1] + pd*V[2:])
        V = np.where(S > H*(1 + 1e-12), V, 0.0)
    return V[0]

S0, K, H, T, r, sig = 100., 100., 95., 1., .05, .3
print("向下敲出看涨 S0=100,K=100,H=95 解析值 = %.4f" % do_call_exact(S0, K, H, T, r, sig))
for n in (50, 100, 200, 400):
    print("  N=%4d  普通二叉树 %.4f   节点落在障碍上的三叉树 %.4f" % (
        n, do_call_binomial(S0, K, H, T, r, sig, n), do_call_trinomial_on_barrier(S0, K, H, T, r, sig, n)))

# ---------- 6) 两相关资产:先假设独立再调整概率(方法三),给交换期权定价 ----------
def exchange_tree(V0, U0, sV, sU, rho, r, T, steps):
    dt = T/steps; disc = np.exp(-r*dt)
    def grid(S0, s, i):
        j = np.arange(i + 1)
        return S0*np.exp((r - .5*s**2)*i*dt + (2*j - i)*s*np.sqrt(dt))   # 等概率二叉树
    Vt, Ut = grid(V0, sV, steps), grid(U0, sU, steps)
    W = np.maximum(Vt[:, None] - Ut[None, :], 0)
    pp, pm = .25*(1 + rho), .25*(1 - rho)                        # 同向 / 反向
    for i in range(steps - 1, -1, -1):
        W = disc*(pp*W[1:, 1:] + pp*W[:-1, :-1] + pm*W[1:, :-1] + pm*W[:-1, 1:])
    return W[0, 0]

sh = np.sqrt(.3**2 + .2**2 - 2*.6*.3*.2)
d1 = (np.log(1.0) + .5*sh**2)/sh
print("交换期权: 两资产树(200步) %.4f, Margrabe %.4f" % (
    exchange_tree(100, 100, .3, .2, .6, .05, 1, 200), 100*N(d1) - 100*N(d1 - sh)))

输出:

例27.1 u=1.1519 d=0.8681 pu=0.5167 pd=0.4808 违约概率=0.002497  可转债价值=106.93
亚式看涨树: 20步/4个代表值 = 7.17 (美式 7.77);节点X平均范围 = 46.65–53.83
  60步/100个代表值: 欧式 5.58, 美式 6.17
LSM 8 条路径:
  t=2 回归系数 a,b,c = [-1.07   2.983 -1.814], 行权路径 [4 6 7]
  t=1 回归系数 a,b,c = [ 2.038 -3.335  1.356], 行权路径 [4 6 7 8]
  期权价值 = 0.1144
美式看跌 S0=36,K=40: LSM(50个行权点,20万路径,基函数1,S,S^2) = 4.469, 二叉树(连续行权) = 4.487
向下敲出看涨 S0=100,K=100,H=95 解析值 = 5.4981
  N=  50  普通二叉树 8.1193   节点落在障碍上的三叉树 5.5002
  N= 100  普通二叉树 6.2473   节点落在障碍上的三叉树 5.4966
  N= 200  普通二叉树 6.5454   节点落在障碍上的三叉树 5.4948
  N= 400  普通二叉树 6.2470   节点落在障碍上的三叉树 5.4977
交换期权: 两资产树(200步) 9.5825, Margrabe 9.5846

读输出时注意:

  • 可转债价值 106.93、各树参数与原书完全一致。
  • 亚式期权树复现了节点 X 的平均值范围 46.65–53.83,以及 20 步 4 个代表值的 7.17(美式 7.77)、60 步 100 个代表值的 5.58(美式 6.17)。20 步时误差很大,说明代表值太少时线性插值的误差很显著。
  • LSM 两次回归的系数与原书一致(\(c\) 的 −1.814 与原书 −1.813 的差别来自四舍五入),行权路径和最终价值 0.1144 完全一致。
  • 障碍期权:普通二叉树在 400 步时仍有约 14% 的误差,而且步数翻倍误差不降反升;节点落在障碍上的三叉树在 50 步时误差已不到 0.05%。
  • 两资产树与 Margrabe 公式相差约 0.002。

本章小结

本章把基本数值方法推广到更复杂的产品。可转债用加了违约分支的股价二叉树定价,违约强度 \(\lambda\) 使非违约分支的方差变为 \(\sigma^2-\lambda\),倒推时节点值为 \(\max[\min(Q_1,Q_2),Q_3]\),同时反映持有人的转换权和发行人的赎回权。路径依赖衍生品只要收益依赖单一、可递推的路径函数,就能在树的每个节点为该函数选代表值、倒推时插值,并能处理美式行权。障碍期权在普通树上收敛慢且呈锯齿状,原因是树隐含的障碍(外障碍)与真实障碍不同;让节点落在障碍上、在内外障碍间插值或在障碍附近嫁接细网格都可以解决。两个相关资产的树可以通过变量变换、非矩形节点安排或调整概率来构造。蒙特卡洛处理美式期权有两种方法:最小二乘法用横截面回归估计继续持有价值,行权边界参数化则从后向前优化边界;两者都给出下界,可用原始–对偶方法求上界。

技术 要点
可转债树 \(u=e^{\sqrt{(\sigma^2-\lambda)\Delta t}}\),\(p_u=\frac{a-de^{-\lambda\Delta t}}{u-d}\),\(p_d=\frac{ue^{-\lambda\Delta t}-a}{u-d}\);节点值 \(\max[\min(Q_1,Q_2),Q_3]\)
路径依赖树 条件:单一路径函数、可递推;正向求范围,代表值 + 插值,倒推
障碍期权树 误差 \(O(\sqrt{\Delta t})\) 来自外障碍;\(\ln u=(\ln H-\ln S_0)/N\) 使节点落在障碍上
两资产树 变量变换 \(x_{1,2}=\sigma_2\ln S_1\pm\sigma_1\ln S_2\);非矩形树;同向概率 \(0.25(1+\rho)\)、反向 \(0.25(1-\rho)\)
LSM 只用实值路径回归;回归值决定行权,传递实现现金流;下界
边界参数化 从后向前优化 \(S^*(t)\);新路径估值;下界
上界 Andersen–Broadie 原始–对偶方法

练习

基础

  1. 在例 27.1 中,如果没有赎回条款,可转债价值是多少?赎回条款对持有人价值多少? 提示:把代码中的 call_px 设为一个很大的数重新计算;差值就是发行人赎回权的价值。无赎回条款时价值约 108.55,赎回权使持有人损失约 1.62。

  2. 为什么可转债树中 \(u=e^{\sqrt{(\sigma^2-\lambda)\Delta t}}\) 而不是 \(e^{\sigma\sqrt{\Delta t}}\)? 提示:违约分支(股价跳到 0)本身贡献了约 \(\lambda\Delta t\) 的对数方差贡献(在小 \(\Delta t\) 下的近似匹配),为使总方差仍为 \(\sigma^2\Delta t\),非违约分支的方差要减去 \(\lambda\Delta t\)。

白话解释:提示里"对数方差"的说法只能当作启发式理解:违约时股价为 0,\(\ln 0\) 没有定义,严格说无法算对数收益的方差。更准确的说法是匹配股价相对变化\(S_{t+\Delta t}/S_t\) 的二阶矩:违约分支让这个比值以约 \(\lambda\Delta t\) 的概率取 0(偏离均值约 1),贡献约 \(\lambda\Delta t\) 的方差,于是非违约分支只需提供 \((\sigma^2-\lambda)\Delta t\)。结论不变。

  1. 下列哪些衍生品可以用 27.5 节的路径依赖树方法定价?(a)收益依赖最后 3 个月平均价的期权;(b)收益依赖期间最高价与最低价之差的期权;(c)几何平均价格的美式看跌。 提示:(a) 可以但需要特别处理平均窗口开始前的节点(原书习题 27.13);(b) 需要两个路径函数,不满足条件 1;(c) 可以,几何平均可递推(原书习题 27.12)。

  2. 在 LSM 中,为什么回归只用实值路径?为什么计入实现的现金流而不是回归拟合值? 提示:见 27.8 节"两个关键细节"。

  3. 解释为什么 LSM 和行权边界参数化给出的是美式期权价值的下界。 提示:任何可行的行权策略产生的价值都不超过最优策略;样本外估值消除了"偷看未来"的偏差。

进阶

  1. 用原书 8 条路径,把执行价改为 \(K=1.13\),重做 LSM 和行权边界参数化(原书习题 27.15、27.21 的重做)。 提示:直接调用代码中的 lsm_put(paths, 1.13, .06, 1.0, verbose=True);边界参数化需要自己写一个对候选 \(S^*(t)\) 的枚举。

  2. 修改可转债代码:债券每 3 个月付 $2 票息、转换比率在第 6 个月后变为 1.8,重新定价(原书习题 27.18、27.23 类型)。 提示:在不转换的继续价值中加入下一期票息的现值;在转换价值中使用当时有效的转换比率。

  3. 把本章的障碍三叉树推广到双障碍(同时有上下障碍),使节点同时落在两个障碍上需要满足什么条件?(原书习题 27.17) 提示:需要 \(\ln(H_u/H_d)\) 是 \(\ln u\) 的整数倍,同时 \(\ln(H_u/S_0)\) 也是整数倍;通常要牺牲"\(S_0\) 在节点上"或在第一步用特殊分支。

  4. 用 LSM 给一个两资产的百慕大"最大值看涨"期权定价:收益 \(\max(\max(S_1,S_2)-K,0)\),回归基函数用 \(1,S_1,S_2,S_1^2,S_2^2,S_1S_2\),并与本章两资产树(加上提前行权检验)比较。 提示:这是 LSM 处理多状态变量的典型场景;树方法在两资产时仍可行,三个以上资产就只能用蒙特卡洛。

  5. 用回望期权的路径依赖树(3 步)复现美式浮动回望看跌的 5.47,然后把步数增加到 50,观察收敛(原书习题 27.10、27.19)。 提示:每个节点存储一个"可能最高价 → 价值"的字典;最高价可能值的个数不超过步数。

原书推荐习题:27.15、27.21(LSM 与边界参数化,强烈建议实现并扩展到大量路径);27.18、27.23(可转债树);27.10、27.14(路径依赖树方法,27.14 要求验证图 27.4 的数值);27.17(双障碍);27.12、27.13(路径依赖方法的适用性)。


原书对照

本章小节 原书章节 PDF 页码
27.4 可转换债券 27.4 Convertible Bonds(例 27.1,图 27.2) p.656–659
27.5 路径依赖衍生品 27.5 Path-Dependent Derivatives(图 27.3、27.4) p.659–663
27.6 障碍期权的数值方法 27.6 Barrier Options(图 27.5–27.7) p.663–666
27.7 两个相关资产 27.7 Options on Two Correlated Assets(表 27.2、27.3) p.666–669
27.8 蒙特卡洛与美式期权 27.8 Monte Carlo Simulation and American Options(表 27.4–27.7) p.669–673
小结与习题 Summary, Practice Questions p.673–677

替代模型与随机波动率(27.1–27.3 节)见第 27a 章。延伸阅读:Longstaff & Schwartz (2001);Andersen (2000);Andersen & Broadie (2004);Boyle & Lau (1994);Figlewski & Gao (1999);Hull & White (1990, 1993, 1994);Rubinstein (1994);Tilley (1993);Ingersoll (1977);Andersen & Buffum (2003/04)。