量化交易中文教材

第 29 章 利率衍生品:标准市场模型

利率衍生品是收益以某种方式依赖利率水平的产品。1980–90 年代,场外和交易所的利率衍生品交易量迅速增长,新产品不断出现,如何稳健地定价和对冲成为核心问题。利率衍生品比股票和外汇衍生品更难定价,原因有四:

  1. 单个利率的行为比股价或汇率更复杂(均值回归、不能无限上涨、曾经长期接近零甚至为负);
  2. 许多产品需要一个能描述整条零息收益率曲线的模型;
  3. 收益率曲线上不同期限的点波动率不同;
  4. 利率既用来定义收益,又用来贴现。

本章介绍三种最流行的场外利率期权——债券期权、利率上限/下限、欧式互换期权——以及它们的标准市场模型。三个模型都是 Black 模型的变体,而 Black 模型在随机利率下成立的理由,正是第 28 章的计价单位理论:债券期权和 caplet 用零息债为计价单位,互换期权用年金为计价单位。读本章时,请对照第 28.4 节的表格:每个公式都是"选计价单位 → 令期望等于远期值 → 对数正态 → Black 公式"这个模板的一个实例。

学习目标

  1. 识别各种嵌入式债券期权(可赎回、可回售、提前支取、提前还款、贷款承诺)及其期权方向。
  2. 会用 Black 模型给欧式债券期权定价,正确处理全价与净价、现金行权价与报价行权价,会把收益率波动率换算为价格波动率。
  3. 理解利率上限是 caplet 的组合,也是零息债看跌期权的组合;掌握 caplet 的 Black 公式及其在 \(t_{k+1}\)-远期测度下的理论依据;理解上限—下限平价。
  4. 区分即期波动率与平坦波动率,会从平坦波动率 bootstrap 即期波动率,理解波动率驼峰。
  5. 会用年金测度推导并使用欧式互换期权公式,理解互换期权与债券期权的等价关系。
  6. 了解 OIS 贴现下公式的修改,以及利率衍生品 delta、gamma、vega 的多种定义(DV01、分桶、主成分)。

读前导读

这一章在解决什么问题

这一章是第 28 章的"兑现":把抽象的计价单位理论变成交易台每天用的三个公式。你在 CFA 固定收益里已经学过本章大部分的"原料":收益率曲线与即期利率、远期利率、债券全价与净价、久期、可赎回与可回售债券、利率互换的估值、利率上限/下限的概念。本章补上的是怎么给这些期权定价。

三个产品可以这样对应你已有的知识:

  • 债券期权:标的是一张债券。你会算债券价格和远期债券价格,本章只是把它们代入 Black 公式。可赎回债 = 普通债 − 发行人持有的看涨期权,这是 CFA 二级的内容,本章告诉你那个看涨期权怎么估值。
  • 利率上限(cap):一串对未来各期 LIBOR 的看涨期权。每个 caplet 的输入是"从今天收益率曲线上算出的远期利率"和"付款日的贴现因子",都是你会算的东西。
  • 互换期权(swaption):进入一个互换的权利。互换的估值、互换利率的计算你在 CFA 里做过;本章的新东西是年金因子 \(A\)(就是互换的 PVBP)作为"贴现因子"。

三个公式都套同一个模板:今天可查的贴现因子(或年金)× [远期值 × \(N(d_1)\) − 行权值 × \(N(d_2)\)]。为什么可以这样写,第 28 章已经证明;本章用到的只是结论:在合适的测度下,"期望未来利率"可以直接用从收益率曲线算出的远期利率代替。

需要先想起来的数学

1. Black 公式的结构。 \(\text{价值}=\text{贴现因子}\times[F\,N(d_1)-K\,N(d_2)]\),\(d_{1,2}=\frac{\ln(F/K)\pm\sigma^2T/2}{\sigma\sqrt T}\)。\(N(\cdot)\) 是标准正态累计分布函数。它和 BSM 的唯一区别是用远期价格 \(F\) 代替 \(S_0e^{(r-q)T}\)。第 28.6 节已推导。

2. 久期作为一阶导数。 修正久期 \(D=-\frac1B\frac{dB}{dy}\),所以 \(\frac{\Delta B}{B}\approx-D\Delta y\)。这就是一阶泰勒展开。29.1 节用它把收益率波动率换算成价格波动率。见 第 00 册第 02 章 导数与泰勒展开。

3. 远期利率与贴现因子的关系。 \(1+\delta F=P(0,t_k)/P(0,t_{k+1})\),即"短期贴现因子 ÷ 长期贴现因子 = 中间那段的增长因子"。例:\(P(0,1)=0.95\)、\(P(0,1.25)=0.938\),则 \(F=(0.95/0.938-1)/0.25\approx5.1\%\)。

4. Bootstrap(逐期反推)。 从最短期限开始,已知前面各段的值,用下一个市场报价解出新增那一段。你在 CFA 里用它从票息债收益率推出即期利率;本章用同样的方法从平坦波动率推出即期波动率。

5. 偏导数与"分桶"。 组合对曲线上某一段利率的偏导数(其他段不动),就是关键利率久期的思想。见 第 00 册第 05 章 多元微积分与优化 的偏导数部分。

怎么读这一章

必读:29.1 的 Black 债券期权公式和"全价与净价"(实务中最常犯的错);29.2 的 caplet 公式、"上限 = 零息债看跌组合"、上限—下限平价、即期与平坦波动率;29.3 的互换期权公式和"上限与互换期权的结构区别"。

"模型的理论依据"两小节是第 28 章的应用,如果第 28 章还没吃透,第一次可以只记结论:caplet 用付款日的零息债做计价单位,互换期权用年金做计价单位。DerivaGem 与日计数、29.4 OIS 贴现、29.5 对冲中的 gamma 与 vega 可以快速浏览。最后的"本章模型的局限"请务必读,它解释了为什么还需要第 31、32 章。


29.1 债券期权

债券期权是在特定日期或之前以特定价格买入或卖出特定债券的期权。除了场外单独交易,债券期权更常见的形式是嵌入在债券或贷款条款中。

嵌入式债券期权

  • 可赎回债券(callable bond):发行人可在未来某些时间以预定价格买回债券。持有人相当于向发行人卖出了看涨期权,行权价即赎回价。通常前几年不可赎回(锁定期 lock-out period),之后赎回价通常随时间递减。例:10 年期可赎回债,前 2 年不可赎回,第 3–4 年赎回价 110,第 5–6 年 107.5,第 7–8 年 106,第 9–10 年 103。持有人卖出了期权,所以可赎回债的收益率一般高于同类不可赎回债。
  • 可回售债券(puttable bond):持有人可在某些时间要求按预定价格提前偿还,相当于持有债券加一个看跌期权,收益率较低。简单例子:10 年期债,持有人有权在第 5 年末要求还款(有时称为 retractable bond)。
  • 可随时无罚金提前支取的定期存款:例如 5 年期定期存款,投资者可以随时按面值把"债券"卖回给银行,是一个美式看跌期权。
  • 贷款和按揭的提前还款权:借款人可以按面值"买回"自己的债务,是看涨期权。按揭贷款的提前还款权使抵押支持证券(MBS)具有负凸性(第 8、32 章)。
  • 贷款承诺:银行向潜在借款人报出 5 年期利率 5%,有效期 2 个月。客户相当于获得了在 2 个月内按面值向银行卖出一张 5% 票息、5 年期债券的权利——一个债券看跌期权,利率上升时行权。

欧式债券期权的 Black 模型

标准市场模型假设远期债券价格的波动率为 \(\sigma_B\),在期权到期时远期债券价格对数正态,使用第 28.6 节的 Black 模型(\(\sigma_F=\sigma_B\),\(F_0=F_B\)):

\[c=P(0,T)[F_BN(d_1)-KN(d_2)],\tag{29.1}\]
\[p=P(0,T)[KN(-d_2)-F_BN(-d_1)],\tag{29.2}\]
\[d_1=\frac{\ln(F_B/K)+\sigma_B^2T/2}{\sigma_B\sqrt T},\qquad d_2=d_1-\sigma_B\sqrt T.\]
\(K\) 为行权价,\(T\) 为期权期限,\(P(0,T)\) 为期限 \(T\) 的无风险贴现因子。由第 5.5 节,远期债券价格为
\[F_B=\frac{B_0-I}{P(0,T)},\tag{29.3}\]
\(B_0\) 为当前债券价格,\(I\) 为期权存续期内票息的现值。

