量化交易中文教材

第 32 章 HJM、LMM 与多条零息曲线

第 31 章的短期利率模型容易实现,谨慎使用时能让大多数非标准利率衍生品的定价与活跃交易工具(利率上限、欧式互换期权、欧式债券期权)保持一致。但它们有两个局限:

  1. 多数只有一个因子,所有利率在短时间内被同一个随机冲击驱动;
  2. 不能自由选择波动率结构。让 \(a\) 和 \(\sigma\) 随时间变化可以拟合今天的波动率,但代价是波动率结构变成非平稳的(第 31.8 节)。

本章介绍两个可以自由设定波动率环境、可以多因子的一般框架:Heath–Jarrow–Morton(HJM)模型和 LIBOR 市场模型(LMM)。然后讨论 2008 年之后的现实问题:OIS 贴现下如何同时处理两条(或更多)零息曲线。最后介绍美国机构抵押支持证券(agency MBS)市场,它是这些模型最典型的应用对象。

学习目标

  1. 从零息债的风险中性过程推导 HJM 漂移条件,理解"风险中性下远期利率的漂移完全由其波动率决定"。
  2. 解释 HJM 一般为非马尔可夫的原因,以及 Ho–Lee、Hull–White 为什么是可以用重合树表示的特例。
  3. 写出 LMM 在远期测度和滚动远期测度下的过程,会用冻结漂移的离散格式编写蒙特卡洛模拟。
  4. 会从 caplet 波动率剥离 \(\Lambda_i\),用 PCA 把波动率拆分到多个因子;理解为什么普通上限与因子数无关,而棘轮、黏性、弹性上限与因子数有关。
  5. 说明 OIS 贴现下远期 LIBOR 的定义变化,以及多曲线联合建模的常用做法。
  6. 理解机构 MBS 的提前还款风险、CMO 分档、IO/PO 与期权调整利差(OAS)。

读前导读

这一章在解决什么问题

第 31 章只对短期利率建模,整条曲线由它推出来。缺点是你没法直接控制"5 年远期利率的波动率是多少"、"2 年和 10 年利率的相关性是多少",这些都由少数几个参数间接决定。本章换一个思路:不再只对短期利率建模,而是直接对整条远期利率曲线上的每一点建模。

打个比方:第 31 章像是只建模"隔夜利率",再推算出整条收益率曲线怎么动;本章像是直接给收益率曲线上的每一个关键期限(1 年、2 年……10 年的远期利率)各自设定波动率和相互之间的相关性,然后让它们一起随机运动。

两个框架:

  • HJM:对连续的"瞬时远期利率曲线"建模。最重要的结论是:在风险中性世界中,远期利率的漂移不能随意设定,它由波动率唯一决定。这和"股票在风险中性世界中漂移必须等于 \(r\)"是同一个无套利逻辑。
  • LMM:对市场上真实交易的离散远期利率(如 3 个月 LIBOR 的各期远期)建模。它和第 29 章的 Black caplet 公式天然一致,是工业界给复杂利率产品定价的主力模型。

然后两个"现实问题":2008 年后用 OIS 曲线贴现、用 LIBOR(现在是 SOFR 等)曲线计算现金流,两条曲线怎么协调;以及美国机构 MBS,你在 CFA 里学过提前还款风险、CMO 分档、负凸性和 OAS,本章说明为什么它们需要这类模型。

需要先想起来的数学

1. 伊藤引理与 \(\ln P\)。 \(dP/P=r\,dt+v\,dz\) 时,\(d\ln P=(r-v^2/2)dt+v\,dz\)。32.1 节的整个推导就是"对两只债券的 \(\ln P\) 求差"。

