第 31 章 利率衍生品:短期利率模型
第 29 章的 Black 类模型假设某个未来时刻的利率、债券价格或互换利率服从对数正态分布。它们适合欧式利率上限、欧式债券期权和欧式互换期权,但有一个根本局限:它们不描述利率如何随时间演化。百慕大互换期权、美式债券期权、可赎回债、各种结构化票据,其价值取决于利率在多个时点上的联合行为,Black 模型无能为力。
为此需要期限结构模型(term structure model):描述所有零息利率如何共同演化的模型。本章的思路是只对一个变量建模——短期利率 \(r\)。一旦 \(r\) 在风险中性世界中的过程确定,整条零息曲线以及它的全部未来演化就随之确定。
本章内容由浅入深分四层:
- 均衡模型(Rendleman–Bartter、Vasicek、CIR):从经济假设出发,参数不随时间变化,当前零息曲线是模型的输出;
- 无套利模型(Ho–Lee、Hull–White、BDT、Black–Karasinski):引入时间函数 \(\theta(t)\),把当前零息曲线当作输入精确拟合;
- 数值实现:Hull–White 两阶段三叉树——业界最常用的利率树构造方法;
- 校准与对冲:如何从上限和互换期权价格确定波动率参数,以及为什么"用单因子定价、用多因子对冲"。
本章只对一条无风险零息曲线建模。OIS 贴现成为主流之后,常见做法是对 OIS 曲线建模,再单独为 OIS–LIBOR 利差建模,见第 32.3 节。顺带一提,期限结构模型的好处之一是不再需要第 30 章的凸性和时间调整:模型自己就把这些效应算进去了。
学习目标
- 写出短期利率模型下零息债价格的风险中性表达式和利率衍生品偏微分方程,解释"仿射期限结构"的含义。
- 掌握 Vasicek 与 CIR 模型的过程、零息债闭式解及二者差别;会用 AR(1) 回归估计 Vasicek 的现实世界参数,并用风险市场价格换算到风险中性世界。
- 理解均衡模型与无套利模型的区别,写出 Ho–Lee 和 Hull–White 模型的 \(\theta(t)\) 及零息债公式,用 Jamshidian 分解为附息债期权定价。
- 能独立编写 Hull–White 两阶段三叉树:对称 \(R^*\) 树、分叉切换、Arrow–Debreu 价格前向归纳拟合初始曲线,并用解析解检验。
- 说明模型校准的目标函数、平滑惩罚和校准工具选择,理解"非平稳波动率结构"的代价和"模型外对冲"的必要性。
读前导读
这一章在解决什么问题
你在 CFA 固定收益里给含权债估值时,用过一棵二叉利率树:每个节点是一年期远期利率,树经过校准,使它给出的不含权债价格等于市场价格,然后在节点上检查是否赎回,倒推得到可赎回债价值,再算出 OAS。本章就是那棵树背后的完整理论和工业级做法。
核心想法:只对"短期利率"这一个变量建模,整条收益率曲线就跟着定下来了。 原因是任何期限的零息债价格都等于"沿各条未来利率路径滚动贴现"的平均值,\(P(0,T)=\hat E[e^{-\int_0^Tr\,dt}]\)。你给出短期利率怎么随机演化,就等于给出了每个期限的贴现因子,也就是整条收益率曲线。
本章介绍两类模型:
- 均衡模型(Vasicek、CIR):参数是常数,收益率曲线是模型的输出。好比用三五个参数的公式去"拟合"收益率曲线,形状有限,通常对不上市场。
- 无套利模型(Ho–Lee、Hull–White、BDT、Black–Karasinski):多加一个随时间变化的函数 \(\theta(t)\),专门用来让模型曲线与今天的市场曲线完全吻合,曲线是输入。这正是 CFA 那棵"校准到市场价格"的树。交易员只接受这一类,因为模型连标的债券都定不准,期权价格就没法信。
然后是怎么把模型变成一棵可以计算的树(31.7 节,Hull–White 三叉树),以及怎么从市场上的上限和互换期权价格确定波动率参数(校准)。
和你熟悉的知识连接:均值回归的利率模型在离散时间里就是 AR(1) 回归,\(\Delta r\) 对 \(r\) 回归,斜率为负表示均值回归,这就是 CFA 二级时间序列那一节。\(B(t,T)\) 扮演"对短期利率的久期"的角色。
需要先想起来的数学
1. 积分与平均。 \(\int_0^Tr\,dt\) 是利率路径下方的面积,\(=T\times\bar r\)(平均利率)。\(e^{-\int_0^Tr\,dt}\) 就是沿这条路径连续滚动的贴现因子。见 第 00 册第 03 章 积分。
2. 偏导数与偏微分方程(PDE)。 \(\partial f/\partial r\) 是"只让 \(r\) 变、\(t\) 不动时 \(f\) 的变化率",就是对短期利率的 delta。PDE (31.5) 只是"无风险组合赚无风险利率"写成导数的形式,和 BSM 方程同一来源。见 第 00 册第 05 章 多元微积分与优化。
3. 简单的常微分方程。 形如 \(B'=aB-1\)、\(B(T)=0\) 的方程,解是 \(B=(1-e^{-a(T-t)})/a\)。可以直接代回验证:对 \(t\) 求导得 \(-e^{-a(T-t)}\),而 \(aB-1=-e^{-a(T-t)}\),相等。读本章不需要会解,会代回验证就够。
4. 指数衰减与半衰期。 \(e^{-at}\) 每过 \(\ln2/a\) 年减半。\(a=0.1\) 时半衰期约 6.9 年:利率偏离长期水平的部分,约 7 年后剩一半。
5. 均值、方差匹配。 三叉树的概率通过"三个概率之和为 1、均值对上、方差对上"三个方程解出。见 第 00 册第 07 章 期望与矩一节。
怎么读这一章
必读:31.1(全章的出发点);31.2 中的 Vasicek 模型、仿射期限结构和例 31.2(现实世界与风险中性参数的转换);31.3 中"为什么交易员不接受均衡模型"和 Hull–White 模型;31.6 两步树例子;31.7 两阶段建树(本章最需要动手的部分,建议对照数值例逐步算一遍,或运行代码);31.9 对冲原则。
第一次可以只看结论:CIR 的闭式解公式、Vasicek 闭式解的 ODE 推导、BDT/Black–Karasinski/两因子模型的细节、31.4 中零息债期权的公式(知道它是 Black 公式的变体即可)、31.7 中"推广到其他模型"与"树与解析结果结合"、31.8 校准中的惩罚项细节。
31.1 背景
短期利率决定一切
无风险短期利率 \(r\)(瞬时短期利率,instantaneous short rate)是时刻 \(t\) 适用于无穷小时间区间的利率。债券和衍生品的价格只取决于 \(r\) 在风险中性世界中的过程,现实世界中的过程不用于定价。除非特别说明,本章所有过程都是传统风险中性世界中的过程:在 \(t\) 到 \(t+\Delta t\) 之间,投资者平均赚取 \(r(t)\Delta t\)。
由式 (28.19),在 \(T\) 时刻支付 \(f_T\) 的利率衍生品在 \(t\) 时刻的价值为
其中 \(\bar r\) 是 \(r\) 在 \([t,T]\) 上的平均值,\(\hat E\) 表示传统风险中性期望。特别地,零息债价格为
连续复利零息利率 \(R(t,T)\) 满足 \(P(t,T)=e^{-R(t,T)(T-t)}\),因此
这两个式子说明:一旦确定 \(r\) 的风险中性过程,初始零息曲线及其未来演化就全部确定了。
白话解释:(31.2) 可以这样读:假想把 1 元钱存进隔夜账户,每天按当天利率滚动,\(T\) 年后变成 \(e^{\int r}\) 元。反过来,\(T\) 年后的 1 元今天值 \(e^{-\int r}\) 元。利率路径不确定,就对所有可能的路径求平均(在风险中性权重下),得到零息债价格。 数值感觉:若利率恒为 3%,5 年零息债为 \(e^{-0.15}=0.861\)。若利率路径有一半可能平均 2%、一半可能平均 4%,则 \(P=\tfrac12(e^{-0.10}+e^{-0.20})=0.8618\),略高于 0.861,零息利率略低于 3%。这个"波动让长期利率偏低"的效应就是收益率曲线上的凸性效应,模型会自动算进去。
利率版的 BSM 方程
设 \(dr=m(r,t)dt+s(r,t)dz\)。对依赖 \(r\) 和 \(t\) 的衍生品价格 \(f\) 用 Itô 引理,再利用"无收益交易资产在风险中性世界中以 \(r\) 的速度增长",得到
它在结构上就是利率版的 BSM 方程。不同的衍生品对应不同的边界条件;零息债 \(P(t,T)\) 是满足 \(P(T,T)=1\) 的特解。
推导拆解:两步。 (1) 伊藤引理(二阶泰勒展开,保留 \((dr)^2=s^2dt\)):\(df=\big(f_t+mf_r+\tfrac12s^2f_{rr}\big)dt+sf_r\,dz\),下标表示偏导。 (2) 在风险中性世界里,任何不付息的交易资产期望增长率为 \(r\),即 \(df\) 的漂移 \(=rf\)。令两者相等就是 (31.5)。 注意这里的 \(m\) 是风险中性漂移。现实世界的漂移不会出现在定价方程中,这和 BSM 方程里没有股票真实期望收益 \(\mu\) 是同一个道理。
31.2 均衡模型
均衡模型(equilibrium model) 从关于经济变量的假设出发,推出 \(r\) 的过程,再推出债券和期权价格。单因子均衡模型的形式为
漂移和波动只依赖 \(r\),不依赖时间。
先澄清一个常见误解:单因子不等于平行移动。单因子只意味着短时间内所有利率朝同一方向变动,变动幅度可以不同,所以零息曲线的形状仍然可以变化。
三个经典模型的漂移 \(m\) 和波动 \(s\):
| 模型 | \(m(r)\) | \(s(r)\) |
|---|---|---|
| Rendleman–Bartter | \(\mu r\) | \(\sigma r\) |
| Vasicek | \(a(b-r)\) | \(\sigma\) |
| Cox–Ingersoll–Ross(CIR) | \(a(b-r)\) | \(\sigma\sqrt r\) |
Rendleman–Bartter 与均值回归
Rendleman–Bartter 模型 \(dr=\mu r\,dt+\sigma r\,dz\) 让 \(r\) 服从几何布朗运动,可以像股票一样用二叉树表示。它的缺陷是没有均值回归(mean reversion)。
利率看起来会被拉回某个长期平均水平:\(r\) 高时漂移为负,\(r\) 低时漂移为正(原书图 31.1)。经济理由是:利率高时经济放缓、借款需求下降,利率回落;利率低时借款需求上升,利率回升。股票价格没有均值回归是因为它是交易资产,可预测的回归会产生套利;而利率不是交易资产的价格,均值回归并不意味着市场无效(原书习题 31.3)。
Vasicek 模型
\(a,b,\sigma\) 为非负常数:\(r\) 以速度 \(a\) 被拉向长期水平 \(b\),叠加一个正态随机项。\(r\) 服从 Ornstein–Uhlenbeck 过程,因此是正态分布的。
零息债价格有闭式解:
\(a=0\) 时 \(B=T-t\),\(A=\exp[\sigma^2(T-t)^3/6]\)。
推导思路。在 PDE (31.5) 中代入 \(m=a(b-r)\)、\(s=\sigma\),猜测解的形式 \(f=A(t,T)e^{-B(t,T)r}\)。代入后得
\(r\) 的系数和常数项分别为零,得到两个常微分方程:
边界条件 \(A(T,T)=1\)、\(B(T,T)=0\) 保证 \(P(T,T)=1\)。解第一个方程得 (31.7),再积分第二个得 (31.8)。
推导拆解:把 \(f=Ae^{-Br}\) 代入 PDE 时各项分别是:\(f_t=(A_t-AB_tr)e^{-Br}\),\(f_r=-ABe^{-Br}\),\(f_{rr}=AB^2e^{-Br}\)。代入后两边同除 \(e^{-Br}\) 就是原文那一行。 "\(r\) 的系数和常数项分别为零"的理由:这个等式要对所有 \(r\) 成立,而它是 \(r\) 的一次函数,只有斜率和截距都为 0 才行。\(r\) 的系数:\(-AB_t+aAB-A=0\),除以 \(A\) 得 \(B_t-aB+1=0\)。常数项:\(A_t-abAB+\tfrac12\sigma^2AB^2=0\)。 验证 (31.7):\(B=(1-e^{-a(T-t)})/a\),\(B_t=-e^{-a(T-t)}\),\(aB-1=-e^{-a(T-t)}\),两者相等,且 \(t=T\) 时 \(B=0\)。 这个"猜一个指数形式代进去"的技巧之所以成功,是因为漂移和方差都是 \(r\) 的线性函数(Vasicek 方差为常数,CIR 方差 \(\sigma^2r\) 也是线性的),这正是"仿射"一词的来源。
CIR 模型
漂移与 Vasicek 相同,但短期变动的标准差与 \(\sqrt r\) 成比例:利率越高,波动越大。零息债价格形式仍是 \(P=Ae^{-Br}\),但
其中 \(\gamma=\sqrt{a^2+2\sigma^2}\)。对应的常微分方程为 \(B_t-aB-\tfrac12\sigma^2B^2+1=0\) 与 \(A_t-abAB=0\)(下标表示偏导)。\(B\) 的方程是 Riccati 方程,这正是 CIR 的 \(B\) 比 Vasicek 复杂的原因。
两个模型的共同性质:仿射期限结构
由 \(P=Ae^{-Br}\) 直接得
零息利率为
即每个期限的零息利率都是 \(r(t)\) 的线性函数,这类模型称为仿射期限结构模型(affine term structure model)。\(r(t)\) 决定曲线的水平;曲线的形状与 \(r(t)\) 无关,只依赖 \(t\),可以向上倾斜、向下倾斜或略呈驼峰(原书图 31.2)。若需要更丰富的曲线变动,可用 Longstaff–Schwartz (1992) 等两因子均衡模型。
金融直觉:仿射意味着"\(T\) 年零息利率 = 截距 + 斜率 × 短期利率",斜率是 \(B(t,T)/(T-t)\)。在 Vasicek 中 \(a=0.1\) 时,1 年期斜率约 0.95,10 年期约 0.63,30 年期约 0.32:短期利率上升 100bp,1 年利率升约 95bp,10 年利率只升约 63bp。这就是"短端波动大、长端波动小",也是单因子模型下曲线会变平或变陡的原因。 但所有期限的变动都由同一个 \(dz\) 驱动、方向永远一致,所以单因子模型无法产生"短端涨、长端跌"的扭转。这也是 31.9 节强调对冲要超出模型的原因。
替代久期
第 4 章的修正久期 \(D\) 由 \(\Delta Q/Q=-D\Delta y\) 定义,衡量的是对平行移动的敏感度。在 Vasicek 或 CIR 中,可以定义对短期利率的敏感度
对零息债,由 (31.9) 得 \(\hat D=B(t,T)\)。
例 31.1 4 年期零息债的修正久期 \(D=4\),平行移动 10bp 使价格下降约 0.4%。在 \(a=0.1\) 的 Vasicek 模型中,\(\hat D=B(0,4)=(1-e^{-0.4})/0.1=3.30\),即短期利率上升 10bp 使价格下降约 0.33%。因为均值回归,短期利率的冲击会随期限衰减,长期利率变动小于短期利率变动,所以债券对短期利率的敏感度小于对平行移动的敏感度。
零息债组合(第 \(i\) 只本金 \(c_i\))的 \(\hat D=\sum_i\dfrac{c_iP(t,T_i)}{Q}\hat D_i\);附息债的 \(\hat D\) 是成分零息债 \(\hat D\) 的加权平均。凸性也可以类似定义(原书习题 31.21)。
债券价格过程
零息债是交易资产,风险中性期望增长率为 \(r\)。由 Itô 引理和 (31.9):
- Vasicek:\(dP=rP\,dt-\sigma B(t,T)P\,dz\);
- CIR:\(dP=rP\,dt-\sigma\sqrt r\,B(t,T)P\,dz\)。
债券价格波动率 \(\sigma B(t,T)\) 随期限上升,但因均值回归,上升得越来越慢,最终趋于 \(\sigma/a\)。
参数可比性与非负性
比较两个模型时,可以取相同的 \(a,b\),并令 \(\sigma_{vas}\approx\sigma_{cir}\sqrt r\)。例如 \(r=4\%\)、\(\sigma_{vas}=0.01\),对应 \(\sigma_{cir}=0.01/\sqrt{0.04}=0.05\)。
Vasicek 下 \(r\) 服从正态分布,可以为负;CIR 下 \(r\) 不可能为负,而且当 \(2ab>\sigma^2\)(Feller 条件)时 \(r\) 不会到达 0。
均衡模型的用途:长期情景分析
给衍生品定价时,模型应精确拟合当前零息曲线(下一节)。但均衡模型在另一类问题上很有用:长期情景分析。养老金和保险公司关心 20 年后组合的价值分布,用蒙特卡洛模拟时,当前曲线的精确形状影响不大,而参数稳定、经济含义清楚的均衡模型很合适。
参数估计有两条途径:
- 用短期利率的历史数据(以 1 个月或 3 个月利率作代理),把 \(\Delta r\) 对 \(r\) 回归或用最大似然法(原书习题 31.13)。这样得到的是现实世界参数。
- 拟合债券价格:用优化器最小化模型价格与市场价格之差的平方和。这样得到的是风险中性参数。
情景分析需要两者兼用:短期利率的路径用现实世界过程模拟,每个时点上的完整曲线用风险中性参数和闭式公式计算。
从现实世界到风险中性世界,短期利率的波动率不变,漂移改变。改变量由利率风险的市场价格(market price of interest rate risk)\(\lambda\) 决定。Ahmad 与 Wilmott 比较零息曲线斜率与短期利率的现实漂移,估计美国长期平均 \(\lambda\approx-1.2\),但它随时间变化很大;在压力时期(如 2007–2009 年信用危机,"恐惧因子"高)\(\lambda\) 是比 \(-1.2\) 更负的数。
例 31.2 用离散 Vasicek 模型
拟合 10 年的周数据。把 \(\Delta r\) 对 \(r\) 回归:斜率 \(-0.004\),截距 0.00016,回归标准误 0.001。\(\Delta t=1/52\),于是
解得 \(a=0.21\),\(b=0.04\),\(\sigma=0.0072\):短期利率以每年 21% 的速度回归到 4%,比例波动率为 \(0.72\%/r\)。
推导拆解:把离散模型展开成回归形式:\(\Delta r=ab\Delta t-a\Delta t\cdot r+\sigma\sqrt{\Delta t}\,\varepsilon\)。对照 OLS 方程 \(\Delta r=\beta_0+\beta_1r+e\):截距 \(\beta_0=ab\Delta t\),斜率 \(\beta_1=-a\Delta t\),残差标准差 \(=\sigma\sqrt{\Delta t}\)。 于是 \(a=-\beta_1/\Delta t=0.004\times52=0.208\);\(b=\beta_0/(-\beta_1)=0.00016/0.004=0.04\);\(\sigma=0.001\times\sqrt{52}=0.0072\)。这和 CFA 里的 AR(1) 完全一样:\(\beta_1<0\) 说明均值回归,均值回归水平 \(=\) 截距 \(/(1-\)自回归系数\()\),这里自回归系数是 \(1+\beta_1\)。 白话解释:接下来的 \(\lambda\) 是利率风险的市场价格(第 28 章)。\(\lambda<0\) 时,风险中性世界里的长期利率水平 \(b^*\) 比现实世界的 \(b\) 更高。直观上:持有长期债券要承担利率上升的风险,投资者要求期限溢价。风险中性世界里没有风险溢价,只能用"利率在风险中性权重下平均更高"来让长期债券价格对上市场,于是 \(b^*>b\)。所以 \(b^*\) 是计算工具,不是对利率长期走势的预测。
转换到风险中性世界:比例漂移 \(a(b-r)/r\) 减少 \(\lambda\sigma/r\),所以
取 \(\lambda=-1.2\),按上面估计的参数
勘误说明:原书此处代入的是 \(\sigma=0.01\)、\(a=0.2\),写成 \(b^*=0.04+1.2\times0.01/0.2=0.10\),与前文刚估计出的 \(\sigma=0.0072\)、\(a=0.21\) 不一致。按本例自身的参数,\(b^*\) 约为 0.081(取 \(a=0.208\)、\(\sigma=0.00721\) 未经四舍五入时为 0.0816)。方法本身不受影响。
之后可在模拟的每个时点,用 (31.6)–(31.8)(以 \(b^*\) 代替 \(b\))算出完整零息曲线。
例 31.3 用 CIR 模型拟合一组债券价格,得风险中性参数 \(a=0.15\)、\(b=0.06\)、\(\sigma=0.05\)。比例漂移为 \(a(b-r)/r\),比例波动率为 \(\sigma/\sqrt r\)。从风险中性到现实世界,比例漂移增加 \(\lambda\sigma/\sqrt r\),现实过程为
用于现实世界模拟;各期限利率仍用风险中性过程和闭式解计算。同样可以取 \(\lambda=-1.2\)。(原书脚注:为了让现实过程保持 CIR 的漂移形式,可以设 \(\lambda\) 正比于 \(\sqrt r\) 或 \(1/\sqrt r\)。)
31.3 无套利模型
为什么交易员不接受均衡模型
均衡模型不能自动拟合当前期限结构,只能通过选参数近似拟合。交易员不会接受这一点:如果模型连标的债券的价格都算不准,它给出的期权价格就不可信。原书指出,标的债券 1% 的定价误差可能导致期权价格 25% 的误差。
无套利模型(no-arbitrage model) 设计为与当前期限结构精确一致。核心区别:
- 均衡模型中,当前期限结构是输出;无套利模型中,它是输入。
- 均衡模型的漂移一般不随时间变化;无套利模型的漂移一般依赖时间。原因是初始零息曲线的形状决定了短期利率未来的平均路径:若 \(t_1\) 到 \(t_2\) 之间曲线陡峭上行,此间 \(r\) 的漂移应为正,反之为负。
部分均衡模型只要加入一个时间函数,就能变成无套利模型。
Ho–Lee 模型
Ho 和 Lee (1986) 提出了第一个无套利期限结构模型,最初以债券价格二叉树的形式给出,参数是短期利率的标准差和风险市场价格(后者在定价时不起作用)。连续时间极限为
\(F(0,t)\) 是时刻 0 看到的期限为 \(t\) 的瞬时远期利率,下标 \(t\) 表示对 \(t\) 的偏导。由于 \(\sigma^2t\) 通常很小,近似地 \(\theta(t)\approx F_t(0,t)\):短期利率未来的平均移动方向约等于瞬时远期曲线的斜率(原书图 31.3),再叠加正态随机扰动。
零息债价格为
其中 \(F(0,t)=-\partial\ln P(0,t)/\partial t\)。这个公式把未来时刻的零息债价格用当时的短期利率和今天的债券价格表示出来,是建树与定价时最常用的形式。
Hull–White 单因子模型
Hull 和 White (1990) 扩展 Vasicek 模型,使之精确拟合初始曲线:
它可以看成带均值回归(速度 \(a\))的 Ho–Lee 模型,也可以看成回归水平随时间变化(\(\theta(t)/a\))的 Vasicek 模型。\(a=0\) 时退化为 Ho–Lee。它的解析可处理程度与 Ho–Lee 相同:
最后一项通常很小。忽略它,\(r\) 的漂移为
直觉是:平均而言 \(r\) 沿初始瞬时远期曲线的斜率移动;一旦偏离这条曲线,就以速度 \(a\) 回到它(原书图 31.4)。
白话解释:\(\theta(t)\) 是一个"按今天的收益率曲线逐期定制"的漂移。为什么必须依赖时间?今天的收益率曲线说,1–2 年的远期利率比 0–1 年高 50bp。如果模型里的短期利率不会"平均地"往上走这 50bp,模型算出的 2 年零息债价格就会偏高。所以 \(\theta(t)\) 的主项是远期曲线的斜率 \(F_t(0,t)\):远期曲线往哪走,短期利率就平均往哪走。 这和 CFA 里校准二叉利率树完全是同一件事:在树的每一层调整利率水平,直到树给出的债券价格等于市场价格。\(\theta(t)\) 就是"每一层的调整量"的连续时间版本。 剩下那两项(\(aF\) 和 \(\sigma^2\) 项)是技术修正:前者抵消均值回归把利率往回拉的效果,后者抵消随机波动带来的凸性效应。
零息债价格:
欧式债券期权在 Ho–Lee 和 Hull–White 下都有解析解(31.4 节);美式等没有解析解的产品用三叉树(31.7 节)。
Black–Derman–Toy 模型
BDT (1990) 是对数正态短期利率的二叉树模型,对应的连续过程为
优点:\(\ln r\) 可以为负,但 \(r\) 始终为正,利率不会为负。缺点:没有解析性质;更严重的是,建树方式强加了 \(\sigma(t)\) 与 \(a(t)\) 的关系——只有短期利率波动率随时间递减时,回归速度才为正。实践中最常用 \(\sigma\) 为常数的版本,此时 \(a=0\)、没有均值回归,\(d\ln r=\theta(t)dt+\sigma dz\),可视为对数正态版的 Ho–Lee。
Black–Karasinski 模型
Black–Karasinski (1991) 的过程形式与 BDT 相同,但 \(a(t)\) 与 \(\sigma(t)\) 相互独立。实践中常取常数:
\(\theta(t)\) 用来精确拟合初始曲线。它没有解析性,但用 31.7 节的三叉树方法可以同时确定 \(\theta(t)\) 并表示整个过程。
Hull–White 两因子模型
\(f(r)\) 是 \(r\) 的某个函数;\(u\) 初值为 0,是 \(f(r)\) 回归水平中的随机分量,它自身以速度 \(b\) 回归到 0;\(a,b,\sigma_1,\sigma_2\) 为常数,\(dz_1,dz_2\) 相关系数为 \(\rho\)。两因子模型能给出比单因子模型更丰富的曲线变动和波动率结构(原书 Technical Note 14)。
31.4 债券期权
零息债期权的闭式解
在 Vasicek、Ho–Lee 和 Hull–White 单因子模型中,\(T\) 到期、标的为 \(s\) 到期零息债(本金 \(L\)、执行价 \(K\))的欧式看涨期权在 0 时刻的价格为
看跌期权价格为 \(KP(0,T)N(-h+\sigma_P)-LP(0,s)N(-h)\)。其中
- Vasicek 与 Hull–White:\(\sigma_P=\dfrac{\sigma}{a}\left[1-e^{-a(s-T)}\right]\sqrt{\dfrac{1-e^{-2aT}}{2a}}\);
- Ho–Lee:\(\sigma_P=\sigma(s-T)\sqrt T\)。
这本质上就是第 29.1 节的 Black 债券期权模型,远期债券价格的波动率为 \(\sigma_P/\sqrt T\)。利率上限和下限可以表示为零息债期权的组合(第 29.2 节),因此在这些模型下也能解析定价。CIR 模型也有零息债期权公式,涉及非中心卡方分布。
附息债期权:Jamshidian 分解
单因子模型中所有零息债价格都随 \(r\) 单调同向变动。利用这一点,附息债的欧式期权可以分解为零息债欧式期权之和:
- 求临界短期利率 \(r^*\),使附息债在期权到期日 \(T\) 的价格恰好等于执行价;
- 对构成附息债的每一只零息债,计算一个到期日为 \(T\) 的欧式期权价格,执行价取 \(r=r^*\) 时该零息债在 \(T\) 的价值;
- 附息债期权价格 = 第 2 步各期权价格之和。
为什么成立?以看涨为例:附息债价格是 \(r\) 的减函数,所以"附息债价格 > 执行价"等价于"\(r<r^*\)",而这又等价于"每只零息债价格 > 各自的执行价"。因此附息债期权行权时,每个零息债期权也都行权,支付恰好相加。
金融直觉:一般来说,"一篮子的期权"比"期权的一篮子"便宜,因为篮子内部的涨跌会相互抵消(\(\max(\sum x_i,0)\le\sum\max(x_i,0)\))。Jamshidian 的巧妙在于:单因子模型中所有零息债完全同涨同跌,篮子内部永远不会抵消,于是不等号变成等号。 举例:附息债由两只零息债构成,到期时价值 \(Z_1+Z_2\),执行价 100。找到 \(r^*\) 使 \(Z_1(r^*)+Z_2(r^*)=100\),比如 \(Z_1(r^*)=5\)、\(Z_2(r^*)=95\)。只要 \(r<r^*\),就同时有 \(Z_1>5\) 与 \(Z_2>95\),所以 \(\max(Z_1+Z_2-100,0)=\max(Z_1-5,0)+\max(Z_2-95,0)\) 恒成立。
该方法适用于 Vasicek、CIR、Ho–Lee 和 Hull–White。欧式互换期权可以看作附息债期权(Business Snapshot 29.2),所以也适用(数值例见原书 Technical Note 15)。两因子模型下它不成立(原书习题 31.5),因为零息债价格不再是单一变量的单调函数。
31.5 波动率结构
在平坦期限结构下,比较三个模型给出的 3 个月远期利率波动率随期限的变化(原书图 31.5):
- Ho–Lee:所有期限的远期利率波动率相同;
- Hull–White 单因子:由于均值回归,波动率随期限递减;
- Hull–White 两因子:参数合适时呈"驼峰"形,先升后降。
驼峰形与实证结果以及第 29.2 节利率上限隐含波动率的驼峰一致,这是两因子模型的一个重要优势。
31.6 利率树
利率树与股票树的区别
利率树是短期利率过程的离散时间表示。设时间步为 \(\Delta t\),树上的利率是连续复利的 \(\Delta t\) 期利率 \(R\),通常假设 \(R\) 与连续模型中的瞬时利率 \(r\) 服从相同的过程。
与股票树的主要区别在贴现:股票树中每个节点的贴现率相同(或只依赖时间);利率树中贴现率因节点而异——每个节点用自己的 \(R\) 贴现。
常用的是三叉树:比二叉树多一个自由度,便于表示均值回归。三叉树等价于显式有限差分法(第 21.8 节)。
一个两步例子
原书图 31.6:两步、\(\Delta t=1\) 年,每个节点上/中/下的概率为 0.25/0.50/0.25。某衍生品在第二步末支付 \(\max[100(R-0.11),0]\)。
- 末端节点 E(\(R=14\%\))价值 \(100\times0.03=3\);\(R=12\%\) 的节点价值 1;其余为 0。
- 节点 B(\(R=12\%\)):\([0.25\times3+0.5\times1+0.25\times0]e^{-0.12}=1.11\);
- 节点 C(\(R=10\%\)):\((0.25\times1)e^{-0.10}=0.23\);
- 初始节点 A(\(R=10\%\)):\((0.25\times1.11+0.5\times0.23)e^{-0.10}=0.35\)。
注意每一步的贴现率都是所在节点的利率。
非标准分叉
三叉树的分叉方式有三种(原书图 31.7):
- (a) 常规:上一 / 平 / 下一;
- (b) 上二 / 上一 / 平:利率很低时使用,实现向上的均值回归;
- (c) 平 / 下一 / 下二:利率很高时使用,实现向下的均值回归。
31.7 一般建树程序:Hull–White 两阶段法
这是本章最需要动手的部分。我们以 Hull–White 模型 \(dr=[\theta(t)-ar]dt+\sigma dz\) 为例,时间步 \(\Delta t\) 恒定,假设 \(\Delta t\) 期利率 \(R\) 服从相同过程。
第一阶段:对称的 \(R^*\) 树
先对初值为 0、过程为
的变量 \(R^*\) 建树。这个过程关于 0 对称;\(R^*(t+\Delta t)-R^*(t)\) 是正态的,忽略高阶项后均值为 \(-aR^*\Delta t\),方差为 \(\sigma^2\Delta t\)。
节点间距取
从误差最小化的角度看这是一个好选择。节点 \((i,j)\) 表示 \(t=i\Delta t\)、\(R^*=j\Delta R\)。
分叉切换。分叉方式必须保证三个概率都为正。多数节点用 (a);\(a>0\) 时,\(j\) 足够大要切换到 (c),\(j\) 足够负要切换到 (b)。取 \(j_{max}\) 为大于 \(0.184/(a\Delta t)\) 的最小整数,\(j_{min}=-j_{max}\)。(原书脚注:\(j_{max}\) 在 \(0.184/(a\Delta t)\) 到 \(0.816/(a\Delta t)\) 之间时概率都为正;在第一个可能的节点切换计算量最小。)
概率通过匹配均值、方差且三者之和为 1 求得。以分叉 (a) 为例:
利用 \(\Delta R^2=3\sigma^2\Delta t\) 解得:
- (a):\(p_u=\frac16+\frac12(a^2j^2\Delta t^2-aj\Delta t)\),\(p_m=\frac23-a^2j^2\Delta t^2\),\(p_d=\frac16+\frac12(a^2j^2\Delta t^2+aj\Delta t)\);
- (b):\(p_u=\frac16+\frac12(a^2j^2\Delta t^2+aj\Delta t)\),\(p_m=-\frac13-a^2j^2\Delta t^2-2aj\Delta t\),\(p_d=\frac76+\frac12(a^2j^2\Delta t^2+3aj\Delta t)\);
- (c):\(p_u=\frac76+\frac12(a^2j^2\Delta t^2-3aj\Delta t)\),\(p_m=-\frac13-a^2j^2\Delta t^2+2aj\Delta t\),\(p_d=\frac16+\frac12(a^2j^2\Delta t^2-aj\Delta t)\)。
((b) 中 \(p_u,p_m,p_d\) 分别对应上二、上一、平;(c) 中分别对应平、下一、下二。)
推导拆解:以 (a) 为例解三个方程。记 \(x=aj\Delta t\)。 第一式两边除以 \(\Delta R\):\(p_u-p_d=-x\)。 第二式两边除以 \(\Delta R^2=3\sigma^2\Delta t\):\(p_u+p_d=\tfrac13+x^2\)。(右边第一项 \(\sigma^2\Delta t/(3\sigma^2\Delta t)=\tfrac13\);第二项 \(a^2j^2\Delta R^2\Delta t^2/\Delta R^2=x^2\)。注意第二式左边是二阶原点矩,所以右边是"方差 + 均值的平方"。) 和与差联立:\(p_u=\tfrac16+\tfrac12(x^2-x)\),\(p_d=\tfrac16+\tfrac12(x^2+x)\),\(p_m=1-(p_u+p_d)=\tfrac23-x^2\)。与原文一致。 为什么要切换分叉?\(x\) 越大,\(p_m=\tfrac23-x^2\) 越小,\(x^2>\tfrac23\) 时变负。\(0.184\) 和 \(0.816\) 这两个数就是让三种分叉的所有概率都为正的 \(x\) 的上下限。在 \(j_{max}\) 处改用"平 / 下一 / 下二",等于把树"折回来",这也正是均值回归在树上的体现:利率高到一定程度,就不再允许继续往上走。
数值例:\(\sigma=0.01\),\(a=0.1\),\(\Delta t=1\)。\(\Delta R=0.01\sqrt3=0.0173\);\(0.184/(0.1\times1)=1.84\),故 \(j_{max}=2\),\(j_{min}=-2\)(原书图 31.8)。各节点概率:
| 节点 | \(j\) | 分叉 | \(p_u\) | \(p_m\) | \(p_d\) |
|---|---|---|---|---|---|
| A | 0 | (a) | 0.1667 | 0.6666 | 0.1667 |
| B、F | 1 | (a) | 0.1217 | 0.6566 | 0.2217 |
| D、H | −1 | (a) | 0.2217 | 0.6566 | 0.1217 |
| E | 2 | (c) | 0.8867 | 0.0266 | 0.0867 |
| I | −2 | (b) | 0.0867 | 0.0266 | 0.8867 |
概率只依赖 \(j\),树是对称的。
第二阶段:平移以拟合初始曲线
把 \(R^*\) 树的节点平移,得到 \(R\) 树,使初始期限结构被精确匹配。定义
当 \(\Delta t\to0\) 时,\(\alpha\) 可由 (31.14) 解析得到:\(d\alpha=[\theta(t)-a\alpha]dt\),解为 \(\alpha(t)=F(0,t)+\frac{\sigma^2}{2a^2}(1-e^{-at})^2\)。但要在有限的 \(\Delta t\) 下精确匹配曲线,需要数值迭代。
记 \(\alpha_i=\alpha(i\Delta t)\);\(Q_{i,j}\) 为"到达节点 \((i,j)\) 时支付 $1、否则为 0"的证券的现值,即 Arrow–Debreu 价格。用**前向归纳(forward induction)**依次计算 \(\alpha_i\) 和 \(Q_{i,j}\)。
示例。连续复利零息利率(原书表 31.1):
| 期限(年) | 0.5 | 1.0 | 1.5 | 2.0 | 2.5 | 3.0 |
|---|---|---|---|---|---|---|
| 零息利率(%) | 3.430 | 3.824 | 4.183 | 4.512 | 4.812 | 5.086 |
- \(Q_{0,0}=1\);\(\alpha_0\) 取初始 \(\Delta t\) 期利率 0.03824。
- \(Q_{1,1}=0.1667e^{-0.03824}=0.1604\),\(Q_{1,0}=0.6417\),\(Q_{1,-1}=0.1604\)。
- \(\alpha_1\) 使 2 年期零息债定价正确:
解得
- 计算 \(Q_{2,j}\)。例如节点 F(\(j=1\))只能由 B(利率 6.937%)和 C(5.205%)到达,概率分别为 0.6566 和 0.1667:
同理 \(Q_{2,2}=0.0182\),\(Q_{2,0}=0.4736\),\(Q_{2,-1}=0.2033\),\(Q_{2,-2}=0.0189\)。
- 依次计算 \(\alpha_2\)、\(Q_{3,j}\)……
各节点利率(原书图 31.9):A 3.824%;B/C/D 6.937%/5.205%/3.473%;E–I 9.716%/7.984%/6.252%/4.520%/2.788%。本章量化实战的代码完整复现了这些数字。
白话解释:Arrow–Debreu 价格 \(Q_{i,j}\) 是"只在到达节点 \((i,j)\) 时付 1 元"的证券今天的价格,也就是这个节点的"状态价格"。把第 \(i\) 层所有 \(Q_{i,j}\) 加起来,就是 \(i\Delta t\) 年零息债的价格(无论到哪个节点都付 1 元)。例如 \(Q_{1,1}+Q_{1,0}+Q_{1,-1}=0.1604+0.6417+0.1604=0.9625\approx e^{-0.03824}\),正是 1 年期贴现因子。 推导拆解:(31.21) 的意思是:2 年零息债 = 先到第 1 年的某个节点(状态价格 \(Q_{1,j}\)),再在该节点按当地利率 \(\alpha_1+j\Delta R\) 贴现一年。三项之和必须等于市场上的 \(P(0,2)=0.9137\)。由于 \(e^{-\alpha_1}\) 是公因子可以提出来,整理就是原文的显式解。 计算 \(Q_{2,1}\) 时:先从 B 或 C 出发(状态价格 0.1604 或 0.6417),在出发节点按当地利率贴现一年(\(e^{-0.06937}\) 或 \(e^{-0.05205}\)),再乘上走到 F 的概率(0.6566 或 0.1667),两条路径相加。这就是"前向归纳":每一层都只用上一层的结果,不需要回溯整棵树。
一般公式。已知 \(i\le m\) 的所有 \(Q_{i,j}\),\(\alpha_m\) 要使 \((m+1)\Delta t\) 到期的零息债定价正确:
由于 \(\alpha_m\) 可以提到求和号外面,可以显式解出:
然后前推一层:
\(n_m\) 为 \(m\Delta t\) 时中心节点每侧的节点数,\(q(k,j)\) 为从 \((m,k)\) 到 \((m+1,j)\) 的转移概率。每层计算量为 \(O(n_m)\),总计算量与节点数成线性关系,非常高效。
推广到其他模型
形如
(\(f\) 单调)的模型族都能拟合任意期限结构。(原书脚注:并非所有无套利模型都能。扩展 CIR 模型 \(dr=[\theta(t)-ar]dt+\sigma\sqrt r\,dz\) 在 \(\theta(t)<0\) 时过程性质不良,无法拟合远期利率急剧下降的曲线。)
做法:令 \(x=f(R)\),则 \(dx=[\theta(t)-ax]dt+\sigma dz\)。第一阶段对 \(\theta=0\)、初值 0 的 \(x^*\) 建树,方法与上面完全相同;第二阶段平移 \(\alpha_i\)。设 \(g=f^{-1}\),节点 \((m,j)\) 的 \(\Delta t\) 期利率为 \(g(\alpha_m+j\Delta x)\),
这时 \(\alpha_m\) 不能显式解出,要用 Newton–Raphson 等方法求根;\(\alpha_0=f(R(0))\);\(Q_{m+1,j}=\sum_kQ_{m,k}q(k,j)\exp[-g(\alpha_m+k\Delta x)\Delta t]\)。
原书图 31.10 给出 Black–Karasinski 模型(\(f=\ln r\))的例子:\(a=0.22\),\(\sigma=0.25\),\(\Delta t=0.5\),零息利率同表 31.1。节点利率为 A 3.430%;B/C/D 5.642%/4.154%/3.058%;E–I 8.803%/6.481%/4.772%/3.513%/2.587%。
两种选择的比较:
- \(f(r)=r\)(Hull–White):解析可处理;但利率可以为负(多数情况下概率很小,但有些分析师不愿接受任何负利率的可能)。
- \(f(r)=\ln r\)(Black–Karasinski):利率恒正,但没有解析性。
低利率环境
利率很低时,Hull–White 模型出现负利率的概率不再可以忽略;Black–Karasinski 也不好用,因为同一个比例波动率不能同时适合低利率和高利率环境。可选方案:\(r\) 低时 \(f(r)\) 正比于 \(\ln r\)、\(r\) 高时正比于 \(r\);或者取 Vasicek 型模型利率的绝对值作为短期利率;更好的是 Alexander Sokol 的建议——让回归速度和波动率都是 \(r\) 的函数,再把 \(r\) 变换为 \(dz\) 系数为常数的新变量 \(x\),用更一般的三叉分叉建树。
树与解析结果结合
对 Hull–White 树(\(f(r)=r\)),每个节点都可以用 31.3 节的解析公式给出完整的期限结构和欧式期权价格。但要注意:树上的利率是 \(\Delta t\) 期利率 \(R\),不是瞬时利率 \(r\)。可以证明(原书习题 31.20)
(Ho–Lee 中取 \(\hat B=T-t\)。)在树节点上应使用 (31.25),而不是 (31.15)。
例(原书此处例题编号与前文重复,也标为 Example 31.1)。零息曲线见原书表 31.2(连续复利、actual/365,中间线性插值):
| 期限 | 3 天 | 1 个月 | 2 个月 | 3 个月 | 6 个月 | 1 年 | 2 年 | 3 年 |
|---|---|---|---|---|---|---|---|---|
| 利率(%) | 5.01772 | 4.98284 | 4.97234 | 4.96157 | 4.99058 | 5.09389 | 5.79733 | 6.30595 |
| 期限 | 4 年 | 5 年 | 6 年 | 7 年 | 8 年 | 9 年 | 10 年 |
|---|---|---|---|---|---|---|---|
| 利率(%) | 6.73464 | 6.94816 | 7.08807 | 7.27527 | 7.30852 | 7.39790 | 7.49015 |
为一个 3 年期欧式看跌期权定价,标的是 9 年后支付 100 的零息债,执行价 63,Hull–White 参数 \(a=0.1\)、\(\sigma=0.01\)。建 3 年的树,末端节点用 (31.25) 算零息债价格。原书表 31.3:
| 步数 | 10 | 30 | 50 | 100 | 200 | 500 | 解析解 |
|---|---|---|---|---|---|---|---|
| 树价 | 1.8468 | 1.8172 | 1.8057 | 1.8128 | 1.8090 | 1.8091 | 1.8093 |
这是检验实现的好测试:期权到期之后零息曲线的斜率急剧变化,建树中的小错误会显著影响结果(DerivaGem Sample Application G)。树价围绕解析解振荡收敛,这是三叉树的典型行为。
美式债券期权
DerivaGem 实现了正态和对数正态两类模型,可以为欧式和美式债券期权、上限/下限、欧式互换期权定价。原书图 31.11 的例子:1.5 年期美式看涨期权,标的为 10 年期债券(本金 100,票息 5%,半年付息),对数正态(Black–Karasinski)模型 \(a=5\%\)、\(\sigma=20\%\),4 步(\(\Delta t=0.375\) 年),收益率曲线平坦于 5%,报价执行价 105。
执行价可以是现金执行价或报价执行价(第 29.1 节),这里是报价执行价。树上显示的是现金债券价格,每个节点下方列出应计利息;现金执行价 = 报价执行价 + 应计利息;期权支付 = 现金债价 − 现金执行价 = 报价债价 − 报价执行价。4 步树给出 0.672,100 步树给出 0.703。对数正态模型下 10 年期债券价格没有解析式,需要在更大的树上回滚数值计算。
31.8 校准
确定波动率参数(如 \(a\) 和 \(\sigma\))的过程称为校准(calibration)。用活跃交易的期权(如原书表 29.1、29.2 的上限和互换期权经纪商报价)作为校准工具,最小化
\(U_i\) 为第 \(i\) 个工具的市场价,\(V_i\) 为模型价。波动率参数的个数不应超过校准工具数。
时间依赖参数。可以让 \(a\) 或 \(\sigma\) 是时间的阶梯函数,如 \(a\) 为常数,\(\sigma(t)=\sigma_0\)(\(t\le t_1\)),\(\sigma_i\)(\(t_i<t\le t_{i+1}\)),\(\sigma_n\)(\(t>t_n\)),共 \(n+2\) 个参数。最小化通常用 Levenberg–Marquardt 算法(数值优化方法见第 04 册第 10 章)。参数随时间变化时,加惩罚项使函数"性态良好":
第二项惩罚相邻时间段的大幅变化,第三项惩罚高曲率,权重靠试验确定。
校准工具的选择:应尽量与被定价产品相似。例如一个 10 年期百慕大互换期权,可在第 5 到第 9 年的任一付款日行权,进入第 10 年到期的互换。最相关的校准工具是 5×5、6×4、7×3、8×2、9×1 欧式互换期权(\(n\times m\) 表示 \(n\) 年期期权,行权后进入一个再持续 \(m\) 年的互换)。它们是百慕大期权在各个行权日的"欧式成分"。
权衡。参数随时间变化能更精确地拟合今天的市场,但波动率结构变成**非平稳(nonstationary)**的:模型给出的未来波动率期限结构可能与今天市场上看到的完全不同。对于价值依赖未来波动率结构的产品(如百慕大期权),这是一个实质性的模型风险。
金融直觉:这就是量化研究里熟悉的"过拟合"。参数越多,样本内(今天的报价)拟合越好,但对样本外(未来的波动率结构)的描述可能越离谱。平滑惩罚项相当于回归里的正则化(如岭回归):宁可牺牲一点今天的拟合精度,也要参数随时间平稳变化。 百慕大互换期权对此特别敏感,因为它的价值来自"等一等再决定是否行权"的选择权,而这个选择权值多少,取决于模型认为两三年后市场的波动率结构长什么样。
另一种做法:用全部校准工具求"全局最佳拟合"的 \(a\) 和 \(\sigma\),然后固定 \(a\),像使用 BSM 那样使用模型:期权价格与 \(\sigma\) 一一对应,可以把表 29.1、29.2 换算成隐含 \(\sigma\) 表,再判断给某个产品定价最合适的 \(\sigma\)。(原书脚注:这里的隐含 \(\sigma\) 不同于 Black 隐含波动率;做法是先用 Black 模型把 Black 波动率转为价格,再迭代反解期限结构模型的 \(\sigma\)。)
31.9 用单因子模型对冲
第 29.5 节的对冲方法同样适用:对零息曲线或波动率环境做小扰动,重估组合,得到 delta、gamma、vega。
关键原则:定价可以用单因子模型,对冲不能只假设单因子。delta 应当覆盖各种可能的曲线变动(平行、斜率、曲率、局部关键期限),而不仅仅是模型允许的那一种。考虑模型内外各种变化的对冲称为模型外对冲(outside model hedging),是交易员的标准做法。类比:BSM 假设波动率恒定,但交易员照样计算 vega 并对冲波动率变化。
现实是:简单的单因子模型谨慎使用,通常能给出合理的价格;但好的对冲必须显式或隐式地考虑多个因子。
量化实战
本章内容在量化交易中的用途
定价与系统实现。Hull–White 三叉树、Arrow–Debreu 前向归纳和 Jamshidian 分解是利率衍生品定价库的标准组件(例如 QuantLib 中的 HullWhite、BlackKarasinski 模型和 TreeSwaptionEngine)。百慕大互换期权、可赎回债、可转债的利率部分都依赖这类树。国内可用于含权债(可回售、可赎回)估值和国债期货相关期权的研究。
风险建模与情景生成。Vasicek 和 CIR 是 ALM、保险和养老金长期利率情景生成器(ESG)的常用组件。例 31.2、31.3 的"现实世界参数 vs 风险中性参数"转换就是"真实概率下模拟路径、风险中性下计算估值"的双测度框架,压力测试和经济资本计算都用它。
因子研究与择时。离散 Vasicek 就是 AR(1):\(\Delta r_t=c+\beta r_{t-1}+\varepsilon_t\)。可以用它估计短端利率的均值回归速度和半衰期 \(\ln2/a\),作为利率择时、期限利差交易的信号基础。但要非常小心:均值回归速度在有限样本中严重高估(下面的代码会演示),这会让基于均值回归的策略在回测中看起来比实际好得多。另外,\(\hat D=B(t,T)\) 提醒我们:对短端利率的久期与平行久期不同,构建久期中性组合时要明确中性的是哪种变动。
校准。"最小二乘 + 平滑惩罚 + Levenberg–Marquardt"的模式在一般的模型拟合中通用,如波动率曲面拟合、收益率曲线拟合(Nelson–Siegel–Svensson)等。
Python 示例一:估计 Vasicek 参数,并检验闭式解
程序先模拟 10 年周频的 Vasicek 路径(真值取例 31.2 的估计结果 \(a=0.21,b=0.04,\sigma=0.0072\)),用 statsmodels 回归还原参数;再重复 2000 次,观察 \(a\) 估计量的分布;最后用风险中性蒙特卡洛检验零息债闭式解 (31.6)–(31.8)。
import numpy as np
import statsmodels.api as sm
# ---------- 1. 用周数据估计离散 Vasicek(= AR(1))----------
rng = np.random.default_rng(7)
a_true, b_true, sig_true, dt = 0.21, 0.04, 0.0072, 1/52
n = 52*10 # 10 年周数据
r = np.empty(n+1); r[0] = 0.03
for i in range(n):
r[i+1] = r[i] + a_true*(b_true-r[i])*dt + sig_true*np.sqrt(dt)*rng.standard_normal()
dr, X = np.diff(r), sm.add_constant(r[:-1])
res = sm.OLS(dr, X).fit()
c, slope = res.params
a_hat = -slope/dt
b_hat = c/(-slope)
sig_hat = np.sqrt(res.scale/dt)
print(f"回归: 截距={c:.6f} 斜率={slope:.5f} 残差标准差={np.sqrt(res.scale):.5f}")
print(f"估计: a={a_hat:.3f} b={b_hat:.4f} sigma={sig_hat:.5f}")
# 例 31.2 的数字:斜率 -0.004, 截距 0.00016, 残差标准差 0.001
a2, b2, s2 = 0.004*52, 0.00016/0.004, 0.001*np.sqrt(52)
lam = -1.2
# 同样的真实参数重复 2000 次,看 10 年数据下估计量的分布
a_list = []
for k in range(2000):
z = rng.standard_normal(n); rr = np.empty(n+1); rr[0] = 0.04
for i in range(n):
rr[i+1] = rr[i] + a_true*(b_true-rr[i])*dt + sig_true*np.sqrt(dt)*z[i]
sl = np.polyfit(rr[:-1], np.diff(rr), 1)[0]
a_list.append(-sl/dt)
q = np.percentile(a_list, [5, 50, 95])
print(f"a 估计量 5%/50%/95% 分位: {q[0]:.3f} / {q[1]:.3f} / {q[2]:.3f} (真值 0.21)")
print(f"例31.2: a={a2:.3f} b={b2:.3f} sigma={s2:.4f} b*=b-lam*sigma/a={b2-lam*s2/a2:.4f}")
# ---------- 2. Vasicek 零息债闭式解 vs 风险中性蒙特卡洛 ----------
def vasicek_P(r0, tau, a, b, sig):
B = (1-np.exp(-a*tau))/a
lnA = (B-tau)*(a*a*b-sig*sig/2)/a**2 - sig*sig*B*B/(4*a)
return np.exp(lnA - B*r0)
a, b, sig, r0, T = 0.1, 0.05, 0.01, 0.03, 10.0 # 风险中性参数
m, npath = 1000, 100_000
h = T/m
r = np.full(npath, r0); integral = np.zeros(npath)
for _ in range(m): # 精确离散化 OU 过程
e = np.exp(-a*h)
r_new = b + (r-b)*e + sig*np.sqrt((1-e*e)/(2*a))*rng.standard_normal(npath)
integral += 0.5*(r+r_new)*h # 梯形积分
r = r_new
x = np.exp(-integral)
print(f"\n10 年零息债: 闭式={vasicek_P(r0,T,a,b,sig):.5f} MC={x.mean():.5f} (标准误 {x.std()/np.sqrt(npath):.5f})")
for tau in [1, 2, 5, 10, 30]:
P = vasicek_P(r0, tau, a, b, sig)
print(f" 期限 {tau:2d} 年 零息利率 = {-np.log(P)/tau*100:.3f}%")
关键输出:
回归: 截距=0.000265 斜率=-0.01663 残差标准差=0.00093
估计: a=0.865 b=0.0159 sigma=0.00674
a 估计量 5%/50%/95% 分位: 0.134 / 0.618 / 1.664 (真值 0.21)
例31.2: a=0.208 b=0.040 sigma=0.0072 b*=b-lam*sigma/a=0.0816
10 年零息债: 闭式=0.69408 MC=0.69460 (标准误 0.00029)
期限 1 年 零息利率 = 3.095%
期限 2 年 零息利率 = 3.182%
期限 5 年 零息利率 = 3.397%
期限 10 年 零息利率 = 3.652%
期限 30 年 零息利率 = 4.100%
读法有三点。第一,\(\sigma\) 估计得很准(0.00674 vs 0.0072),因为波动率由高频的平方变动决定,样本越密越准。第二,均值回归速度 \(a\) 估计得非常差:这一条路径估出 0.865,2000 次重复的中位数 0.618、90% 区间 [0.13, 1.66],而真值只有 0.21。原因是 10 年里利率只完成一两次"回归",信息量极少,而且 AR(1) 系数的 OLS 估计在接近单位根时有显著的向下偏差(对应 \(a\) 的向上偏差)。长期水平 \(b\) 也因此不可靠。所以原书强调现实世界参数主要用于情景分析,而定价用的风险中性参数应当从市场价格校准。第三,闭式解与蒙特卡洛在 2 个标准误内一致;在这组参数下,零息曲线从 3.1% 向上倾斜到 4.1%,长端趋近 \(b-\sigma^2/(2a^2)\) 这一渐近水平。
Python 示例二:Hull–White 两阶段三叉树
下面的代码实现 31.7 节的完整算法:第一阶段的对称树与分叉切换、第二阶段的 Arrow–Debreu 前向归纳;先复现表 31.1 的数值例,再给表 31.2 的零息债看跌期权定价,并与解析解 (31.20) 比较。
import numpy as np
from scipy.stats import norm
def hw_tree(a, sigma, dt, nsteps, P):
"""Hull-White 两阶段三叉树。P(t) 为今天的贴现函数。
返回 alpha[m](m=0..nsteps-1)、节点间距 dR、jmax、分叉函数 probs(j)。"""
dR = sigma*np.sqrt(3*dt)
jmax = int(np.floor(0.184/(a*dt))) + 1 # 大于 0.184/(a dt) 的最小整数
def probs(j):
x = a*j*dt
if j == jmax: # 分叉 (c):平 / 下一 / 下二
return (7/6+0.5*(x*x-3*x), -1/3-x*x+2*x, 1/6+0.5*(x*x-x)), (0, -1, -2)
if j == -jmax: # 分叉 (b):上二 / 上一 / 平
return (1/6+0.5*(x*x+x), -1/3-x*x-2*x, 7/6+0.5*(x*x+3*x)), (2, 1, 0)
return (1/6+0.5*(x*x-x), 2/3-x*x, 1/6+0.5*(x*x+x)), (1, 0, -1) # 分叉 (a)
alphas, Q = [], {0: 1.0} # Q: Arrow-Debreu 价格
for m in range(nsteps):
js = np.array(sorted(Q)); q = np.array([Q[j] for j in js])
alpha = (np.log((q*np.exp(-js*dR*dt)).sum()) - np.log(P((m+1)*dt)))/dt # 式 (31.22)
alphas.append(alpha)
Qn = {}
for j, qq in zip(js, q): # 前向归纳
pr, sh = probs(j); disc = np.exp(-(alpha+j*dR)*dt)
for p, s in zip(pr, sh):
Qn[j+s] = Qn.get(j+s, 0.0) + qq*p*disc
Q = Qn
return np.array(alphas), dR, jmax, probs
# ---------- 1. 第二阶段数值例:表 31.1,a=0.1, sigma=0.01, dt=1 ----------
tz = np.array([0.5, 1, 1.5, 2, 2.5, 3]); rz = np.array([3.430, 3.824, 4.183, 4.512, 4.812, 5.086])/100
P1 = lambda t: np.exp(-np.interp(t, tz, rz)*t)
al, dR, jmax, probs = hw_tree(0.1, 0.01, 1.0, 3, P1)
print("alpha_0..2 =", np.round(al, 5), " jmax =", jmax)
for m in range(3):
n = min(m, jmax)
print(f" 第{m}年节点利率(%):", [round(float(100*(al[m]+j*dR)), 3) for j in range(n, -n-1, -1)])
# ---------- 2. 表 31.2 曲线:3 年期欧式看跌,标的为 9 年零息债,K=63 ----------
tt = np.array([3/365, 1/12, 2/12, 3/12, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
rr = np.array([5.01772, 4.98284, 4.97234, 4.96157, 4.99058, 5.09389, 5.79733, 6.30595,
6.73464, 6.94816, 7.08807, 7.27527, 7.30852, 7.39790, 7.49015])/100
P = lambda t: np.exp(-np.interp(t, tt, rr)*t)
a, sig, T, s, K, L = 0.1, 0.01, 3.0, 9.0, 63.0, 100.0
# 解析解 (31.20)
sP = sig/a*(1-np.exp(-a*(s-T)))*np.sqrt((1-np.exp(-2*a*T))/(2*a))
h = np.log(L*P(s)/(P(T)*K))/sP + sP/2
put_exact = K*P(T)*norm.cdf(-h+sP) - L*P(s)*norm.cdf(-h)
def tree_put(N):
dt = T/N
al, dR, jmax, probs = hw_tree(a, sig, dt, N+1, P) # 多建一步,得到 T 时刻的 alpha
B = lambda t1, t2: (1-np.exp(-a*(t2-t1)))/a
Bh = B(T, s)/B(T, T+dt)*dt # 式 (31.27)
lnAh = (np.log(P(s)/P(T)) - B(T, s)/B(T, T+dt)*np.log(P(T+dt)/P(T))
- sig**2/(4*a)*(1-np.exp(-2*a*T))*B(T, s)*(B(T, s)-B(T, T+dt))) # 式 (31.26)
n = min(N, jmax); js = np.arange(-n, n+1)
V = np.maximum(K - L*np.exp(lnAh - Bh*(al[N]+js*dR)), 0) # 末端用 (31.25)
for m in range(N-1, -1, -1): # 回滚
n, nn = min(m, jmax), min(m+1, jmax)
V = np.array([sum(p*V[j+sh+nn] for p, sh in zip(*probs(j)))*np.exp(-(al[m]+j*dR)*dt)
for j in range(-n, n+1)])
return V[0]
print(f"\n解析价 = {put_exact:.4f}")
for N in [10, 30, 50, 100, 200, 500]:
print(f" {N:3d} 步树价 = {tree_put(N):.4f}")
关键输出:
alpha_0..2 = [0.03824 0.05205 0.06252] jmax = 2
第0年节点利率(%): [3.824]
第1年节点利率(%): [6.937, 5.205, 3.473]
第2年节点利率(%): [9.716, 7.984, 6.252, 4.52, 2.788]
解析价 = 1.8093
10 步树价 = 1.8658
30 步树价 = 1.8234
50 步树价 = 1.8093
100 步树价 = 1.8144
200 步树价 = 1.8097
500 步树价 = 1.8093
第一部分逐位复现了原书图 31.9 的节点利率。第二部分解析价 1.8093 与原书一致;树价围绕解析价振荡收敛,500 步时一致到 4 位小数。小步数下的树价与原书表 31.3 有差别(例如 10 步 1.8658 vs 1.8468),主要因为短端日期换算("1 个月"取 1/12 年还是 31/365 年)和插值细节不同——这本身就说明了原书的提醒:曲线在期权到期后急剧变陡,实现细节会明显影响低步数结果。你自己实现利率树时,"树价收敛到解析解"是最重要的单元测试。
本章小结
短期利率模型用一个变量 \(r\) 的风险中性过程决定整条零息曲线:\(P(t,T)=\hat E[e^{-\int_t^Tr\,du}]\),对应偏微分方程 (31.5)。均衡模型(Rendleman–Bartter、Vasicek、CIR)参数不随时间变化,当前曲线是输出;Vasicek 和 CIR 是仿射模型,零息债有闭式解 \(P=Ae^{-Br}\),适合长期情景分析,但要区分现实世界参数和风险中性参数。无套利模型(Ho–Lee、Hull–White、BDT、Black–Karasinski、HW 两因子)通过 \(\theta(t)\) 把当前曲线作为输入精确拟合,是定价的标准选择。Hull–White 模型兼具均值回归和解析可处理性:零息债期权有 Black 型闭式解,附息债期权和欧式互换期权可用 Jamshidian 分解;无解析解的产品用两阶段三叉树。校准时最小化价格误差平方和加平滑惩罚,工具要与目标产品相似,并警惕时间依赖参数带来的非平稳波动率结构。定价可以用单因子,对冲必须考虑多种曲线变动。
| 概念 | 公式 / 要点 |
|---|---|
| 零息债价格 | \(P(t,T)=\hat E[e^{-\bar r(T-t)}]\) |
| 利率衍生品 PDE | \(f_t+mf_r+\tfrac12s^2f_{rr}=rf\) |
| Vasicek | \(dr=a(b-r)dt+\sigma dz\);\(P=Ae^{-Br}\),\(B=(1-e^{-a(T-t)})/a\) |
| CIR | \(dr=a(b-r)dt+\sigma\sqrt r\,dz\);Feller 条件 \(2ab>\sigma^2\) |
| 现实 → 风险中性(Vasicek) | \(b^*=b-\lambda\sigma/a\),\(\lambda\approx-1.2\) |
| Ho–Lee | \(dr=\theta(t)dt+\sigma dz\),\(\theta(t)=F_t(0,t)+\sigma^2t\) |
| Hull–White | \(dr=[\theta(t)-ar]dt+\sigma dz\),\(\theta(t)=F_t+aF+\frac{\sigma^2}{2a}(1-e^{-2at})\) |
| 零息债期权 | Black 型公式,\(\sigma_P=\frac{\sigma}{a}[1-e^{-a(s-T)}]\sqrt{\frac{1-e^{-2aT}}{2a}}\) |
| Jamshidian 分解 | 附息债期权 = 以 \(r^*\) 定执行价的零息债期权之和(仅单因子) |
| 三叉树第一阶段 | \(\Delta R=\sigma\sqrt{3\Delta t}\),\(j_{max}=\lfloor0.184/(a\Delta t)\rfloor+1\) |
| 三叉树第二阶段 | \(\alpha_m=\frac1{\Delta t}\left[\ln\sum_jQ_{m,j}e^{-j\Delta R\Delta t}-\ln P_{m+1}\right]\) |
| 树上零息债 | 用 \(\Delta t\) 期利率 \(R\) 的 (31.25)–(31.27),不能直接用 (31.15) |
| 校准 | \(\sum(U_i-V_i)^2\) + 平滑惩罚,Levenberg–Marquardt |
练习
基础
-
解释为什么短期利率的均值回归不与有效市场假说冲突,而股票价格的均值回归会(原书习题 31.3)。 提示:短期利率不是交易资产的价格;可预测的利率变化已反映在期限结构中。
-
在 Vasicek 模型 \(a=0.15\)、\(b=0.05\)、\(\sigma=0.01\)、\(r=0.04\) 下,计算 5 年期零息债价格和零息利率,以及短期利率上升 10bp 时价格的百分比变化。 提示:\(B(0,5)=(1-e^{-0.75})/0.15=3.518\),\(P\approx0.8077\),零息利率约 4.27%;短期利率升 10bp 时价格变化约 \(-B\times0.001=-0.35\%\)。
-
用 Ho–Lee 公式 \(\sigma_P=\sigma(s-T)\sqrt T\) 和 Hull–White 公式比较:\(\sigma=0.01\)、\(T=3\)、\(s=9\)、\(a=0.1\) 时两者的 \(\sigma_P\)。均值回归使 \(\sigma_P\) 变大还是变小? 提示:Ho–Lee \(0.01\times6\times\sqrt3=0.104\);Hull–White \(\frac{0.01}{0.1}(1-e^{-0.6})\sqrt{\frac{1-e^{-0.6}}{0.2}}=0.1\times0.4512\times1.502=0.068\)。均值回归使 \(\sigma_P\) 明显变小。
-
复现 31.6 节两步三叉树例子,并把支付改为 \(\max[100(0.09-R),0]\) 重算。 提示:只有 \(R=8\%\) 及以下的末端节点有正支付,注意每个节点用自己的利率贴现。
-
对 \(a=0.05\)、\(\Delta t=0.5\) 的 Hull–White 树,计算 \(\Delta R\)(取 \(\sigma=0.012\))、\(j_{max}\) 和 \(j=j_{max}\) 节点的三个概率。 提示:\(0.184/0.025=7.36\),\(j_{max}=8\);使用分叉 (c) 公式,检查三个概率都为正。
进阶
-
从 (31.5) 出发推导 CIR 模型 \(B(t,T)\) 满足的 Riccati 方程,并验证给出的闭式解。 提示:代入 \(f=Ae^{-Br}\),\(s^2=\sigma^2r\) 使 \(B^2\) 项进入 \(r\) 的系数。
-
用 Jamshidian 分解为附息债欧式看涨期权定价:Hull–White \(a=0.1\)、\(\sigma=0.015\),平坦 5% 连续复利曲线,期权 1 年到期,标的为期权到期后 3 年、年付息 6% 的债券,执行价 101(原书习题 31.9、31.10 类型)。 提示:用
brentq求 \(r^*\),零息债价格在 \(t=1\) 用 (31.15),然后对三只零息债分别用 (31.20)。 -
推导 (31.25)–(31.27):把树上的 \(\Delta t\) 期利率 \(R\) 用瞬时利率 \(r\) 表示(\(e^{-R\Delta t}=P(t,t+\Delta t)=A(t,t+\Delta t)e^{-B(t,t+\Delta t)r}\)),代入 (31.15) 消去 \(r\)(原书习题 31.20)。
-
修改本章代码,把 Hull–White 树改为 Black–Karasinski 树(\(f=\ln r\)),用 Newton–Raphson 求 \(\alpha_m\),复现原书图 31.10 的节点利率(\(a=0.22\),\(\sigma=0.25\),\(\Delta t=0.5\))。 提示:\(\alpha_0=\ln0.0343\),需求解 \(\sum_jQ_{m,j}\exp[-e^{\alpha_m+j\Delta x}\Delta t]=P_{m+1}\)。
-
用 31.8 节的方法校准:给定一组用"真" Hull–White 参数(\(a=0.08\),\(\sigma=0.012\))算出的零息债期权价格,加上少量噪声,用
scipy.optimize.least_squares(method="lm")反解 \(a\)、\(\sigma\)。观察 \(a\) 和 \(\sigma\) 的估计相关性。 提示:\(a\) 与 \(\sigma\) 高度相关,短期期权主要识别 \(\sigma\),长期期权才能识别 \(a\);这也是校准工具应与目标产品相似的原因。
原书推荐习题:31.1、31.3、31.4(均衡/无套利、单/两因子的概念区分);31.2、31.6(比较 Vasicek、Rendleman–Bartter、CIR);31.7、31.8、31.11(零息债期权闭式解及看涨–看跌平价);31.9、31.10、31.12(Jamshidian 分解);31.13(Vasicek/CIR 的最大似然估计,适合编程);31.14、31.16、31.17、31.23(亲手建 Hull–White、Ho–Lee、对数正态三叉树并验证与初始曲线一致,最能检验对 31.7 节的掌握);31.20(证明 (31.25)–(31.27));31.21(Vasicek/CIR 下的凸性 \(\hat C\));31.22、31.28(现实世界与风险中性世界的过程);31.24、31.26、31.27(DerivaGem 校准与美式债券期权,比较正态与对数正态模型)。
原书对照
| 本章小节 | 原书章节 | PDF 页码 |
|---|---|---|
| 章首导言 | Chapter 31 introduction | p.729 |
| 31.1 背景 | 31.1 Background | p.729–730 |
| 31.2 均衡模型(例 31.1–31.3) | 31.2 Equilibrium Models | p.730–737 |
| 31.3 无套利模型 | 31.3 No-Arbitrage Models | p.737–741 |
| 31.4 债券期权 | 31.4 Options on Bonds | p.741–742 |
| 31.5 波动率结构 | 31.5 Volatility Structures | p.742–743 |
| 31.6 利率树 | 31.6 Interest Rate Trees | p.743–745 |
| 31.7 一般建树程序(表 31.1–31.3,图 31.8–31.11) | 31.7 A General Tree-Building Procedure | p.745–755 |
| 31.8 校准 | 31.8 Calibration | p.755–756 |
| 31.9 用单因子模型对冲 | 31.9 Hedging Using a One-Factor Model | p.756–757 |
| 小结、延伸阅读、习题 | Summary, Further Reading, Practice Questions 31.1–31.28 | p.757–762 |
注:PDF 页码 = 书页码 + 1。