金融直觉:(29.3) 就是持有成本(cost of carry)模型。今天买入债券花 \(B_0\),期权存续期内会收到票息(现值 \(I\)),这部分不属于 \(T\) 时交割的债券,要扣掉;剩下的 \(B_0-I\) 按 \(T\) 期无风险利率"复利到 \(T\)",即除以 \(P(0,T)\),就是 \(T\) 时交割的公平价格。例 29.1 里 \((960-95.45)/0.92=939.68\):远期价格低于现价,因为期间的高票息(10%)超过了融资成本。

全价与净价。 公式中的 \(B_0\) 和 \(F_B\) 必须是现金价格(cash price,或全价 dirty price),而不是报价(quoted price,或净价 clean price),两者相差应计利息(第 6.1 节)。行权价 \(K\) 也必须是现金行权价:若合同中的行权价是行权时交换的现金额,\(K\) 就取该值;若(更常见地)行权价是行权时的报价,则 \(K\) = 行权价 + 期权到期日的应计利息。

例 29.1 10 个月期欧式看涨,标的为剩余 9.75 年、面值 $1,000 的债券(期权到期时剩 8 年 11 个月)。当前现金债券价格 $960,行权价 $1,000,10 个月无风险利率 10%/年,10 个月远期债券价格的波动率 9%/年。债券年票息 10%,半年付息,3 个月后和 9 个月后各付 $50(所以当前应计利息 $25,报价为 $935)。3 个月和 9 个月的无风险利率分别为 9.0% 和 9.5%。

票息现值 \(I=50e^{-0.25\times0.09}+50e^{-0.75\times0.095}=95.45\),远期债券价格 \(F_B=(960-95.45)e^{0.1\times0.8333}=939.68\)。

  • (a) 行权价是现金价格:\(F_B=939.68\),\(K=1000\),\(P(0,T)=e^{-0.1\times10/12}=0.9200\),\(\sigma_B=0.09\),\(T=10/12\),看涨价格 $9.49。
  • (b) 行权价是报价:期权在付息日后 1 个月到期,\(K\) 要加上 1 个月的应计利息:\(1000+100\times0.08333=1008.33\),看涨价格 $7.97。

两者差了 16%,在定价系统里把净价和全价搞混,是最常见也最昂贵的错误之一。

推导拆解:(b) 中的 1008.33 是怎么来的?期权在第 10 个月到期,上一次付息在第 9 个月,距今 1 个月。年票息 $100,1 个月的应计利息 \(=100\times1/12=8.33\)。合同约定的行权价 1000 是净价,行权时实际交付的现金 = 净价 + 应计利息 = 1008.33。Black 公式里的 \(F_B\) 是全价口径,所以 \(K\) 也必须换成全价口径,两边才可比。 当前报价 935 与现金价 960 也是同理:上次付息在 3 个月前,应计利息 \(=100\times3/12=25\)。

债券价格的波动结构

原书图 29.1 画出了债券价格对数的标准差随时间的变化:今天为 0(价格已知),到期时也为 0(必然等于面值),中间先升后降,这就是拉向面值(pull-to-par)效应。所以欧式债券期权使用的波动率

\[\sigma_B=\frac{\text{期权到期时债券价格对数的标准差}}{\sqrt{\text{期权期限}}}\]
在标的债券固定时,通常随期权期限增加而下降(图 29.2)。这意味着用 5 年期期权隐含的价格波动率给同一债券上 9 年期期权定价,会高估价格(习题 29.6)。

收益率波动率

债券期权常报收益率波动率(yield volatility)而不是价格波动率,市场用久期(第 4 章)换算。设 \(D\) 为期权到期时标的(远期)债券的修正久期,则 \(\Delta F_B/F_B\approx-D\Delta y_F=-Dy_F\cdot\Delta y_F/y_F\),所以远期债券价格的波动率 \(\sigma_B\) 与远期收益率的波动率 \(\sigma_y\) 近似满足

\[\sigma_B=Dy_0\sigma_y,\tag{29.4}\]
\(y_0\) 为初始远期收益率。

推导拆解:这一步完全是你熟悉的久期近似。 (1) 久期:\(\Delta F_B/F_B\approx-D\,\Delta y\)(一阶泰勒展开)。 (2) 把绝对变化 \(\Delta y\) 改写成"收益率水平 × 百分比变化":\(\Delta y=y\cdot(\Delta y/y)\)。 (3) 两边取标准差(年化):价格的百分比变化的波动率 \(=D\cdot y\cdot\)(收益率的百分比变化的波动率),负号不影响标准差。 所以"收益率波动率 20%"是相对波动率:收益率 8% 时,一年内收益率的标准差约 \(8\%\times20\%=160\) bp,再乘久期 5 得到价格波动约 8%。这也说明它只是一阶近似,忽略了凸性。

报收益率波动率时,惯例是按 (29.4) 换算为价格波动率,再代入 (29.1)/(29.2)。例:期权到期时修正久期 5 年,远期收益率 8%,经纪商报远期收益率波动率 20%,则 \(\sigma_B=5\times0.08\times0.2=8\%\)。远期债券价格的波动率随期权期限变化(图 29.2),而远期收益率的波动率更稳定,所以交易员更喜欢报后者。

例 29.2 10 年期债券,本金 100,年票息 8%(半年付),零息曲线平坦为 5%(连续复利),债券报价 122.82。该债券上的 2.25 年期欧式看跌,行权价 115,远期收益率波动率 20%。原书用 DerivaGem 得到:行权价为报价时期权价 $2.36,为现金价时 $1.74。

本章代码手工复现了这个结果(原书习题 29.16):期权存续期内 4 次票息的现值 \(I\),远期债券价格 \(F_B=120.62\);剩余 7.75 年现金流对应的远期收益率为 5.063%(半年复利),修正久期 5.846,所以 \(\sigma_B=5.846\times0.05063\times0.20=5.92\%\)。行权价为报价时,现金行权价 = 115 + 应计利息 2(距上次付息 3 个月)= 117,看跌价格 2.36;行权价为现金价时 \(K=115\),看跌价格 1.74。


29.2 利率上限与下限

上限

考虑一张按 LIBOR 定期重置利率的浮动利率票据。重置间隔称为期限(tenor),例如 3 个月:头 3 个月用初始的 3 个月 LIBOR,接下来 3 个月用 3 个月时的 3 个月 LIBOR,依此类推。利率上限(interest rate cap)为票据利率超过某水平(上限利率 cap rate)提供保险。

例:本金 1000 万美元,tenor 3 个月,期限 5 年,上限利率 4%(季度复利)。忽略日计数(每期恰好 0.25 年)。若某个重置日 3 个月 LIBOR 为 5%,票据需在 3 个月后支付利息 \(0.25\times0.05\times10^7=\$125{,}000\);按 4% 计应为 $100,000,所以上限赔付 $25,000。注意赔付发生在3 个月后,而不是观察到 5% 的重置日,这反映了利率观察与付息之间的时滞。若 LIBOR 低于 4%,无赔付。通常规定:即使初始 LIBOR 高于上限利率,第一个期间也不赔付。所以 5 年期上限有 19 个重置日(0.25, 0.50, …, 4.75 年)和 19 个潜在赔付日(0.50, 0.75, …, 5.00 年)。

上限是利率期权的组合。 设上限期限 \(T\)、本金 \(L\)、上限利率 \(R_K\),重置日 \(t_1,\dots,t_n\),\(t_{n+1}=T\),\(R_k\) 为 \(t_k\) 时观察到的 \(t_k\) 到 \(t_{k+1}\) 的 LIBOR。在 \(t_{k+1}\) 的赔付为

\[L\delta_k\max(R_k-R_K,0),\tag{29.5}\]
\(\delta_k=t_{k+1}-t_k\),\(R_k\) 与 \(R_K\) 都按重置频率复利。每一项是一个对 \(t_k\) 时 LIBOR 的看涨期权,在 \(t_{k+1}\) 支付,称为上限单元(caplet)。上限就是 \(n\) 个 caplet 的组合。