2. 导数作为差商的极限。 \(\lim_{\Delta T\to0}\frac{g(T+\Delta T)-g(T)}{\Delta T}=g'(T)\)。HJM 从离散远期利率 \(f(t,T_1,T_2)\) 过渡到瞬时远期利率 \(F(t,T)\) 就靠这一步,和"远期利率 = 零息利率曲线的斜率"同一个道理。见 第 00 册第 02 章 导数与泰勒展开。

3. 积分的基本定理。 \(v(t,T)=v(t,t)+\int_t^Tv_\tau\,d\tau\),而 \(v(t,t)=0\)。即"一个函数等于起点值加上导数的累积"。见 第 00 册第 03 章 积分。

4. 方差随时间累加。 独立的各段时间里,方差相加:总方差 \(=\sum(\text{各段波动率}^2\times\text{时长})\)。这和"由 1 年、2 年即期利率推出 1 年后 1 年远期利率"的思路一样,32.2 节用它从 caplet 波动率剥离出各期的远期波动率。

5. 主成分分析(PCA)。 把一组高度相关的变量(各期限利率的变动)分解成少数几个互不相关的"因子":水平、斜率、曲率。数学上是协方差矩阵的特征值分解。见 第 00 册第 06 章 线性代数速成 的特征值与协方差矩阵部分。

怎么读这一章

32.1 HJM:重点看 (32.3) 的推导和 HJM 漂移条件 (32.5) 的含义;"非马尔可夫"只需理解为什么不能建重合树。32.2 LMM:必读 (32.7)(与 Black 一致)、滚动远期测度的含义、波动率剥离(例 32.1)、"普通上限与因子数无关、奇异上限与因子数有关";(32.10) 的推导和互换期权解析近似 (32.17)–(32.19) 第一次可以只看结论。32.3 多曲线:读懂"OIS 贴现下要用 \(F_{OD}\)"这一个要点即可。32.4 MBS:结合 CFA 的知识快速浏览,重点是"为什么必须用蒙特卡洛"。


32.1 Heath–Jarrow–Morton 模型

记号

  • \(P(t,T)\):\(t\) 时到期日为 \(T\) 的零息债价格;
  • \(\Omega_t\):决定 \(t\) 时债券波动率的过去和当前利率、债券价格的集合;
  • \(v(t,T,\Omega_t)\):\(P(t,T)\) 的波动率;
  • \(f(t,T_1,T_2)\):\(t\) 时看到的 \(T_1\) 到 \(T_2\) 的远期利率;
  • \(F(t,T)\):\(t\) 时看到的期限为 \(T\) 的瞬时远期利率;
  • \(r(t)\):短期利率;\(dz(t)\):驱动期限结构的维纳过程。

从零息债过程到远期利率过程

先考虑单因子、传统风险中性世界。零息债是无收益的交易资产,风险中性下收益率为 \(r\):

\[dP(t,T)=r(t)P(t,T)dt+v(t,T,\Omega_t)P(t,T)dz(t)\tag{32.1}\]

\(v\) 可以是过去和当前利率、债券价格的任意"良好"函数。唯一的硬约束是:债券到期时价格波动率降为零,\(v(t,t,\Omega_t)=0\)。(原书脚注:这等价于所有贴现债在任何时刻的漂移有限;否则可能需要无穷大的漂移才能保证到期价格等于面值。)

由式 (4.5),远期利率与零息债价格的关系是

\[f(t,T_1,T_2)=\frac{\ln P(t,T_1)-\ln P(t,T_2)}{T_2-T_1}\tag{32.2}\]

由 Itô 引理,\(d\ln P(t,T_i)=[r-v(t,T_i,\Omega_t)^2/2]dt+v(t,T_i,\Omega_t)dz\)。代入 (32.2),\(r\) 项相消:

\[df(t,T_1,T_2)=\frac{v(t,T_2,\Omega_t)^2-v(t,T_1,\Omega_t)^2}{2(T_2-T_1)}dt+\frac{v(t,T_1,\Omega_t)-v(t,T_2,\Omega_t)}{T_2-T_1}dz(t)\tag{32.3}\]

注意:风险中性世界中 \(f\) 的过程只取决于 \(v\)。它与 \(r\) 和 \(P\) 的关系是间接的——只有当 \(v\) 本身依赖 \(r\) 和 \(P\) 时才有关系。

推导拆解:(32.2) 本身就是远期利率的定义:连续复利下 \(P(t,T_2)=P(t,T_1)e^{-f(T_2-T_1)}\),取对数整理即得。 对两只债券各用伊藤引理(导读第 1 项)后,\(d\ln P(t,T_1)-d\ln P(t,T_2)\) 中两个 \(r\,dt\) 正好相消,因为两只债券在风险中性世界中都以 \(r\) 增长。剩下:漂移 \(=-\tfrac12v_1^2+\tfrac12v_2^2\),随机项 \(=(v_1-v_2)dz\),再除以 \(T_2-T_1\),即 (32.3)。 为什么这很重要?短期利率 \(r\) 是随机的、难以观察的,而它恰好从远期利率的方程里消失了。所以只要给出各期债券的波动率,就能写出远期利率的全部动态,不需要知道短期利率的过程。

令 \(T_1=T\)、\(T_2=T+\Delta T\),取 \(\Delta T\to0\):\(f\to F(t,T)\),\(dz\) 的系数变为 \(-v_T\)(\(v\) 对 \(T\) 的偏导),\(dt\) 的系数变为 \(\tfrac12\partial[v^2]/\partial T=vv_T\)。于是

\[dF(t,T)=v(t,T,\Omega_t)\,v_T(t,T,\Omega_t)\,dt-v_T(t,T,\Omega_t)\,dz(t)\tag{32.4}\]

一旦设定 \(v\),所有瞬时远期利率的风险中性过程就确定了。

HJM 漂移条件

由 \(v(t,t,\Omega_t)=0\),有 \(v(t,T,\Omega_t)=\int_t^Tv_\tau(t,\tau,\Omega_t)d\tau\)。若把瞬时远期利率的过程写成 \(dF=m\,dt+s\,dz\),比较 (32.4) 得 \(s=-v_T\),进而

\[m(t,T,\Omega_t)=s(t,T,\Omega_t)\int_t^Ts(t,\tau,\Omega_t)\,d\tau\tag{32.5}\]

这就是 HJM 漂移条件。它的含义是本章最重要的一句话:在风险中性世界中,瞬时远期利率的漂移不能自由选择,它完全由波动率决定。建模者唯一的自由是设定波动率函数 \(s(t,T,\Omega_t)\)。

推导拆解:比较 \(dz\) 系数得 \(s=-v_T\)。由于 \(v(t,t)=0\),\(v(t,T)=\int_t^Tv_\tau\,d\tau=-\int_t^Ts\,d\tau\)。代入漂移 \(m=v\cdot v_T=\big(-\int_t^Ts\,d\tau\big)(-s)=s\int_t^Ts\,d\tau\)。两个负号相乘为正。 白话解释:为什么漂移被"锁死"?在 BSM 里,风险中性世界中股票的漂移只能是 \(r\),否则就有套利。这里的道理一样:今天的收益率曲线已经给出了所有零息债的价格,如果你随便设定远期利率的漂移,模型算出的债券价格就会与市场不一致,就存在套利。HJM 条件就是"不能有套利"翻译成远期利率语言后的结果。 漂移为什么是"波动率 × 波动率的积分"?这是一个凸性修正:远期利率是 \(\ln P\) 的差,而 \(\ln\) 是凹函数,波动越大、期限越长,修正越大。Ho–Lee 例子中漂移是 \(\sigma^2(T-t)\),期限越远漂移越大,正是这个效应。

多因子推广:若 \(dF=m\,dt+\sum_ks_k\,dz_k\)(因子相互独立),则

\[m(t,T,\Omega_t)=\sum_ks_k(t,T,\Omega_t)\int_t^Ts_k(t,\tau,\Omega_t)\,d\tau\tag{32.6}\]

实现上的难点:非马尔可夫

HJM 看似简单,实际很难实现。一般 HJM 模型下,短期利率过程是**非马尔可夫(non-Markov)**的:\(r\) 未来的过程不仅取决于那时 \(r\) 的值,还取决于从现在到那时走过的路径。因此:

  • 通常只能用蒙特卡洛模拟;
  • 若要建树,树不重合(nonrecombining)。单因子二叉树 \(n\) 步后有 \(2^n\) 个节点,\(n=30\) 时约 10 亿个(原书图 32.1)。

微妙之处在于:单个远期利率 \(F(t,T)\) 在多数应用中是马尔可夫的,可以单独用重合树表示;但不能让所有远期利率共用同一棵树。

白话解释:马尔可夫(Markov)的意思是"只看现在,不看历史":知道今天的短期利率,就能确定未来的分布,至于怎么走到今天无关紧要。 重合树需要这个性质。"先涨后跌"和"先跌后涨"到达同一个利率值,如果未来行为也一样,两个节点就能合并成一个,节点数随步数线性增长。如果未来行为还取决于"是先涨还是先跌"(非马尔可夫),两个节点就不能合并,节点数翻倍增长:30 步就是 \(2^{30}\approx10.7\) 亿个。 金融上的对应:在一般 HJM 中,今天的短期利率不足以描述"整条曲线的状态",曲线的形状还记录着过去的冲击,所以只看 \(r\) 不够。

两个重要特例是例外:

  • \(s(t,T)=\sigma\)(常数)得到 Ho–Lee 模型(原书习题 32.3);
  • \(s(t,T)=\sigma e^{-a(T-t)}\) 得到 Hull–White 模型(原书习题 32.4)。

这两个特例中短期利率是马尔可夫的,\(r\) 和所有远期利率可以用同一棵重合树表示。这也说明了第 31 章与本章的关系:Hull–White 是 HJM 框架中一个"可以用树实现"的特殊波动率设定。

以 Ho–Lee 为例验证 (32.5):\(s=\sigma\),则 \(m=\sigma\int_t^T\sigma d\tau=\sigma^2(T-t)\)。积分得

\[F(t,T)=F(0,T)+\int_0^t\sigma^2(T-u)\,du+\sigma z(t)\]

令 \(T=t\),短期利率 \(r(t)=F(t,t)=F(0,t)+\tfrac12\sigma^2t^2+\sigma z(t)\),于是 \(dr=[F_t(0,t)+\sigma^2t]dt+\sigma dz\),正是 (31.10)–(31.11) 的 Ho–Lee 模型。


32.2 LIBOR 市场模型

动机

HJM 用瞬时远期利率表达,有两个实际困难:瞬时远期利率不能直接观察;模型难以校准到活跃交易的工具。Brace–Gatarek–Musiela(BGM)、Jamshidian 以及 Miltersen–Sandmann–Sondermann 提出了 LIBOR 市场模型(LIBOR market model,LMM,也称 BGM 模型),直接用交易员在 LIBOR 贴现下实际使用的、离散期限的远期利率来表达。

设定

  • \(t_0=0\),\(t_1,t_2,\ldots\) 为当前交易的上限的重置日(美国最流行季度重置,\(t_1\approx0.25\),\(t_2\approx0.5\),……);\(\delta_k=t_{k+1}-t_k\);
  • \(F_k(t)\):\(t\) 时看到的 \(t_k\) 到 \(t_{k+1}\) 的远期利率(复利期为 \(\delta_k\),actual/actual 计息);
  • \(m(t)\):下一个重置日的指标,即满足 \(t\le t_{m(t)}\) 的最小整数;
  • \(\zeta_k(t)\):\(F_k(t)\) 在 \(t\) 时的波动率。

先假设单因子。由第 28.4 节,在关于 \(P(t,t_{k+1})\) 的远期风险中性世界中,\(F_k\) 是鞅:

\[dF_k(t)=\zeta_k(t)F_k(t)dz\tag{32.7}\]

这正是 Black 的 caplet 模型:每个 caplet 只依赖一个远期利率,在它自己的远期测度下 \(F_k\) 是对数正态鞅。所以 LMM 与 Black 上限公式天然一致,这是它最大的实用优势。

白话解释:可以把 LMM 理解为"把一串 Black caplet 模型缝在一起"。第 29 章里,每个 caplet 各自用一套计算权重(各自付款日的零息债测度),在各自的权重下各自的远期利率是鞅。单独定价一个 caplet 没问题。 但棘轮上限、百慕大期权这类产品要同时用到好几个远期利率,必须把它们放在同一套权重下一起模拟。换到公共权重时,每个远期利率的漂移就不再是 0 了,下面的 (32.8)–(32.10) 就是在算这个漂移修正。

记 \(P(t,t_k)\) 的波动率为 \(v_k(t)\)(即 \(dP/P=\cdots+v_k(t)dz\)),\(v_k(t)\) 为负,因为债券价格与利率负相关。

滚动远期风险中性世界

问题是:不同的 \(F_k\) 在不同的测度下才是鞅,要同时模拟它们,必须选一个公共测度。LMM 常用滚动远期风险中性世界(rolling forward risk-neutral world):在任何时刻,都是关于"下一个重置日到期的零息债"的远期风险中性世界。

它的好处是贴现非常简单:从 \(t_{k+1}\) 贴现到 \(t_k\),只需用 \(t_k\) 时观察到的 \(t_{k+1}\) 期零息利率,不必关心 \(t_k\) 到 \(t_{k+1}\) 之间利率如何变化。(原书脚注:这相当于以"滚动 CD"为计价单位——从 $1 开始买到期 \(t_1\) 的债券,到期后再投资到期 \(t_2\) 的债券,依此类推。严格地说,第 31 章的利率树也是在滚动远期风险中性世界里,而不是在传统风险中性世界里。)

由第 28.8 节的换计价单位结果,\(F_k\) 在滚动远期风险中性世界中的过程为

\[dF_k(t)=\zeta_k(t)[v_{m(t)}(t)-v_{k+1}(t)]F_k(t)dt+\zeta_k(t)F_k(t)dz\tag{32.8}\]

再由 \(P(t,t_i)/P(t,t_{i+1})=1+\delta_iF_i(t)\),两边取对数、用 Itô 引理比较 \(dz\) 的系数:

\[v_i(t)-v_{i+1}(t)=\frac{\delta_iF_i(t)\zeta_i(t)}{1+\delta_iF_i(t)}\tag{32.9}\]

(\(v\) 与 \(\zeta\) 符号相反,债券价格波动率的绝对值随期限增大,符合直觉。)把 (32.9) 从 \(i=m(t)\) 累加到 \(k\) 代入 (32.8):

\[\frac{dF_k(t)}{F_k(t)}=\sum_{i=m(t)}^k\frac{\delta_iF_i(t)\zeta_i(t)\zeta_k(t)}{1+\delta_iF_i(t)}dt+\zeta_k(t)dz\tag{32.10}\]

当 \(\delta_i\to0\) 时,(32.10) 退化为 HJM 的 (32.4)(原书习题 32.7)。LMM 可以看作 HJM 的离散期限版本。

推导拆解:(32.8) 直接套用第 28.8 节的换计价单位公式:从 \(P(t,t_{k+1})\) 换到 \(P(t,t_{m(t)})\),计价单位比率 \(w=P(t,t_{m(t)})/P(t,t_{k+1})\) 的波动率为 \(v_{m(t)}-v_{k+1}\),\(F_k\) 的波动率为 \(\zeta_k\),漂移增加二者之积。 (32.9):\(\ln P(t,t_i)-\ln P(t,t_{i+1})=\ln(1+\delta_iF_i)\)。左边 \(dz\) 系数是 \(v_i-v_{i+1}\);右边对 \(F_i\) 求导得 \(\frac{\delta_i}{1+\delta_iF_i}\),乘以 \(F_i\) 的随机项 \(\zeta_iF_i\,dz\),即右式。 (32.10):\(v_{m(t)}-v_{k+1}\) 可以写成一串相邻差之和 \(\sum_{i=m(t)}^k(v_i-v_{i+1})\)(中间项依次相消,像"望远镜"一样收起来),每一项用 (32.9) 替换。 金融直觉:\(F_k\) 的漂移是它与"比它短的各个远期利率"之间协方差的加权和。\(k\) 越大,求和项越多,漂移越大。远期利率越靠后,在滚动测度下平均上升得越多,这和第 30 章"在不自然的测度下期望值要上调"是同一个效应。

远期利率波动率的参数化

一个常用的简化假设:\(\zeta_k(t)\) 只取决于从下一个重置日到 \(t_k\) 之间完整计息期的个数。记有 \(i\) 个计息期时的波动率为 \(\Lambda_i\),则

\[\zeta_k(t)=\Lambda_{k-m(t)}\]

是一个阶梯函数。这种设定是平稳的:波动率只取决于"离重置还有多久",不取决于日历时间,今天的波动率期限结构在未来会被原样复制。

\(\Lambda_i\) 在理论上可以由 Black 模型下的 caplet 即期波动率(原书图 29.3)估计。设 \(\sigma_k\) 为 \(t_k\) 到 \(t_{k+1}\) 的 caplet 的 Black 波动率,令累计方差相等:

\[\sigma_k^2t_k=\sum_{i=1}^k\Lambda_{k-i}^2\delta_{i-1}\tag{32.11}\]

从 \(k=1\) 开始迭代求出 \(\Lambda_0,\Lambda_1,\ldots\)。(实践中更常用最小二乘校准,见下文。)

例 32.1 \(\delta_i\) 相等,前三个 caplet 的 Black 波动率为 24%、22%、20%。

  • \(\Lambda_0=24\%\);
  • \(\Lambda_0^2+\Lambda_1^2=2\times0.22^2\),得 \(\Lambda_1=19.80\%\);
  • \(\Lambda_0^2+\Lambda_1^2+\Lambda_2^2=3\times0.20^2\),得 \(\Lambda_2=15.23\%\)。

推导拆解:第 2 个 caplet 对应的远期利率 \(F_2\)(在 \(t_2\) 重置),在重置前要活 2 个计息期。第一期里它离重置还有 1 个完整计息期,波动率是 \(\Lambda_1\);第二期里离重置还剩 0 个完整计息期,波动率是 \(\Lambda_0\)。两期方差相加,必须等于 Black 公式用的总方差 \(\sigma_2^2\times2\)。所以 \(\Lambda_1^2=2\times0.22^2-0.24^2=0.0968-0.0576=0.0392\),\(\Lambda_1=19.80\%\)。 金融直觉:这和从即期利率推远期利率完全同构:即期利率是"平均",远期利率是"边际"。从"累计平均"推"边际"时,平均值的小变化会被放大成边际值的大变化,这就是为什么直接剥离容易剧烈震荡甚至无解(练习 3)。

例 32.2(原书表 32.1,计息期 1 年):

\(k\) 1 2 3 4 5 6 7 8 9 10
\(\sigma_k\)(%) 15.50 18.25 17.91 17.74 17.27 16.79 16.30 16.01 15.76 15.54
\(\Lambda_{k-1}\)(%) 15.50 20.64 17.21 17.22 15.25 14.15 12.98 13.81 13.60 13.40

两者都呈驼峰,\(\Lambda\) 的驼峰更明显:\(\sigma_k\) 是 \(\Lambda\) 的"累计平均",平均会把驼峰抹平。

蒙特卡洛实现

把 \(\zeta_k(t)=\Lambda_{k-m(t)}\) 代入:

\[\frac{dF_k}{F_k}=\sum_{i=m(t)}^k\frac{\delta_iF_i\Lambda_{i-m(t)}\Lambda_{k-m(t)}}{1+\delta_iF_i}dt+\Lambda_{k-m(t)}dz\tag{32.12}\]
\[d\ln F_k=\left[\sum_{i=m(t)}^k\frac{\delta_iF_i\Lambda_{i-m(t)}\Lambda_{k-m(t)}}{1+\delta_iF_i}-\frac{\Lambda_{k-m(t)}^2}{2}\right]dt+\Lambda_{k-m(t)}dz\tag{32.13}\]

漂移依赖于其他远期利率,不能精确积分。一个常用近似是冻结漂移:在 \(t_j<t<t_{j+1}\) 内计算漂移时令 \(F_i(t)=F_i(t_j)\)。于是

\[F_k(t_{j+1})=F_k(t_j)\exp\left[\left(\sum_{i=j+1}^k\frac{\delta_iF_i(t_j)\Lambda_{i-j-1}\Lambda_{k-j-1}}{1+\delta_iF_i(t_j)}-\frac{\Lambda_{k-j-1}^2}{2}\right)\delta_j+\Lambda_{k-j-1}\varepsilon\sqrt{\delta_j}\right]\tag{32.14}\]

\(\varepsilon\sim N(0,1)\)。从 \(t_0\) 出发依次推进到 \(t_1\)、\(t_2\)……

多因子推广

设有 \(p\) 个独立因子,\(\zeta_{k,q}\) 为 \(F_k\) 的波动率在第 \(q\) 个因子上的分量:

\[\frac{dF_k}{F_k}=\sum_{i=m(t)}^k\frac{\delta_iF_i\sum_{q=1}^p\zeta_{i,q}\zeta_{k,q}}{1+\delta_iF_i}dt+\sum_{q=1}^p\zeta_{k,q}dz_q\tag{32.15}\]

记 \(\lambda_{i,q}\) 为有 \(i\) 个计息期时第 \(q\) 个分量,离散格式为

\[F_k(t_{j+1})=F_k(t_j)\exp\left[\left(\sum_{i=j+1}^k\frac{\delta_iF_i(t_j)\sum_q\lambda_{i-j-1,q}\lambda_{k-j-1,q}}{1+\delta_iF_i(t_j)}-\frac{\sum_q\lambda_{k-j-1,q}^2}{2}\right)\delta_j+\sum_q\lambda_{k-j-1,q}\varepsilon_q\sqrt{\delta_j}\right]\tag{32.16}\]

模拟流程:每次试验从初始曲线算出的 \(F_0(0),\ldots,F_{N-1}(0)\) 开始,用 (32.16) 算 \(F_1(t_1),\ldots,F_{N-1}(t_1)\),再算 \(F_2(t_2),\ldots,F_{N-1}(t_2)\),直到 \(F_{N-1}(t_{N-1})\)。模拟出的曲线随时间越来越短:如计息期 3 个月、\(N=40\),起点是 10 年曲线,到第 6 年(\(t_{24}\))只剩 4 年曲线。

检验冻结漂移的近似:用 (32.16) 模拟 caplet 价格(\(F_k(t_k)\) 是实现的利率,决定 \(t_{k+1}\) 的 caplet 支付,沿路径逐期贴现回 0,再取平均),与 Black 公式比较。原书报告:即使计息期长达 1 年、试验次数很大,二者也没有显著差异(只有上限波动率很高时例外)。冻结漂移在多数情况下是无害的。本章量化实战的代码会重做这个检验。

棘轮上限、黏性上限与弹性上限

LMM 的价值在于给依赖多个远期利率联合分布的产品定价。原书的三个例子:

  • 棘轮上限(ratchet cap):执行价随上一期利率重置,\(K_{j+1}=R_j+s\)(上一重置日的 LIBOR 加利差);
  • 黏性上限(sticky cap):执行价按上一期封顶后的利率重置,\(K_{j+1}=\min(R_j,K_j)+s\);
  • 弹性上限(flexi cap):普通上限,但限定可行权的 caplet 总数。

原书表 32.2、32.3 的设定:本金 $100,曲线平坦于 5%(连续复利,即年复利 5.127%),caplet 波动率同表 32.1,年度重置,利差 25bp(作用于年复利利率),LIBOR 贴现,100,000 次模拟加对偶变量,标准误约 0.001。

caplet 起点 棘轮(1/2/3 因子) 黏性(1/2/3 因子)
第 1 年 0.196 / 0.194 / 0.195 0.196 / 0.194 / 0.195
第 5 年 0.187 / 0.193 / 0.201 0.484 / 0.492 / 0.506
第 10 年 0.153 / 0.162 / 0.169 0.488 / 0.519 / 0.534

两因子和三因子的波动率分量见原书表 32.4、32.5。例如三因子模型中,有 1 个计息期(第 1 年)的分量为 13.65%、−6.62%、3.19%,平方和开方为总波动率 15.50%。第一个因子类似"水平",第二个类似"斜率",第三个类似"曲率"。

弹性上限:年付、本金 $100、曲线平坦 5%、所有价内 caplet 都行权、至多 5 个,1/2/3 因子价格分别为 3.43、3.58、3.61。

要点:普通上限的价格只取决于每个 caplet 的总波动率,与因子数无关,因为每个 caplet 只依赖一个远期利率。而上面这些非标准产品依赖多个远期利率的联合分布,与因子数有关:因子越多,不同期限远期利率之间的相关性越低,这类产品的价值通常越高。棘轮 caplet 支付 \(\max(R_{j+1}-R_j-s,0)\),本质是相邻两期利率之差的期权;两者相关性越低,差的波动越大,期权越值钱。

金融直觉:用组合方差公式就能看清:\(\mathrm{Var}(R_{j+1}-R_j)=\sigma_{j+1}^2+\sigma_j^2-2\rho\sigma_j\sigma_{j+1}\)。普通 caplet 只用到 \(\sigma_j\),与 \(\rho\) 无关。棘轮 caplet 的标的是"利差",\(\rho\) 越低,利差波动越大。 单因子模型中所有远期利率被同一个 \(dz\) 驱动,相关系数接近 1,利差波动被严重低估。加入第二、三个因子(斜率、曲率)后,不同期限利率可以不同步,相关性下降,棘轮和黏性上限的价值上升,这正是表中 1→3 因子价格递增的原因。这和价差期权、互换期权相对于上限的定价都是同一个道理:凡是依赖"多个利率之间关系"的产品,因子数都会影响价格。

欧式互换期权的解析近似

Hull–White (2000) 给出了 LMM 下欧式互换期权的解析近似(LIBOR 贴现)。设期权到期日 \(T_0\),互换付款日 \(T_1,\ldots,T_N\),\(\tau_i=T_{i+1}-T_i\)。由式 (28.23),远期互换利率为

\[s(t)=\frac{P(t,T_0)-P(t,T_N)}{\sum_{i=0}^{N-1}\tau_iP(t,T_{i+1})},\qquad\frac{P(t,T_i)}{P(t,T_0)}=\prod_{j=0}^{i-1}\frac{1}{1+\tau_jG_j(t)}\]

\(G_j(t)\) 为 \(T_j\) 到 \(T_{j+1}\) 的远期利率。互换利率是这些远期利率的函数,由 Itô 引理(原书习题 32.12),互换利率的瞬时方差为

\[V(t)=\sum_{q=1}^p\left[\sum_{k=0}^{N-1}\frac{\tau_k\beta_{k,q}(t)G_k(t)\gamma_k(t)}{1+\tau_kG_k(t)}\right]^2\tag{32.17}\]
\[\gamma_k(t)=\frac{\prod_{j=0}^{N-1}[1+\tau_jG_j]}{\prod_{j=0}^{N-1}[1+\tau_jG_j]-1}-\frac{\sum_{i=0}^{k-1}\tau_i\prod_{j=i+1}^{N-1}[1+\tau_jG_j]}{\sum_{i=0}^{N-1}\tau_i\prod_{j=i+1}^{N-1}[1+\tau_jG_j]}\]

\(\beta_{j,q}\) 是 \(G_j\) 波动率的第 \(q\) 个分量。近似令 \(G_j(t)=G_j(0)\),代入标准市场模型(Black 互换期权公式)的互换波动率为

\[\sqrt{\frac{1}{T_0}\int_0^{T_0}\sum_{q=1}^p\left[\sum_{k=0}^{N-1}\frac{\tau_k\beta_{k,q}(t)G_k(0)\gamma_k(0)}{1+\tau_kG_k(0)}\right]^2dt}\tag{32.18}\]

若互换的计息期与上限计息期相同,\(\beta_{k,q}(t)\) 就是剩余期限 \(T_k-t\) 的上限远期利率的第 \(q\) 个分量,可从表 32.5 查得。美国市场的基准上限是季度重置,而基准互换期权的标的互换是半年重置,二者不匹配。推广的方法是:每个互换计息期含 \(M\) 个子期,\(\tau_j=\sum_m\tau_{j,m}\),\(1+\tau_jG_j=\prod_m[1+\tau_{j,m}G_{j,m}]\),得到形式类似的 (32.19):内层对 \(k\) 和 \(m\) 求和,被加项换成 \(\tau_{k,m}\beta_{k,m,q}G_{k,m}(0)\gamma_k(0)/(1+\tau_{k,m}G_{k,m}(0))\)。

Hull 和 White 将其与蒙特卡洛结果比较,二者非常接近。用途:快速为欧式互换期权定价;判断互换期权相对上限是高估还是低估;以及(最重要的)用互换期权校准 LMM。该方法可以扩展到 OIS 贴现。

校准

需要确定两样东西:每个期限的总波动率 \(\Lambda_j\),以及它在各因子上的拆分 \(\lambda_{j,q}\)。通常 \(\Lambda\) 由当前市场数据确定,拆分由历史数据确定。

因子拆分。对远期利率的历史变动做主成分分析(第 22.9 节):

\[\Delta F_j=\sum_{q=1}^M\alpha_{j,q}x_q\]

\(\alpha_{j,q}\) 为因子载荷,\(x_q\) 为因子得分,\(s_q\) 为第 \(q\) 个因子得分的标准差。若使用全部 \(M\) 个因子,可以直接取 \(\lambda_{j,q}=\Lambda_js_q\alpha_{j,q}\) 的形式;通常只用 \(p<M\) 个因子,需要缩放使 \(\Lambda_j=\sqrt{\sum_{q=1}^p\lambda_{j,q}^2}\):

\[\lambda_{j,q}=\frac{\Lambda_js_q\alpha_{j,q}}{\sqrt{\sum_{q=1}^ps_q^2\alpha_{j,q}^2}}\tag{32.20}\]

\(\Lambda\) 的估计。(32.11) 在理论上可行,但实践中常使 \(\Lambda\) 剧烈摆动,有时甚至没有与上限报价完全一致的解。常用 31.8 节类似的方法:最小化

\[\sum_i(U_i-V_i)^2+P,\qquad P=\sum_iw_{1,i}(\Lambda_{i+1}-\Lambda_i)^2+\sum_iw_{2,i}(\Lambda_{i+1}+\Lambda_{i-1}-2\Lambda_i)^2\]

校准工具是欧式互换期权时,(32.18)/(32.19) 使模型价格能快速计算,Levenberg–Marquardt 最小化才可行;得到 \(\Lambda\) 后再用 (32.20) 得到 \(\lambda\)。

波动率偏斜

一些市场上,上限/下限的 Black 隐含波动率随执行价递减(偏斜)。可以用 CEV 版本(第 27.1 节):

\[dF_i(t)=\cdots+\sum_{q=1}^p\zeta_{i,q}(t)F_i(t)^\gamma dz_q\tag{32.21}\]

\(0<\gamma<1\)。处理方式与对数正态版本类似;上限/下限可以用非中心 \(\chi^2\) 分布解析定价,互换期权也有类似的解析近似(Andersen–Andreasen 2000)。

百慕大互换期权

百慕大互换期权(Bermudan swap option) 可以在标的互换的部分或全部付款日行权。LMM 依赖蒙特卡洛,而蒙特卡洛向前推进,难以处理提前行权。可用第 27.8 节的方法:

  • Longstaff–Schwartz 最小二乘法:把"不行权的价值"回归到因子值的多项式上;
  • Andersen 的最优行权边界参数化:他发现假设行权决策只依赖期权的内在价值,就能得到很好的结果。

多数交易员实际上用第 31 章的单因子无套利模型为百慕大期权定价。单因子模型对百慕大期权定价是否准确,学界有争议(Andersen–Andreasen 认为足够,Longstaff–Santa-Clara–Schwartz 认为会显著低估)。


32.3 处理多条零息曲线

危机前后的变化

2007 年危机之前,多数衍生品的支付和贴现都用同一条 LIBOR/互换曲线。现在有抵押的交易通常用 OIS 曲线贴现,所以依赖 LIBOR 的互换、上限、互换期权需要多条曲线:LIBOR 曲线决定支付,OIS 曲线用于贴现。

如果同时对两条曲线建模,并假设银行可以无风险地按两种利率借贷,就违背了无套利(借 OIS、贷 LIBOR 就能锁定利润)。另一种选择是对信用和流动性风险建模,从而解释 LIBOR–OIS 利差,但这太复杂。实务界的选择是:分别对 LIBOR 和 OIS 建模,不显式建模违约和流动性风险,并忽略多曲线带来的套利问题。

危机后连 LIBOR 也不止一条:从 1、3、6、12 个月 LIBOR 产品分别构造的曲线互不相同(12 个月期 LIBOR 贷款比连续 12 次滚动的 1 个月期贷款风险更大)。所以 LIBOR 产品在实践中至少要用 5 条零息曲线。

OIS 贴现下的远期 LIBOR

OIS 曲线可以用第 31 章的短期利率方法建模,也可以用 HJM/LMM 框架("LIBOR 市场模型"变成"OIS 市场模型")。

一个容易被忽视的要点:OIS 贴现下的远期 LIBOR 与 LIBOR 贴现下的远期 LIBOR 不同(第 9.3 节)。记 \(F_{LD}(t,t_1,t_2)\)、\(F_{OD}(t,t_1,t_2)\) 分别为 LIBOR 贴现和 OIS 贴现下的远期 LIBOR(都可以由 LIBOR 换固定互换的报价自举得到,例 9.2、9.3);\(P_{LD}\)、\(P_{OD}\) 为相应的零息债价格。

  • \(F_{LD}\) 在关于 \(P_{LD}(t,t_2)\) 的远期风险中性世界中是鞅(第 29.2 节 caplet 定价用的就是它),但一般不是关于 \(P_{OD}(t,t_2)\) 的鞅;
  • OIS 贴现时必须用 \(F_{OD}\):它是关于 \(P_{OD}(t,t_2)\) 的远期风险中性世界中的鞅,等于该世界中 \(t_1\) 到 \(t_2\) 的 LIBOR 的期望。

白话解释:两个"远期 LIBOR"之所以不同,是因为它们是在两套不同的计算权重下求的期望。\(F_{LD}\) 是"以 LIBOR 零息债记账"时对未来 LIBOR 的平均,\(F_{OD}\) 是"以 OIS 零息债记账"时的平均。两种零息债与 LIBOR 的相关性不同,权重就不同(第 28.8 节:差异 = 协方差)。 实务上的落点很简单:用 OIS 曲线贴现,就必须用"在 OIS 贴现下让市场互换报价为零"的那组远期 LIBOR,两者要从同一套自举流程里一起出来,不能从两个系统各取一半。

于是 OIS 贴现下的定价规则:

  • 互换:假设远期利率 \(F_{OD}\) 实现,用 OIS 贴现;
  • caplet/floorlet:仍用 (29.7)、(29.8),但 \(F_k=F_{OD}(0,t_k,t_{k+1})\),\(P(0,t_{k+1})=P_{OD}(0,t_{k+1})\);隐含波动率 \(\sigma_k\) 可能依赖贴现方式;
  • 互换期权:用 (29.10)、(29.11),年金因子取 \(A=\frac1m\sum_{i=1}^{mn}P_{OD}(0,T_i)\),远期互换利率由 \(F_{OD}\) 计算。

联合建模两条曲线

更复杂的产品要同时对两条曲线建模。

  • 方法一:LIBOR 和 OIS 短期利率服从相关的随机过程。缺点是 OIS 可能超过 LIBOR,不符合现实。
  • 更好的方法:用短期利率模型或 HJM/LMM 对 OIS 建模,再把 LIBOR–OIS 利差的期限结构作为非负变量单独建模。最简单的做法是假设利差等于远期利差(确定性利差)。

随机利差模型的关键观察:\(F_{OD}(t,t_i,t_{i+1})\) 和 \(t_i\) 到 \(t_{i+1}\) 的远期 OIS 利率在关于 \(P_{OD}(t,t_{i+1})\) 的远期风险中性世界中都是鞅,因此二者之差(远期利差)也是鞅。于是可以完全仿照 (32.10)/(32.15) 为远期利差建模:\(dF_k/F_k=\cdots+\sum_q\zeta_{k,q}dz_q\)(这里 \(F_k\) 指远期利差),32.2 节关于滚动远期风险中性测度的结果全部适用(Mercurio–Xie 2012)。


32.4 机构抵押支持证券

定义与提前还款

机构抵押支持证券(agency mortgage-backed security,agency MBS) 类似第 8 章的 ABS,但支付由政府相关机构(GNMA、FNMA 等)担保,投资者不受借款人违约的影响,看上去像普通的政府固定收益证券。关键区别在于:资产池中的抵押贷款有提前还款权(prepayment privileges)。美国房贷通常是 30 年期、可随时提前还款,相当于房主持有一个 30 年期的美式期权,可以按面值把贷款"卖回"给贷款人。

提前还款的原因多种多样:利率下降时再融资;房屋出售;等等。估值的关键是提前还款函数(prepayment function):用 \(t\) 时的收益率曲线和其他相关变量(例如曲线的历史路径)描述资产池在 \(t\) 时的期望提前还款率。对单笔贷款,这种预测很不可靠;但大量相似贷款组成资产池后,有"大数定律"效应,可以用历史数据较准确地预测。

总体上,利率低时提前还款更多:投资者在利率低、再投资收益差时被提前还本,利率高时却被"锁定"在低票息上。所以投资者要求 MBS 比其他固定收益证券更高的收益率,以补偿他们卖出的提前还款期权。这就是 MBS 的负凸性来源。

CMO

最简单的机构 MBS 是过手证券(pass-through):所有投资者收益相同、承担相同的提前还款风险。担保抵押贷款债券(collateralized mortgage obligation,CMO) 把投资者分成多个类别,规定本金偿还如何在各类之间分配,从而创造承担不同提前还款风险的证券(类似第 8 章 ABS 按信用风险分档)。

例:A、B、C 三类,所有本金(计划还款和提前还款)先全部给 A,A 还清后给 B,再给 C。A 承担最多的提前还款风险、期限最短;C 期限最长。风险大小取决于各档面值:面值 400/300/100 时,C 几乎没有提前还款风险;面值 100/200/500 时,C 的风险就较大。CMO 的目的是创造比简单过手证券更吸引机构投资者的证券。

IO 与 PO

Business Snapshot 32.1:剥离式 MBS(stripped MBS) 把本金和利息分开:所有本金给PO(principal only),所有利息给IO(interest only)。两者都是高风险品种,对提前还款率的敏感方向相反:

  • 提前还款加快:PO 更值钱(固定的本金更早收回),IO 更不值钱(利息总额减少);
  • 提前还款放慢:相反。

由于提前还款随利率下降而加快,IO 在利率下降时价值下跌——它是少有的"利率下降反而亏钱"的固定收益品种,常被用来对冲 MBS 组合的负凸性。

估值与期权调整利差

MBS 通常用蒙特卡洛估值:模拟国债利率的路径(可以用 HJM/LMM);每次试验中,每个月根据当时的曲线和曲线历史计算期望提前还款,得出持有人的期望现金流;以国债利率加一个利差贴现到 0,得到这条路径的价值;多次试验取平均。路径依赖(提前还款取决于曲线历史,例如"已经再融资过的人不会再融资")是必须用蒙特卡洛的原因。

期权调整利差(option-adjusted spread,OAS):考虑所有内嵌期权之后,工具相对国债收益率提供的利差。计算方法:用国债利率加某个利差贴现得到模型价格,与市场价格比较,迭代求使两者相等的利差,即 OAS。OAS 之于 MBS,类似收益率之于普通债券(原书习题 32.10):它是在剔除期权价值后衡量"便宜还是贵"的统一尺度。

金融直觉:和 CFA 里的利差概念对照:Z-spread 是"假设现金流固定、在整条即期曲线上加一个平行利差"使价格对上;OAS 是"在模型的每条利率路径上,现金流随提前还款变化,再加一个平行利差"使价格对上。两者之差约等于提前还款期权的成本:Z-spread − OAS ≈ 期权成本(以利差计)。 例如一只 MBS 的 Z-spread 为 120bp,OAS 为 40bp,说明 80bp 的额外收益只是对卖出提前还款期权的补偿,真正的"超额回报"只有 40bp。只看名义利差,就会把期权价值误当作便宜。注意 OAS 依赖于所用的利率模型、波动率和提前还款函数,换一个模型 OAS 会变。


32.5 小结与常见误区

HJM 与 LMM 让用户完全自由地选择波动率期限结构。LMM 相对 HJM 的两大优势:用决定上限定价的离散远期利率而不是瞬时远期利率表达;相对容易校准到上限或欧式互换期权价格。两者共同的缺点是:不能表示为重合树,通常需要蒙特卡洛,计算量远大于第 31 章的模型。

危机后有抵押衍生品用 OIS 贴现,互换、上限/下限、互换期权的估值要改用 OIS 贴现,并在合适的远期风险中性测度下计算远期利率和互换利率;更复杂的工具需要联合建模 OIS 与 LIBOR 曲线。美国机构 MBS 市场催生了 CMO、IO、PO 等强路径依赖的奇异利率衍生品,通常要用蒙特卡洛,是 HJM/LMM 的理想应用。

常见误区:

  1. 把 LIBOR 贴现下的远期 LIBOR 直接用于 OIS 贴现定价。
  2. 以为因子数对所有产品都不重要。普通上限与因子数无关,但依赖多个远期利率联合分布的产品(棘轮、黏性、弹性上限,以及互换期权相对上限的定价)与因子数有关。
  3. 用 (32.11) 直接剥离 \(\Lambda\),可能得到剧烈震荡的结果甚至无解;应使用带平滑惩罚的最小二乘。

量化实战

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

定价与系统实现。LMM 蒙特卡洛(冻结漂移 + 对偶变量 + PCA 因子拆分)是利率奇异产品定价引擎的标准实现。百慕大期权的 Longstaff–Schwartz 回归是通用的美式蒙特卡洛技术。多曲线框架(OIS 贴现 + 各期限的基准利率曲线)是任何利率定价系统的基础,国内对应 FR007、Shibor 等互换曲线与贴现曲线的区分。

风险建模。用 PCA 分解远期利率的变动(水平、斜率、曲率)直接用于利率风险因子模型和情景生成。多因子对相关性敏感产品的影响提醒我们:风险系统中利率因子的个数不是"技术细节",它会直接改变某些产品的价值和对冲比率。

固收量化。MBS 的提前还款建模和 OAS 是固收相对价值分析的核心指标;IO/PO 对利率的非线性敞口是负凸性的典型例子。

对股票因子研究和回测:基本无直接关联。

Python 示例:LMM 蒙特卡洛、棘轮/黏性上限与 PCA 因子拆分

程序分三部分:

  1. 用表 32.1 剥离 \(\Lambda\),按 (32.14) 写单因子 LMM 的冻结漂移模拟(20 万条路径,对偶变量),用滚动贴现给普通 caplet 定价并与 Black 公式比较——这是检验 LMM 实现的标准单元测试;
  2. 复现原书表 32.2/32.3 的单因子棘轮和黏性 caplet;
  3. 对模拟的远期利率日变动做 PCA,按 (32.20) 把 \(\Lambda_j\) 拆分到两个因子上。
import numpy as np
from scipy.stats import norm

# 表 32.1:年度 caplet 的 Black 波动率 -> 剥离出 LMM 的 Lambda_i
sig_black = np.array([15.50,18.25,17.91,17.74,17.27,16.79,16.30,16.01,15.76,15.54])/100
k = np.arange(1, 11)
Lam = np.sqrt(np.diff(np.r_[0, k*sig_black**2]))          # 式 (32.11),delta=1

N = 11                         # 远期利率 F_0..F_10,覆盖 t=0..11 年
delta = 1.0
F0 = np.full(N, np.exp(0.05)-1)   # 平坦 5% 连续复利 = 5.127% 年复利
spread = 0.0025

def simulate(n_paths, seed=0):
    """单因子 LMM,冻结漂移的离散格式 (32.14)。返回实现利率 R[path, k]=F_k(t_k)。"""
    rng = np.random.default_rng(seed)
    half = n_paths//2
    eps = rng.standard_normal((half, N))
    eps = np.vstack([eps, -eps])                 # 对偶变量
    F = np.tile(F0, (n_paths, 1))
    R = np.empty((n_paths, N)); R[:, 0] = F0[0]
    for j in range(N-1):                         # 从 t_j 推进到 t_{j+1}
        live = np.arange(j+1, N)                 # 仍未重置的远期利率
        lam = Lam[live-j-1]                      # Lambda_{k-j-1}
        x = delta*F[:, live]*lam/(1+delta*F[:, live])
        drift = np.cumsum(x, axis=1)*lam - 0.5*lam**2
        F[:, live] = F[:, live]*np.exp(drift*delta + lam*eps[:, [j]]*np.sqrt(delta))
        R[:, j+1] = F[:, j+1]
    return R

R = simulate(200_000)
# 滚动贴现:t_{k+1} 支付贴现到 0 = prod_{i<=k} 1/(1+delta R_i)
disc = np.cumprod(1/(1+delta*R), axis=1)

# 1) 普通 caplet:MC vs Black
K = F0[0]
for kk in [1, 5, 10]:
    x = 100*delta*np.maximum(R[:, kk]-K, 0)*disc[:, kk]
    mc, se = x.mean(), x.std()/np.sqrt(len(x))
    s = sig_black[kk-1]; T = kk
    d1 = (np.log(F0[kk]/K)+s*s*T/2)/(s*np.sqrt(T)); d2 = d1-s*np.sqrt(T)
    black = 100*delta*np.exp(-0.05*(kk+1))*(F0[kk]*norm.cdf(d1)-K*norm.cdf(d2))
    print(f"caplet 起点 {kk:2d} 年: LMM-MC={mc:.4f}(±{se:.4f})  Black={black:.4f}")

# 2) 棘轮与黏性 caplet
Kr = R[:, :-1] + spread                       # 棘轮:K_{j+1}=R_j+s
pay_r = np.maximum(R[:, 1:]-Kr, 0)
Ks = np.empty_like(R); Ks[:, 0] = R[:, 0]     # 黏性:K_{j+1}=min(R_j,K_j)+s
for j in range(N-1):
    Ks[:, j+1] = np.minimum(R[:, j], Ks[:, j]) + spread
pay_s = np.maximum(R[:, 1:]-Ks[:, 1:], 0)
for kk in [1, 5, 10]:
    vr = 100*np.mean(pay_r[:, kk-1]*disc[:, kk])
    vs = 100*np.mean(pay_s[:, kk-1]*disc[:, kk])
    print(f"起点 {kk:2d} 年: 棘轮={vr:.3f}  黏性={vs:.3f}")

# 3) 因子拆分:对(模拟的)远期利率日变动做 PCA,按式 (32.20) 拆分 Lambda
rng = np.random.default_rng(1)
load_true = np.vstack([np.ones(10),                  # 水平
                       np.linspace(-1, 1, 10),       # 斜率
                       (np.linspace(-1, 1, 10))**2-0.35])   # 曲率
f = rng.standard_normal((2500, 3))*np.array([6, 2.5, 1.0])  # 因子日变动(bp)
dF = f@load_true + 0.3*rng.standard_normal((2500, 10))
eigval, eigvec = np.linalg.eigh(np.cov(dF, rowvar=False))
idx = np.argsort(eigval)[::-1]; eigval, eigvec = eigval[idx], eigvec[:, idx]
print("\n前三个主成分解释的方差比例:", np.round(eigval[:3]/eigval.sum(), 4))
p = 2
s_q, alpha = np.sqrt(eigval[:p]), eigvec[:, :p]       # 因子得分标准差、因子载荷
alpha = alpha*np.sign(alpha[-1])                     # 特征向量符号任意,统一为长端为正
lam = Lam[:, None]*s_q*alpha/np.sqrt(((s_q*alpha)**2).sum(axis=1, keepdims=True))   # (32.20)
print("两因子分量 lambda_{j,1}, lambda_{j,2} (%),以及平方和开方:")
for j in [0, 4, 9]:
    print(f"  j={j}: {100*lam[j,0]:6.2f} {100*lam[j,1]:6.2f}  -> {100*np.sqrt((lam[j]**2).sum()):.2f} = Lambda_{j}")

关键输出:

caplet 起点  1 年: LMM-MC=0.2862(±0.0010)  Black=0.2866
caplet 起点  5 年: LMM-MC=0.5799(±0.0022)  Black=0.5815
caplet 起点 10 年: LMM-MC=0.5710(±0.0021)  Black=0.5741
起点  1 年: 棘轮=0.194  黏性=0.194
起点  5 年: 棘轮=0.187  黏性=0.483
起点 10 年: 棘轮=0.152  黏性=0.483

前三个主成分解释的方差比例: [0.9309 0.0638 0.0036]
两因子分量 lambda_{j,1}, lambda_{j,2} (%),以及平方和开方:
  j=0:  14.26  -6.07  -> 15.50 = Lambda_0
  j=4:  15.23  -0.65  -> 15.25 = Lambda_4
  j=9:  12.47   4.91  -> 13.40 = Lambda_9

读法:

  • 普通 caplet 的 LMM 价格与 Black 价格相差都在 1.5 个标准误以内,印证了"冻结漂移近似无害"的结论,也说明剥离出的 \(\Lambda\) 与 caplet 报价一致。
  • 单因子棘轮 caplet 0.194/0.187/0.152、黏性 caplet 0.194/0.483/0.483,与原书单因子列 0.196/0.187/0.153 和 0.196/0.484/0.488 吻合到蒙特卡洛误差量级(剩余差别来自随机数和第一期执行价的细节约定)。黏性 caplet 远贵于棘轮:黏性执行价以"封顶后的利率"为基础,利率持续上升时执行价跟不上,期权深度价内。
  • PCA 的第一主成分(水平)解释了 93% 的方差。按 (32.20) 拆分后,每个期限两个分量的平方和恰好还原 \(\Lambda_j\),即拆分只改变相关结构,不改变总波动率——这正是"普通上限价格与因子数无关"的数学原因。第二个分量从负变正,体现斜率因子:短端和长端在这个因子上反向变动,从而降低了两者的相关性。

要把这段代码升级为多因子,只需把 eps[:, [j]] 换成 \(p\) 维正态向量,把漂移中的 \(\Lambda_i\Lambda_k\) 换成 \(\sum_q\lambda_{i,q}\lambda_{k,q}\)(式 32.16)。读者可以用两因子版本重算棘轮 caplet,验证它比单因子更贵。


本章小结

HJM 框架从零息债的风险中性过程出发,得出瞬时远期利率的漂移必须满足 \(m=s\int_t^Ts\,d\tau\):风险中性下,远期利率的漂移由波动率唯一确定。一般 HJM 是非马尔可夫的,需要蒙特卡洛;Ho–Lee 和 Hull–White 是可以用重合树实现的特例。LMM 把同样的思想用于可观察的离散远期利率:每个 \(F_k\) 在自己的远期测度下是对数正态鞅,与 Black caplet 公式一致;在滚动远期测度下统一模拟所有远期利率,漂移由 (32.10)/(32.15) 给出。校准时,总波动率 \(\Lambda\) 由上限或互换期权价格确定,因子拆分由历史数据的 PCA 确定。依赖多个远期利率联合分布的产品对因子数敏感。危机后的多曲线框架要求用 OIS 贴现、用 \(F_{OD}\) 作为远期 LIBOR,并把 LIBOR–OIS 利差作为非负变量单独建模。机构 MBS 的提前还款期权使其具有负凸性,通常用蒙特卡洛和 OAS 分析。

概念 公式 / 要点
HJM 远期利率过程 \(dF(t,T)=vv_T\,dt-v_T\,dz\)
HJM 漂移条件 \(m=s\int_t^Ts\,d\tau\);多因子 \(m=\sum_ks_k\int_t^Ts_k\,d\tau\)
HJM 特例 \(s=\sigma\) → Ho–Lee;\(s=\sigma e^{-a(T-t)}\) → Hull–White
LMM 远期测度 \(dF_k=\zeta_kF_k\,dz\)(关于 \(P(t,t_{k+1})\))
LMM 滚动远期测度 \(\dfrac{dF_k}{F_k}=\sum_{i=m(t)}^k\dfrac{\delta_iF_i\zeta_i\zeta_k}{1+\delta_iF_i}dt+\zeta_kdz\)
波动率剥离 \(\sigma_k^2t_k=\sum_{i=1}^k\Lambda_{k-i}^2\delta_{i-1}\)
因子拆分 \(\lambda_{j,q}=\Lambda_js_q\alpha_{j,q}/\sqrt{\sum_qs_q^2\alpha_{j,q}^2}\)
因子数的影响 普通上限无关;棘轮、黏性、弹性上限、互换期权有关
OIS 贴现 用 \(F_{OD}\)(关于 \(P_{OD}(t,t_2)\) 的鞅)
MBS 提前还款函数、CMO 分档、IO/PO、OAS

练习

基础

  1. 解释马尔可夫与非马尔可夫短期利率模型的区别,以及为什么非马尔可夫模型不能用重合树实现(原书习题 32.1)。 提示:非马尔可夫时同一节点的利率值可能对应不同的未来分布,节点无法合并。

  2. 在 HJM 中取 \(s(t,T)=\sigma\),用 (32.5) 求瞬时远期利率漂移,并说明它与 Ho–Lee 模型的关系(原书习题 32.3)。 提示:\(m=\sigma^2(T-t)\);对 \(F(t,t)=r(t)\) 求微分可得 \(\theta(t)=F_t(0,t)+\sigma^2t\)。

  3. 复算例 32.1;若第 4 个 caplet 的 Black 波动率为 19%,\(\Lambda_3\) 是多少?若为 16% 呢? 提示:\(\Lambda_3^2=4\times0.19^2-3\times0.20^2=0.0244\),\(\Lambda_3=15.6\%\);若为 16%,\(\Lambda_3^2=0.1024-0.12<0\),无解——这正是直接剥离可能失败的例子。

  4. 为什么棘轮上限的价值随因子数增加而增加?为什么黏性上限比棘轮上限贵(原书习题 32.6、32.8)? 提示:因子越多,相邻远期利率相关性越低;黏性的执行价基于封顶后的利率,偏低。

  5. 解释 IO 和 PO 对提前还款率的敏感性为何方向相反;利率下降 100bp 时,IO 和 PO 各自的价格怎样变化(原书习题 32.9)。

进阶

  1. 证明当 \(\delta_i\to0\) 时 (32.10) 退化为 HJM 的 (32.4)(原书习题 32.7)。 提示:把求和写成黎曼和,\(\delta_iF_i/(1+\delta_iF_i)\to F\,d\tau\),并注意 \(s(t,T)=\zeta F\) 的对应关系。

  2. 推导多因子 HJM 漂移条件 (32.6) 和多因子 LMM 的漂移 (32.15)(原书习题 32.2、32.11)。

  3. 用 Itô 引理推导互换利率方差公式 (32.17)(原书习题 32.12、32.13)。 提示:先对 \(\ln s\) 关于 \(\ln(1+\tau_kG_k)\) 求偏导,得到 \(\gamma_k\)。

  4. 把本章代码扩展为两因子 LMM(用代码第 3 部分得到的 \(\lambda_{j,q}\)),重算棘轮 caplet,与单因子结果比较;再实现原书的弹性上限(至多 5 个价内 caplet 行权),与原书 3.43/3.58 比较。 提示:弹性上限在每条路径上按时间顺序行权前 5 个价内 caplet。

  5. 设计一个简化的 MBS 估值器:用 Hull–White 模型模拟短期利率,提前还款率取 \(\text{CPR}=0.06+0.5\max(c-R_{10},0)\)(\(c\) 为贷款利率,\(R_{10}\) 为模拟的 10 年利率),计算 30 年期过手证券的价格,再迭代求 OAS。 提示:每月现金流 = 计划本息 + 提前还款;OAS 用 brentq 求解。观察利率下降时价格上涨幅度小于不含期权债券(负凸性)。

原书推荐习题:32.1(马尔可夫与非马尔可夫);32.2、32.11(多因子 HJM 漂移条件与多因子 LMM 漂移);32.3、32.4(HJM 的两个特例给出 Ho–Lee 和 Hull–White,理解 HJM 与短期利率模型关系的关键);32.7(\(\delta\to0\) 时 LMM 退化为 HJM);32.6、32.8(棘轮上限随因子数增值、黏性上限比棘轮上限贵的直观解释);32.12、32.13(互换利率方差公式的推导);32.14(从 caplet 波动率剥离 LMM 远期波动率);32.15(不同定义的弹性上限的定价难点);32.9、32.10(IO/PO 敏感性,OAS 与收益率的类比)。


原书对照

本章小节 原书章节 PDF 页码
章首导言 Chapter 32 introduction p.763
32.1 HJM 模型 32.1 The Heath, Jarrow, and Morton Model p.763–766
32.2 LIBOR 市场模型(例 32.1、32.2,表 32.1–32.5) 32.2 The LIBOR Market Model p.765–775
32.3 多条零息曲线 32.3 Handling Multiple Zero Curves p.775–777
32.4 机构 MBS(Business Snapshot 32.1) 32.4 Agency Mortgage-Backed Securities p.777–779
小结、延伸阅读、习题 Summary, Further Reading, Practice Questions 32.1–32.15 p.779–782

注:PDF 页码 = 书页码 + 1。