上限也是债券期权的组合。 (29.5) 在 \(t_{k+1}\) 的赔付等价于在 \(t_k\) 支付其贴现值 \(\frac{L\delta_k}{1+R_k\delta_k}\max(R_k-R_K,0)\),化简为

\[\max\Big(L-\frac{L(1+R_K\delta_k)}{1+R_k\delta_k},\ 0\Big).\tag{29.6}\]
\(\frac{L(1+R_K\delta_k)}{1+R_k\delta_k}\) 是 \(t_k\) 时一张在 \(t_{k+1}\) 支付 \(L(1+R_K\delta_k)\) 的零息债的价值。所以 (29.6) 是一个到期日 \(t_k\)、标的为 \(t_{k+1}\) 到期面值 \(L(1+R_K\delta_k)\) 的零息债、行权价 \(L\) 的看跌期权。利率上限 = 零息债欧式看跌期权的组合:利率涨,债券价格跌,看跌期权赚钱,两种描述完全一致。

推导拆解:从 (29.5) 到 (29.6) 只有两步。 (1) 把 \(t_{k+1}\) 的赔付提前到 \(t_k\):此时 \(R_k\) 已知,一期的贴现因子就是 \(1/(1+R_k\delta_k)\),这里没有任何不确定性,所以可以直接贴现。 (2) 化简:\(\frac{L\delta_k(R_k-R_K)}{1+R_k\delta_k}=\frac{L(1+R_k\delta_k)-L(1+R_K\delta_k)}{1+R_k\delta_k}=L-\frac{L(1+R_K\delta_k)}{1+R_k\delta_k}\)。分子先加一个 \(L\) 再减一个 \(L\),凑出来的。\(\max\) 号可以整体移进来,因为分母为正。 数值例:\(L=100\)、\(\delta=0.25\)、\(R_K=4\%\)、\(R_k=5\%\)。原式 \(=100\times0.25\times1\%/1.0125=0.2469\);(29.6) \(=100-101/1.0125=0.2469\)。一致。

下限与领口

利率下限(floor)在利率低于某水平时赔付:在 \(t_{k+1}\) 赔付 \(L\delta_k\max(R_K-R_k,0)\)。它是利率看跌期权的组合,也是零息债看涨期权的组合,单个称为下限单元(floorlet)。

领口(collar,又称 floor–ceiling agreement)保证 LIBOR 浮动利率票据的利率始终处于两个水平之间:多头上限 + 空头下限。通常设计为上限价格等于下限价格,零成本进入。

上限—下限平价

原书 Business Snapshot 29.1 给出

\[\text{上限价值}=\text{下限价值}+\text{互换价值}.\]
三者的行权利率都是 \(R_K\),期限和付款频率相同;互换为收 LIBOR、付固定利率 \(R_K\),且首个重置日无交换。理由:多头上限 + 空头下限在 LIBOR > \(R_K\) 时得到 LIBOR − \(R_K\),在 LIBOR < \(R_K\) 时付出 \(R_K\) − LIBOR,即任何情况下都得到 LIBOR − \(R_K\),正是这个互换的现金流。注意普通互换在首个重置日按 0 时的 LIBOR 交换,而上限和下限首期不赔付,所以平价中的互换是"去掉首期"的非标准互换。

由平价还可以推出:当 \(R_K\) 等于(去掉首期的)互换利率时,互换价值为 0,上限与下限价值相等;同行权价、同期限的上限和下限必须有相同的隐含波动率,否则存在套利(习题 29.12)。

Caplet 的 Black 公式

标准市场模型下,caplet 的价值为

\[L\delta_kP(0,t_{k+1})[F_kN(d_1)-R_KN(d_2)],\tag{29.7}\]
\[d_1=\frac{\ln(F_k/R_K)+\sigma_k^2t_k/2}{\sigma_k\sqrt{t_k}},\qquad d_2=d_1-\sigma_k\sqrt{t_k},\]
\(F_k\) 为 0 时看到的 \(t_k\) 到 \(t_{k+1}\) 的远期利率,\(\sigma_k\) 为该远期利率的波动率。这是 Black 模型的自然推广,有两个细节值得注意:\(\sigma_k\) 乘以 \(\sqrt{t_k}\)(利率在 \(t_k\) 观察确定),而贴现因子用 \(P(0,t_{k+1})\)(在 \(t_{k+1}\) 支付)。floorlet 的价值为
\[L\delta_kP(0,t_{k+1})[R_KN(-d_2)-F_kN(-d_1)].\tag{29.8}\]

例 29.3 对 1000 万美元在 1 年后开始的 3 个月期 LIBOR 设上限 8%(季度复利),这是一个 caplet。用 LIBOR/互换利率作为无风险贴现率,零息曲线平坦为 7%(季度复利),对应连续复利 6.9395%。3 个月远期利率的波动率为 20%/年。于是 \(F_k=0.07\),\(\delta_k=0.25\),\(L=10\)(百万),\(R_K=0.08\),\(t_k=1.0\),\(t_{k+1}=1.25\),\(P(0,1.25)=e^{-0.069395\times1.25}=0.9169\),\(\sigma_k=0.20\):

\[d_1=\frac{\ln(0.07/0.08)+0.2^2\times1/2}{0.20\times1}=-0.5677,\qquad d_2=-0.7677,\]
\[\text{caplet}=0.25\times10\times0.9169[0.07N(-0.5677)-0.08N(-0.7677)]=0.005162,\]
即 $5,162。

模型的理论依据

为什么 (29.7) 可以"把期望利率设为远期利率、再用今天的 \(P(0,t_{k+1})\) 贴现"?第 28.4 节给出了两个工具,都针对以 \(t_{k+1}\) 到期零息债为计价单位的世界(\(t_{k+1}\)-远期测度,期望记为 \(E_{k+1}\)):

  1. 任何证券的当前价值 = 该世界中它在 \(t_{k+1}\) 时的期望值 × \(P(0,t_{k+1})\)(式 28.20);
  2. 该世界中 \(t_k\) 到 \(t_{k+1}\) 的利率的期望等于远期利率(式 28.22)。

由 (1),caplet 的价格为

\[L\delta_kP(0,t_{k+1})E_{k+1}[\max(R_k-R_K,0)].\tag{29.9}\]
假设远期利率的波动率为常数 \(\sigma_k\),则在该世界中 \(R_k\) 对数正态,\(\ln R_k\) 的标准差为 \(\sigma_k\sqrt{t_k}\)。由 (15A.1),(29.9) 化为 \(L\delta_kP(0,t_{k+1})[E_{k+1}(R_k)N(d_1)-R_KN(d_2)]\)。由 (2),\(E_{k+1}(R_k)=F_k\),即得 (29.7)。

结论:只要令期望利率等于远期利率,就可以用今天市场上的 \(t_{k+1}\) 期利率贴现。 这在利率随机时并不显然——在传统风险中性世界里,\(R_k\) 的期望不等于远期利率,贴现因子也与 \(R_k\) 相关;两个误差恰好在 \(t_{k+1}\)-远期测度下同时消失。关键是计价单位的到期日必须是付款日 \(t_{k+1}\)。如果付款日不是 \(t_{k+1}\)(比如在 \(t_k\) 就支付),就需要第 30 章的时间调整。

白话解释:把这一节和第 28 章连起来读,逻辑只有一句:选"付款日到期的零息债"作为记账单位,配套的那套概率权重恰好让"期望利率 = 收益率曲线上的远期利率"。 风险中性世界本身是计算工具,\(t_{k+1}\)-远期测度也是计算工具,在它下面"期望利率等于远期利率"不代表市场预测利率会走到远期利率。你在 CFA 里学过,远期利率包含期限溢价,不是未来即期利率的无偏预测;这和本节结论并不矛盾,因为本节的"期望"是在计算用的权重下求的,不是在真实概率下求的。 例 29.3 中三个输入都能直接从市场读出:\(F_k=7\%\) 来自收益率曲线,\(P(0,1.25)=0.9169\) 来自收益率曲线,\(\sigma_k=20\%\) 来自经纪商报价。这就是"标准市场模型"之所以被广泛使用的原因:它不需要对利率的真实走势作任何假设。

即期波动率与平坦波动率

每个 caplet 都要按 (29.7) 单独估值。有两种约定:

  • 即期波动率(spot volatility):每个 caplet 用各自的波动率 \(\sigma_k\);
  • 平坦波动率(flat volatility):同一个上限中所有 caplet 用同一个波动率,但该波动率随上限期限而变。

市场报价通常是平坦波动率,但许多交易员喜欢估计即期波动率,以识别定价偏高或偏低的 caplet。3 个月 LIBOR 的 caplet/floorlet 与欧洲美元期货期权非常相似,两者的即期波动率常被拿来比较。两种波动率可以互推:从最短的上限开始,逐个 bootstrap(习题 29.20)。平坦波动率类似即期波动率的"累计平均",所以变化更平滑。

金融直觉:平坦波动率与即期波动率的关系,和到期收益率(YTM)与即期利率的关系完全一样。 YTM 是"让一张债券所有现金流用同一个贴现率"的那个利率,即期利率是"每笔现金流各用各的贴现率"。平坦波动率是"让一个上限里所有 caplet 用同一个波动率"的那个波动率,即期波动率是"每个 caplet 各用各的"。 bootstrap 的步骤也一样:1 年上限只含 1 年以内的 caplet,解出它们的即期波动率;2 年上限的价格减去前面已定价的 caplet,剩下的差额只由 1–2 年的 caplet 贡献,解出它们的即期波动率;依此类推。 由于平坦波动率是"平均",即期波动率是"边际",平均上升时边际高于平均,平均下降时边际低于平均。所以驼峰在即期波动率上更尖锐,这和"即期利率曲线比 YTM 曲线更陡"是同一个道理。

波动率驼峰。 原书图 29.3 显示,即期和平坦波动率通常在 2–3 年处出现峰值,无论用期权隐含还是用历史数据计算都是如此。原因没有定论,一种解释是:短端利率由央行控制,波动较小;2–3 年期利率很大程度上由交易员决定,他们可能对短端利率的变化反应过度,使这一段的波动高于短端;超过 2–3 年后,利率的均值回归(第 31 章)使波动率下降。

表 29.1 典型的美元上限/下限平坦隐含波动率经纪商报价(%/年,tenor 3 个月,平值:上限/下限利率等于付款日相同的互换的互换利率)

期限 上限 bid 上限 offer 下限 bid 下限 offer
1 年 18.00 20.00 18.00 20.00
2 年 23.25 24.25 23.75 24.75
3 年 24.00 25.00 24.50 25.50
4 年 23.75 24.75 24.25 25.25
5 年 23.50 24.50 24.00 25.00
7 年 21.75 22.75 22.00 23.00
10 年 20.00 21.00 20.25 21.25

表中清晰可见驼峰。本章代码用表中上限的中间价作为平坦波动率,在一条假想的零息曲线上 bootstrap 出即期波动率:1–2 年间的 caplet 即期波动率 25.7%,高于 2 年平坦波动率 23.75%;7–10 年的 caplet 即期波动率只有 17.8%,低于 10 年平坦波动率 20.5%。即期波动率的驼峰比平坦波动率更尖锐,这是"平均"与"边际"的关系。

DerivaGem 与日计数

DerivaGem 的 Cap_and_Swap_Option 工作表选 Cap/Floor 与 Black-European,输入连续复利的 LIBOR/互换零息曲线(OIS 贴现时还需 OIS 零息曲线)、上限覆盖期的起止日、平坦波动率和结算频率。付款日从期末往前推,最初一个 caplet 覆盖 0.5–1.5 个常规期间。例:覆盖 1.22–2.80 年、按季结算,有 6 个 caplet:2.55–2.80、2.30–2.55、2.05–2.30、1.80–2.05、1.55–1.80、1.22–1.55 年。

日计数惯例。 若 \(R_K\) 按 actual/360 报价(美国常用),公式中的 \(\delta_k\) 应换成 \(t_k\) 到 \(t_{k+1}\) 的计息分数 \(a_k\)。例:\(t_k\) 为 5 月 1 日、\(t_{k+1}\) 为 8 月 1 日,共 92 天,\(a_k=92/360=0.2556\)。\(F_k\) 也须按 actual/360 计算,由 \(1+a_kF_k=P(0,t_k)/P(0,t_{k+1})\) 求得。


29.3 欧式互换期权

产品与用途

互换期权(swaption)是在未来某时进入某个利率互换的权利(不是义务)。许多向企业客户提供互换的大型金融机构也买卖互换期权。

例。 某公司知道 6 个月后将签一笔 5 年期浮动利率贷款,并打算把浮动利息互换成固定利息。它付出一定成本,买入一个互换期权:有权在 6 个月后进入"收 6 个月 LIBOR、付固定 3%"的 5 年期互换。若届时 5 年期互换利率低于 3%,不行权,按市场利率做互换;若高于 3%,行权,得到比市场更有利的互换。互换期权保证了公司未来贷款的固定利率不超过 3%。替代方案是远期互换(forward swap,或 deferred swap):没有前期成本,但有义务进入互换。互换期权与远期互换的区别,类似外汇期权与外汇远期的区别:前者既能享受有利变动,又能防范不利变动。

互换期权是债券期权

原书 Business Snapshot 29.2 指出,利率互换可以看作交换一张固定利率债券与一张浮动利率债券(第 7 章),而互换开始时浮动利率债券的价值总等于本金。所以互换期权是"用固定利率债券交换本金"的期权:

  • 付固定、收浮动的互换期权 = 以本金为行权价的固定利率债券的看跌期权;
  • 收固定、付浮动的互换期权 = 固定利率债券的看涨期权。

标准市场模型

标准做法假设期权到期时标的互换利率对数正态。设持有人有权在 \(T\) 年后进入一个 \(n\) 年期、付固定利率 \(s_K\)、收 LIBOR 的互换,每年付款 \(m\) 次,名义本金 \(L\)。先忽略日计数,每次固定付款为固定利率 × \(L/m\)。若 \(T\) 时 \(n\) 年期互换利率为 \(s_T\),比较固定利率 \(s_T\) 与 \(s_K\) 的两个互换的现金流可知,互换期权的收益是一串现金流

\[\frac Lm\max(s_T-s_K,0),\]
在 \(n\) 年内每年收 \(m\) 次,付款日 \(T_1,\dots,T_{mn}\)(约为 \(T_i=T+i/m\))。每一笔都是对 \(s_T\) 的看涨期权。

推导拆解:为什么收益是"一串 \(\frac Lm(s_T-s_K)\)"?行权时你进入"付 \(s_K\)、收 LIBOR"的互换。同时你可以在市场上以零成本做一个反向的"付 LIBOR、收 \(s_T\)"的互换(\(s_T\) 是当时的市场互换利率)。两者叠加,LIBOR 端完全抵消,剩下每期收 \(s_T\)、付 \(s_K\),即每期净得 \(\frac Lm(s_T-s_K)\),持续 \(mn\) 期。\(s_T<s_K\) 时不行权,得 0。 这串现金流在 \(T\) 时的现值 \(=L(s_T-s_K)\times\sum_i\frac1mP(T,T_i)=L(s_T-s_K)A(T)\)。所以互换期权就是"年金 × 利率差"的期权,后面年金测度的用武之地就在这里。

上限与互换期权的结构区别:上限是多个利率期权的组合(每个 caplet 对应一个不同的 LIBOR);互换期权是对单个互换利率的期权,只是收益重复支付多次。所以上限的价值依赖各个远期利率各自的波动率,互换期权的价值则依赖它们的"组合"——互换利率——的波动率,因而间接依赖各远期利率之间的相关性。这是第 32 章 LIBOR 市场模型需要同时校准上限和互换期权的原因。

付固定 \(s_K\) 的互换期权的价值为

\[\sum_{i=1}^{mn}\frac LmP(0,T_i)[s_0N(d_1)-s_KN(d_2)],\]
\[d_1=\frac{\ln(s_0/s_K)+\sigma^2T/2}{\sigma\sqrt T},\qquad d_2=d_1-\sigma\sqrt T,\]
\(s_0\) 为由 (28.23) 算出的 0 时远期互换利率,\(\sigma\) 为远期互换利率的波动率(\(\sigma\sqrt T\) 为 \(\ln s_T\) 的标准差)。记 \(A=\frac1m\sum_{i=1}^{mn}P(0,T_i)\)(在每个 \(T_i\) 支付 \(1/m\) 的合约的价值,即年金),
\[LA[s_0N(d_1)-s_KN(d_2)].\tag{29.10}\]
收固定 \(s_K\) 的互换期权(收益 \(\frac Lm\max(s_K-s_T,0)\),对 \(s_T\) 的看跌):
\[LA[s_KN(-d_2)-s_0N(-d_1)].\tag{29.11}\]

例 29.4 LIBOR 曲线(用于贴现)平坦为 6%(连续复利)。互换期权赋予持有人在 5 年后进入 3 年期、付固定 6.2% 的互换的权利,远期互换利率的波动率为 20%,半年付款,本金 1 亿美元。

\[A=\frac12\big(e^{-0.06\times5.5}+e^{-0.06\times6}+e^{-0.06\times6.5}+e^{-0.06\times7}+e^{-0.06\times7.5}+e^{-0.06\times8}\big)=2.0035.\]
6% 连续复利等于 6.09% 半年复利,曲线平坦时远期互换利率就是它,所以 \(s_0=0.0609\),\(s_K=0.062\),\(T=5\),\(\sigma=0.2\):
\[d_1=\frac{\ln(0.0609/0.062)+0.2^2\times5/2}{0.2\sqrt5}=0.1836,\qquad d_2=0.1836-0.2\sqrt5=-0.2636,\]
\[\text{价值}=100\times2.0035\times[0.0609N(0.1836)-0.062N(-0.2636)]=2.07\ \text{(百万美元)},\]
与 DerivaGem 一致。代码中用 (28.23) 由贴现因子直接算出远期互换利率,同样是 6.0909%。

金融直觉:\(LA\) 就是标的远期互换的 PVBP 乘以 10,000:本金 1 亿、\(A=2.0035\),远期互换利率每变 1bp,远期互换价值变 \(10^8\times2.0035\times0.0001\approx2\) 万美元。所以 (29.10) 可以读成"PVBP × 一个以 bp 计的利率期权"。 互换期权交易员常用这个视角做快速估算:例 29.4 的期权价值 2.07 百万美元,除以每 bp 的 2 万美元,约等于 103 bp。也就是说,这个期权值"约 100bp 的远期互换利率变动"。

经纪商报价

经纪商提供欧式互换期权隐含波动率(由 29.10/29.11 反解的 \(\sigma\))的矩阵,标的通常是平值(行权互换利率等于远期互换利率)。原书表 29.2(美元,中间价,%/年)的行为期权期限,列为期权到期时标的互换的期限(1/2/3/4/5/7/10 年):

期权期限 1 年 2 年 3 年 4 年 5 年 7 年 10 年
1 个月 17.75 17.75 17.75 17.50 17.00 17.00 16.00
3 个月 19.50 19.00 19.00 18.00 17.50 17.00 16.00
6 个月 20.00 20.00 19.25 18.50 18.75 17.75 16.75
1 年 22.50 21.75 20.50 20.00 19.50 18.25 16.75
2 年 22.00 22.00 20.75 19.50 19.75 18.25 16.75
3 年 21.50 21.00 20.00 19.25 19.00 17.75 16.50
4 年 20.75 20.25 19.25 18.50 18.25 17.50 16.00
5 年 20.00 19.50 18.50 17.75 17.50 17.00 15.50

标的为 1 年期互换的一列呈现与上限类似的驼峰;标的互换越长,驼峰仍在但越不明显(长期互换利率是多个远期利率的平均,波动被分散)。这张"期权期限 × 标的期限"的表加上行权价维度,就是业界所说的互换期权波动率立方(swaption cube)的平值切片。

理论依据

在以年金 \(A\) 为计价单位的世界(年金测度/互换测度)中,由第 28.4 节:

  1. 任何证券的当前价值 = 年金的当前价值 × 该世界中"\(T\) 时证券价值 / \(T\) 时年金价值"的期望(式 28.25);
  2. \(T\) 时互换利率的期望 = 当前远期互换利率(式 28.24)。

互换期权在 \(T\) 的价值是 \(LA(T)\max(s_T-s_K,0)\)(一串收益在 \(T\) 时的现值),除以 \(A(T)\) 恰好消去年金。由 (1),互换期权价值为 \(LA\,E_A[\max(s_T-s_K,0)]\);由 (15A.1) 得 \(LA[E_A(s_T)N(d_1)-s_KN(d_2)]\);由 (2),\(E_A(s_T)=s_0\),即得 (29.10)。

结论:只要令期望互换利率等于远期互换利率,贴现时就可以把利率当作常数(用今天的年金)。 年金测度之所以合适,是因为互换期权的收益天然是"年金 × 利率差"的形式。

日计数。 互换的固定利率按某种日计数惯例表示(如 actual/365 或 30/360)。令 \(T_0=T\),\(T_{i-1}\) 到 \(T_i\) 的计息分数为 \(a_i\)(例:3 月 1 日到 9 月 1 日,actual/365,\(a_i=184/365=0.5041\)),公式不变,只需把年金定义为

\[A=\sum_{i=1}^{mn}a_iP(0,T_i).\]
LIBOR 贴现下的远期互换利率按 (28.23) 计算。


29.4 OIS 贴现

前面的论证假设 LIBOR 既决定现金流又决定无风险贴现率。2008 年后市场普遍改用 OIS 利率贴现有抵押的衍生品(第 9 章)。此时可以用第 9.3 节的方法确定远期 LIBOR:\(t_k\) 到 \(t_{k+1}\) 的远期 LIBOR 定义为 \(E_{k+1}(R_k)\),\(R_k\) 为该期间实现的 LIBOR,\(E_{k+1}\) 为以 \(t_{k+1}\) 到期的无风险(OIS)零息债为计价单位的世界中的期望。

  • 上限:(29.9) 仍正确。把 \(F_k\) 定义为 \(E_{k+1}(R_k)\)、\(P(0,t_{k+1})\) 由 OIS 零息曲线计算,即得 (29.7)。
  • 互换期权:(29.10)(29.11) 仍正确。年金 \(A\) 由 OIS 零息曲线计算;远期互换利率 \(s_0\) 由远期 LIBOR 计算,使远期互换在 OIS 贴现下价值为 0。

要点是:公式形式不变,变的是输入。 贴现因子和年金用 OIS 曲线,远期 LIBOR 和远期互换利率要与 OIS 贴现一致地确定。一个常见错误是用 LIBOR 曲线自举出的远期 LIBOR 配 OIS 贴现因子,原书习题 29.23、29.25 计算了混用两者的误差。第 32.3 节会在更一般的模型中讨论多条曲线。(LIBOR 已于 2023 年前后被 SOFR 等无风险参考利率取代,但"预测曲线与贴现曲线分离、两者在同一测度下一致"的框架完全适用于新的基准。)


29.5 利率衍生品的对冲

第 19a、19b 章的希腊字母可以推广到利率衍生品,但"标的"不再是一个价格,而是一整条曲线。

Delta

Delta 风险是零息曲线移动的风险。曲线的移动方式有很多,所以可以定义多种 delta:

  1. 零息曲线平行移动 1 个基点的影响,称为 DV01;
  2. 构建零息曲线所用的各个工具报价的小变化的影响;
  3. 把零息曲线(或远期曲线)分成若干区段(buckets),每次只移动一个区段 1 bp、其余不变(Business Snapshot 6.3,即关键利率久期/分桶 delta);
  4. 对曲线变动做主成分分析(第 22.9 节),对前几个因子分别计算 delta:第一个因子近似平行移动,第二个是扭转(twist),第三个是弯曲(butterfly)。

实践中交易员更偏好第 2 种:零息曲线只有在构建它的某个工具的报价改变时才会改变,所以关注这些工具价格变化带来的暴露最合理,而且对冲时直接交易这些工具即可。

金融直觉:这四种 delta 对应你在固定收益里学过的几个概念。DV01 是"有效久期 × 价格 × 0.0001",只衡量平行移动。分桶 delta 就是关键利率久期(key rate duration):每个关键期限单独移动 1bp。按工具报价的 delta 是把关键利率久期落到"可以直接交易的对冲工具"上。PCA delta 则把曲线变动压缩成水平、斜率、曲率三个因子,每个因子算一个久期。 数学上,分桶 delta 是组合价值对曲线上各段利率的偏导数,DV01 是它们的和(平行移动 = 所有段同时移动)。本章代码中分桶之和恰好等于 DV01,就是这个关系的验证。

本章代码对一个 5 年期、上限利率 4% 的上限(名义本金 1 亿美元)计算了 DV01 和分桶 delta。注意分桶方式会影响结果:如果直接移动零息利率的一个区段,区段边界处的远期利率会出现很大的跳动,分桶结果会被这种人为扭曲主导。代码采用按远期曲线分桶的方式,每个区段的 delta 都是正的且平滑(1,011 到 5,102 美元),总和恰好等于 DV01(19,402 美元)。

Gamma

多种 delta 对应多种 gamma。若用 10 个工具构建零息曲线并对各报价计算 delta,gamma 为 \(\partial^2\Pi/\partial x_i\partial x_j\),共有 \(10\times11/2=55\) 个不同的值,信息过载。常见的简化:忽略交叉 gamma,只看 10 个 \(i=j\) 的二阶偏导;或对零息曲线的平行移动计算单一 gamma;或只对主成分分析的前两个因子计算 gamma。

Vega

Vega 衡量对波动率变化的暴露。一种做法是让所有上限和欧式互换期权的 Black 波动率作相同的小变化,但这相当于假设一个因子驱动所有波动率,可能过于简化。更好的做法是对上限和互换期权的波动率做主成分分析,对前 2–3 个因子计算 vega。


本章模型的局限

Black 模型及其扩展是给欧式利率期权定价的流行方法,核心是假设期权的标的变量在期权到期时对数正态:欧式债券期权假设标的债券价格对数正态;上限假设每个 caplet 的标的利率对数正态;互换期权假设标的互换利率对数正态。每个模型内部一致,但彼此不一致:债券价格对数正态时,利率和互换利率就不是对数正态,反之亦然。三个模型各自在不同的测度下成立,没有一个统一的随机过程同时满足它们。

白话解释:为什么"彼此不一致"?对数正态的东西取倒数、相加之后就不再是对数正态。债券价格大约是 \(1/(1+y)^n\),如果 \(y\) 对数正态,价格就不是;互换利率是多个远期利率的加权平均,如果每个远期利率对数正态,它们的平均就不是。 这在实务中可以接受,因为每个模型只是把一个市场报价(隐含波动率)翻译成价格的"换算器",就像 YTM 是把债券价格翻译成一个数字的约定。问题出在需要同时依赖多个这类量的产品上,比如百慕大互换期权在多个日期可以进入不同期限的互换,此时必须有一个统一描述整条曲线如何运动的模型,这就是第 31、32 章的任务。

这些模型因此难以推广到美式互换期权(百慕大互换期权)、可赎回债券、路径依赖利率产品等,因为这些产品需要一个描述整条曲线动态的模型。第 31 章的短期利率模型和第 32 章的 LIBOR 市场模型解决了这个问题。另外,Black 模型"令期望等于远期值再按今天的利率贴现"的做法对本章这些普通产品是正确的,但第 30 章会看到,付款时间或货币不"自然"的产品需要凸性、时间和 quanto 调整。

在低利率甚至负利率时代,对数正态假设本身也出了问题(利率为负时 \(\ln\) 无定义)。市场因此改用正态(Bachelier)模型报价和定价,或用"平移对数正态"(shifted lognormal)模型:把 \(F\) 换成 \(F+\text{shift}\)。本章的计价单位论证对这些模型同样成立,只是最后一步的分布假设不同。


量化实战

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

  1. 利率期权定价与做市。Black caplet 公式和 Black 互换期权公式(及其正态模型版本)是利率期权估值的日常工具;表 29.1、29.2 那样的波动率矩阵是交易台的基本数据结构。从平坦波动率 bootstrap 即期波动率,可以识别曲线上相对贵或便宜的 caplet,是利率波动率相对价值交易的起点。
  2. 固定收益风险模型。DV01、关键利率(分桶)delta、主成分 delta 是债券和利率衍生品组合风险归因与对冲的标准方法,也直接用于固收量化中的久期中性、曲线策略(陡峭化/平坦化、蝶式)构造。PCA 的水平、斜率、曲率因子同时也是利率因子模型的基础(第 06 册第 09 章)。
  3. 嵌入期权与信用研究。可赎回债、MBS 提前还款、A 股可转债的回售和赎回条款都是本章嵌入式债券期权的实例。定价和对冲需要把期权价值从债券收益率中剥离出来(期权调整利差 OAS 的思想),否则会把期权价值误当作信用利差或"便宜"。
  4. 系统实现的坑。现金价与报价、应计利息、actual/360 计息分数、付款日从后往前排、首个 caplet 不计、预测曲线与贴现曲线分离、负利率下改用正态模型——这些是利率定价库最常见的出错点,每一项都可能造成数个百分点的定价误差。

Python 示例:四个标准例题、波动率 bootstrap 与分桶 delta

代码依次完成:(1) 例 29.1 债券期权(现金与报价行权价);(2) 例 29.2,按 (29.4) 把收益率波动率换算为价格波动率,复现 DerivaGem 的结果;(3) 例 29.3 caplet;(4) 例 29.4 互换期权,并用 (28.23) 由贴现因子计算远期互换利率;(5) 在一条假想的零息曲线上,用表 29.1 的平坦波动率 bootstrap 即期波动率,验证上限—下限平价;(6) 计算 5 年期上限的 DV01 与远期曲线分桶 delta。

import numpy as np
from scipy.stats import norm
from scipy.optimize import brentq

N = norm.cdf

def black(F, K, T, sig, kind="call"):
    """不含贴现因子的 Black 公式:E[max(F_T-K,0)](或看跌)"""
    d1 = (np.log(F/K) + 0.5*sig**2*T)/(sig*np.sqrt(T))
    d2 = d1 - sig*np.sqrt(T)
    return F*N(d1) - K*N(d2) if kind == "call" else K*N(-d2) - F*N(-d1)

# ---------- 1) 例 29.1:欧式债券期权 ----------
I = 50*np.exp(-0.25*0.09) + 50*np.exp(-0.75*0.095)
T = 10/12
PT = np.exp(-0.10*T)
FB = (960 - I)/PT
print("例29.1 票息现值 I = %.2f, 远期债券价 F_B = %.2f, P(0,T) = %.4f" % (I, FB, PT))
print("  现金行权价 1000:   看涨 = %.2f" % (PT*black(FB, 1000, T, 0.09)))
print("  报价行权价 1000:   看涨 = %.2f (现金行权价 %.2f)" % (PT*black(FB, 1000 + 100*1/12, T, 0.09), 1000 + 100/12))

# ---------- 2) 例 29.2:收益率波动率换算为价格波动率 ----------
r, T = 0.05, 2.25
t_cf = np.arange(0.5, 10.01, 0.5); cf = np.full(t_cf.size, 4.0); cf[-1] += 100
B0 = (cf*np.exp(-r*t_cf)).sum()
I = (cf[t_cf < T]*np.exp(-r*t_cf[t_cf < T])).sum()
PT = np.exp(-r*T); FB = (B0 - I)/PT
ft, fc = t_cf[t_cf > T] - T, cf[t_cf > T]                     # 期权到期时剩余的现金流
y = brentq(lambda y: (fc*(1 + y/2)**(-2*ft)).sum() - FB, 0, 1)  # 远期收益率(半年复利)
D = (ft*fc*(1 + y/2)**(-2*ft)).sum()/FB/(1 + y/2)               # 修正久期
sB = D*y*0.20                                                   # 式 (29.4)
accrued = 4*0.25/0.5
print("例29.2 债券价格 %.2f, F_B = %.2f, 远期收益率 %.3f%%, 修正久期 %.3f, sigma_B = %.3f%%"
      % (B0, FB, 100*y, D, 100*sB))
print("  看跌: 报价行权价 115 -> %.2f ;  现金行权价 115 -> %.2f"
      % (PT*black(FB, 115 + accrued, T, sB, "put"), PT*black(FB, 115, T, sB, "put")))

# ---------- 3) 例 29.3:caplet ----------
rc = 4*np.log(1 + 0.07/4)                                       # 7% 季度复利 -> 连续复利
P125 = np.exp(-rc*1.25)
caplet = 0.25*10e6*P125*black(0.07, 0.08, 1.0, 0.20)
print("例29.3 连续复利 %.4f%%, P(0,1.25) = %.4f, caplet = $%.0f" % (100*rc, P125, caplet))

# ---------- 4) 例 29.4:欧式互换期权 ----------
pay = np.arange(5.5, 8.01, 0.5)
A = 0.5*np.exp(-0.06*pay).sum()
s0 = 2*(np.exp(0.03) - 1)                                       # 6% 连续复利 -> 半年复利
print("例29.4 A = %.4f, s0 = %.4f%%, 付固定互换期权 = %.2f 百万美元"
      % (A, 100*s0, 100*A*black(s0, 0.062, 5, 0.20)))
# 用折现因子直接算远期互换利率 (28.23),验证与 s0 一致
s_fwd = (np.exp(-0.06*5) - np.exp(-0.06*8))/A
print("  由 (28.23) 计算的远期互换利率 = %.4f%%" % (100*s_fwd))

# ---------- 5) 上限:平坦波动率 -> 即期波动率 bootstrap,以及上限-下限平价 ----------
z = lambda t: 0.03 + 0.004*np.log1p(t)                          # 一条向上倾斜的零息曲线(连续复利)
Pz = lambda t: np.exp(-z(t)*t)
tau = 0.25

def cap_schedule(T):
    tk = np.arange(tau, T - 1e-9, tau)                          # 重置日 0.25, ..., T-0.25(首期不计)
    F = (Pz(tk)/Pz(tk + tau) - 1)/tau
    return tk, F

def atm_rate(T):                                                # 平值:上限利率 = 同付款日的互换利率
    tk, _ = cap_schedule(T)
    return (Pz(tk[0]) - Pz(T))/(tau*Pz(tk + tau).sum())

def cap_value(T, RK, vols, kind="call"):
    tk, F = cap_schedule(T)
    return sum(tau*Pz(t + tau)*black(f, RK, t, v, kind) for t, f, v in zip(tk, F, vols))

mats = np.array([1, 2, 3, 4, 5, 7, 10])
flat = np.array([19.00, 23.75, 24.50, 24.25, 24.00, 22.25, 20.50])/100   # 表 29.1 上限 bid/offer 中间价
spot = np.array([])                                              # 已 bootstrap 出的各 caplet 即期波动率
for T, fv in zip(mats, flat):
    RK = atm_rate(T)
    n_all = len(cap_schedule(T)[0])
    target = cap_value(T, RK, np.full(n_all, fv))               # 用平坦波动率算出的市场价格
    n_new = n_all - spot.size                                    # 新增 caplet 共用一个即期波动率
    sv = brentq(lambda v: cap_value(T, RK, np.concatenate([spot, np.full(n_new, v)])) - target, 0.01, 1.0)
    spot = np.concatenate([spot, np.full(n_new, sv)])
    print("  %2d 年上限: 平值利率 %.3f%%, 平坦波动率 %.2f%%, 新增 caplet 的即期波动率 %.2f%%"
          % (T, 100*RK, 100*fv, 100*sv))

T, RK = 5, 0.04                       # 非平值上限利率 4%
vols = np.full(len(cap_schedule(T)[0]), 0.24)
cap, floor = cap_value(T, RK, vols), cap_value(T, RK, vols, "put")
tk, F = cap_schedule(T)
swap = sum(tau*Pz(t + tau)*(f - RK) for t, f in zip(tk, F))       # 收浮动付固定、首期无交换
print("上限-下限平价(5年, R_K=4%%): cap - floor = %.6f, 互换 = %.6f" % (cap - floor, swap))

# ---------- 6) 利率 delta:DV01 与分桶 delta(5 年上限,名义本金 1 亿)----------
def cap_with_curve(shift):
    """shift(t):零息利率的平移量;对远期曲线分桶时 shift(t)*t = bp * (t 落在桶内的长度)"""
    global Pz
    old = Pz
    Pz = lambda t: np.exp(-(z(t) + shift(t))*t)
    v = cap_value(5, RK, vols)
    Pz = old
    return v

L, bp = 1e8, 1e-4
delta = lambda shift: L*(cap_with_curve(lambda t: shift(t, bp)) - cap_with_curve(lambda t: shift(t, -bp)))/2
print("5 年上限价值 = %.0f 美元, DV01(零息曲线平行 1bp) = %.0f 美元" %
      (L*cap_with_curve(lambda t: 0*t), delta(lambda t, h: h + 0*t)))
total = 0
for lo, hi in zip(range(0, 5), range(1, 6)):
    bucket = lambda t, h, lo=lo, hi=hi: h*np.clip(t - lo, 0, hi - lo)/t   # 只移动 (lo,hi] 年的远期利率
    d = delta(bucket); total += d
    print("  远期曲线分桶 (%d,%d] 年 1bp: %+.0f 美元" % (lo, hi, d))
print("  分桶 delta 之和 = %.0f 美元" % total)

输出:

例29.1 票息现值 I = 95.45, 远期债券价 F_B = 939.68, P(0,T) = 0.9200
  现金行权价 1000:   看涨 = 9.49
  报价行权价 1000:   看涨 = 7.97 (现金行权价 1008.33)
例29.2 债券价格 122.82, F_B = 120.62, 远期收益率 5.063%, 修正久期 5.846, sigma_B = 5.920%
  看跌: 报价行权价 115 -> 2.36 ;  现金行权价 115 -> 1.74
例29.3 连续复利 6.9395%, P(0,1.25) = 0.9169, caplet = $5162
例29.4 A = 2.0036, s0 = 6.0909%, 付固定互换期权 = 2.07 百万美元
  由 (28.23) 计算的远期互换利率 = 6.0909%
   1 年上限: 平值利率 3.353%, 平坦波动率 19.00%, 新增 caplet 的即期波动率 19.00%
   2 年上限: 平值利率 3.502%, 平坦波动率 23.75%, 新增 caplet 的即期波动率 25.74%
   3 年上限: 平值利率 3.608%, 平坦波动率 24.50%, 新增 caplet 的即期波动率 25.19%
   4 年上限: 平值利率 3.689%, 平坦波动率 24.25%, 新增 caplet 的即期波动率 23.69%
   5 年上限: 平值利率 3.756%, 平坦波动率 24.00%, 新增 caplet 的即期波动率 23.29%
   7 年上限: 平值利率 3.859%, 平坦波动率 22.25%, 新增 caplet 的即期波动率 19.43%
  10 年上限: 平值利率 3.971%, 平坦波动率 20.50%, 新增 caplet 的即期波动率 17.75%
上限-下限平价(5年, R_K=4%): cap - floor = -0.010532, 互换 = -0.010532
5 年上限价值 = 1981820 美元, DV01(零息曲线平行 1bp) = 19402 美元
  远期曲线分桶 (0,1] 年 1bp: +1011 美元
  远期曲线分桶 (1,2] 年 1bp: +3722 美元
  远期曲线分桶 (2,3] 年 1bp: +4612 美元
  远期曲线分桶 (3,4] 年 1bp: +4955 美元
  远期曲线分桶 (4,5] 年 1bp: +5102 美元
  分桶 delta 之和 = 19402 美元

读输出时注意:

  • 例 29.1 的 9.49 和 7.97、例 29.3 的 $5,162、例 29.4 的 2.07 百万美元与原书一致(年金 2.0036 与原书 2.0035 的差异是四舍五入)。
  • 例 29.2:远期收益率用半年复利、久期用修正久期时,正好复现 DerivaGem 的 2.36 和 1.74。如果用连续复利收益率和麦考利久期,结果会变成 2.41 和 1.78,说明久期与收益率的约定会带来约 2% 的价格差异,系统实现时必须与报价方的约定一致。
  • 即期波动率呈现比平坦波动率更尖锐的驼峰:1–2 年的 caplet 为 25.7%,7–10 年降到 17.8%。这里每个上限都按自己的平值利率定价,bootstrap 时忽略了不同上限的行权价不同,这是实务中常用的近似,严格做法需要波动率微笑。
  • 上限—下限平价在机器精度内成立。
  • 上限的 delta 为正(利率上升,上限变值钱);按远期曲线分桶时,越靠后的桶 delta 越大,因为那里的 caplet 期限长、时间价值大。

本章小结

利率衍生品的标准市场模型都是 Black 模型的变体,理论依据是第 28 章的计价单位理论。欧式债券期权假设远期债券价格对数正态,用远期全价 \(F_B=(B_0-I)/P(0,T)\) 和现金行权价,收益率波动率按 \(\sigma_B=Dy_0\sigma_y\) 换算为价格波动率。利率上限是 caplet 的组合,也是零息债看跌期权的组合;caplet 的 Black 公式在 \(t_{k+1}\)-远期测度下成立,用远期利率作期望、用付款日的贴现因子贴现;上限价值 = 下限价值 + 互换价值。市场报平坦波动率,交易员 bootstrap 出即期波动率,两者在 2–3 年处呈驼峰。欧式互换期权是对单个互换利率的期权,收益重复支付,在年金测度下成立,价值为 \(LA[s_0N(d_1)-s_KN(d_2)]\);付固定互换期权等价于固定利率债券的看跌期权。OIS 贴现下公式形式不变,但贴现因子和年金用 OIS 曲线,远期 LIBOR 和远期互换利率要与之一致地确定。利率衍生品的 delta 有 DV01、按工具报价、分桶、主成分等多种定义,gamma 和 vega 也宜降维处理。三个模型各自内部一致、彼此不一致,不能用于美式或路径依赖产品。

产品 公式 计价单位/测度
欧式债券期权 \(c=P(0,T)[F_BN(d_1)-KN(d_2)]\),\(F_B=\frac{B_0-I}{P(0,T)}\) \(P(t,T)\),\(T\)-远期测度
收益率波动率换算 \(\sigma_B=Dy_0\sigma_y\) —
caplet \(L\delta_kP(0,t_{k+1})[F_kN(d_1)-R_KN(d_2)]\),\(d_1\) 中用 \(\sigma_k\sqrt{t_k}\) \(P(t,t_{k+1})\),\(t_{k+1}\)-远期测度
floorlet \(L\delta_kP(0,t_{k+1})[R_KN(-d_2)-F_kN(-d_1)]\) 同上
上限—下限平价 上限 = 下限 + 互换(收浮动付 \(R_K\),首期无交换) 与模型无关
上限的另一面 caplet = 零息债看跌:\(\max\big(L-\frac{L(1+R_K\delta_k)}{1+R_k\delta_k},0\big)\) —
付固定互换期权 \(LA[s_0N(d_1)-s_KN(d_2)]\),\(A=\sum a_iP(0,T_i)\) 年金 \(A(t)\),互换测度
收固定互换期权 \(LA[s_KN(-d_2)-s_0N(-d_1)]\) 同上
利率 delta DV01、工具报价 delta、分桶 delta、PCA delta —

练习

基础

  1. 一个本金 2000 万美元、上限利率 5%、tenor 6 个月的利率上限,某重置日观察到 6 个月 LIBOR 为 6%。赔付多少?何时支付?(原书习题 29.1 类型) 提示:\(0.5\times(0.06-0.05)\times2000\) 万 \(=10\) 万美元,在 6 个月后支付。

  2. 解释为什么互换期权可以看作一种债券期权。付固定的互换期权对应债券的看涨还是看跌?(原书习题 29.2) 提示:见 Business Snapshot 29.2,付固定 = 固定利率债券的看跌期权,行权价为本金。

  3. 期权到期时标的债券的修正久期为 6.5 年,远期收益率 4%,收益率波动率 25%。Black 模型中应使用的价格波动率是多少?(原书习题 29.8 类型) 提示:\(\sigma_B=6.5\times0.04\times0.25=6.5\%\)。

  4. 某上限和某下限的行权利率、期限、频率都相同,但隐含波动率不同。这是套利机会吗?(原书习题 29.12) 提示:由上限—下限平价,两者的价差必须等于一个与波动率无关的互换价值,所以两者的 Black 隐含波动率必须相同;若不同,买低卖高并做一个反向互换即可套利(忽略买卖价差)。

  5. 一个零成本领口的上限利率与下限利率相同时,它等价于什么?此时公共的行权利率应是多少?(原书习题 29.9) 提示:等价于一个(去掉首期的)收浮动付固定互换;零成本要求行权利率等于该互换的互换利率。

进阶

  1. 推导欧式债券期权的看涨看跌平价,以及欧式互换期权的平价(原书习题 29.10、29.11)。 提示:债券期权 \(c+KP(0,T)=p+F_BP(0,T)=p+B_0-I\);互换期权:付固定互换期权 − 收固定互换期权 = 付固定远期互换的价值 \(LA(s_0-s_K)\)。

  2. 证明:付固定 \(s_K\) 的互换期权 + 收固定 \(s_K\) 的远期互换 = 收固定 \(s_K\) 的互换期权;并由此说明行权利率等于远期互换利率时两类互换期权价值相等(原书习题 29.18)。 提示:直接比较 \(T\) 时的收益;或用 (29.10)(29.11) 相减得 \(LA(s_0-s_K)\)。

  3. 用伊藤引理证明零息债价格的波动率在到期时趋于 0(原书习题 29.15)。 提示:在任意短期利率模型中 \(P(t,T)\) 是 \(r\) 和 \(t\) 的函数,波动率为 \(\frac{1}{P}\frac{\partial P}{\partial r}\sigma_r\);当 \(t\to T\) 时 \(P\to1\) 对 \(r\) 不再敏感(如 Vasicek 中波动率 \(\sigma B(t,T)\to0\))。

  4. 用本章代码,把表 29.1 的 bid 和 offer 分别当作平坦波动率 bootstrap 即期波动率,观察即期波动率的买卖价差在长端如何被放大。 提示:长期上限的平坦波动率包含了前面所有 caplet;新增 caplet 的即期波动率由"差额"决定,平坦波动率的小误差会被放大,这是 bootstrap 的典型数值问题。

  5. 例 29.4 中若改用 OIS 贴现:OIS 曲线平坦为 5.7%(连续复利),远期 LIBOR 按 LIBOR 曲线 6% 平坦计算。重新计算互换期权价格,并与"错误混用"(远期互换利率用 LIBOR 曲线自举、年金用 OIS 曲线)的结果比较(原书习题 29.14、29.23、29.25 类型)。 提示:年金改用 OIS 贴现因子;在本题设定下远期 LIBOR 已给定,远期互换利率为远期 LIBOR 以 OIS 贴现因子加权的平均,平坦时仍为 6.09%。差别主要来自年金。真实市场中远期 LIBOR 要在 OIS 贴现下重新自举,与 LIBOR 贴现下自举的结果不同。

原书推荐习题:29.3、29.21(Black 债券期权,现金与报价行权价);29.5、29.22(caplet 定价,含日计数);29.14、29.23(互换期权定价,LIBOR 与 OIS 贴现对比);29.10、29.11、29.18(各类平价关系);29.20(平坦波动率与即期波动率互推,建议编程实现 bootstrap);29.15(零息债价格波动率趋于 0);29.16(手算例 29.2);29.6(价格波动率随期权期限下降的含义);29.17、29.24(零成本领口与平坦波动率反推)。


原书对照

本章小节 原书章节 PDF 页码
章首导言 Chapter 29 introduction p.696
29.1 债券期权 29.1 Bond Options(例 29.1、29.2,图 29.1、29.2) p.696–701
29.2 利率上限与下限 29.2 Interest Rate Caps and Floors(例 29.3,表 29.1,图 29.3,Business Snapshot 29.1) p.701–707
29.3 欧式互换期权 29.3 European Swap Options(例 29.4,表 29.2,Business Snapshot 29.2) p.707–711
29.4 OIS 贴现 29.4 OIS Discounting p.711
29.5 利率衍生品的对冲 29.5 Hedging Interest Rate Derivatives p.711–712
小结、延伸阅读、习题 Summary, Further Reading, Practice Questions 29.1–29.25 p.712–715

负利率与正态模型、按远期曲线分桶的数值说明为本教材补充。延伸阅读:Black (1976) 商品合约定价;Hull & White (2013) LIBOR vs OIS 贴现。第 30 章(凸性、时间与 quanto 调整)、第 31 章(短期利率模型)、第 32 章(HJM 与 LIBOR 市场模型)在本章基础上继续展开。