第2章:利率曲线构建方法论:从市场报价到连续曲线
说实话,利率曲线构建这件事,我入行头两年一直觉得挺玄乎的。
市场上有那么多不同期限的利率产品——隔夜拆借、3个月期货、1年期互换、10年期国债……它们报价方式不同,计息规则不同,流动性也不同。怎么把这些乱七八糟的东西,变成一条光滑的、连续的、可以用来定价的曲线?
嗯,这就是Bootstrapping要干的事。
2.1 核心思想:从离散到连续
Bootstrapping,中文叫「自举法」。名字挺唬人,说白了就是——用已知的、短端的利率,一步步推导出未知的、长端的利率。
你想想看,市场上能直接看到的利率,都是特定期限的。比如3个月Libor、6个月Libor。但我要给一个2.5年期的互换定价,市场上没有直接报价。怎么办?
那就用已有的短端利率,把2.5年的现金流拆开,一段一段贴现回来。未知的那个贴现因子,就是我们要「自举」出来的。
核心逻辑就一句话:
已知短端 → 推导长端 → 逐段推进 → 形成完整曲线
我在项目中遇到过最典型的场景:客户要为一个5年期利率上限期权定价,但市场上只有1年、2年、3年、4年的互换利率。没有5年的?那就用前4年的数据,把第5年的贴现因子「自举」出来。这就是Bootstrapping的日常。
2.2 数学原理:一步一步拆解
咱们用最简单的例子来理解。假设市场上只有两种产品:
- 1年期零息债券,收益率2%
- 2年期附息债券,票面利率3%,每年付息一次,价格100
现在我要构建一条0-2年的贴现因子曲线。
第一步:处理1年期
1年期零息债券,没有中间现金流。贴现因子直接算:
d(1) = 1 / (1 + 0.02) = 0.9804
这个很简单,对吧?
第二步:处理2年期
2年期附息债券,第一年末付息3元,第二年末付息103元(本金+最后一期利息)。
它的价格等于所有现金流的贴现和:
100 = 3 * d(1) + 103 * d(2)
d(1)我们已经知道了,代入:
100 = 3 * 0.9804 + 103 * d(2)
100 = 2.9412 + 103 * d(2)
d(2) = (100 - 2.9412) / 103 = 0.9423
你看,d(2)就这么被「自举」出来了。
我的经验:实际项目中,债券往往不止两只。你可能面对的是20只、30只不同期限的债券或互换。但原理一模一样——从最短的开始,逐段推进。我曾经用Excel手动搭过一个Bootstrapping模型,30步迭代,每一步都盯着看有没有负利率出现。嗯,那时候市场还没负利率,现在可不一样了。
2.3 插值:从离散点到连续曲线
Bootstrapping做完,我们得到的是离散的贴现因子点。比如0.5年、1年、2年、3年、5年、10年……但定价的时候,我需要任意期限的利率。比如3.7年。
这就得靠插值了。
常用的插值方法有几种:
| 方法 | 插值对象 | 特点 |
|---|---|---|
| 线性插值 | 即期利率 | 简单,但曲线不够光滑 |
| 线性插值 | 贴现因子 | 保证无套利,但远期利率可能跳跃 |
| 三次样条插值 | 即期利率 | 光滑,但可能过冲 |
| 单调三次插值 | 即期利率 | 光滑且单调,我最常用 |
我个人习惯用单调三次插值。为什么?因为它在保证曲线光滑的同时,不会出现「利率先涨后跌再涨」这种奇怪的波动。我在2018年做一个国债期货对冲项目时,就因为用了普通三次样条,导致曲线在5-7年段出现了一个小驼峰,差点把对冲比率算错。后来换成单调三次插值,问题就解决了。
避坑指南:我曾经在构建人民币利率曲线时,发现3年期和5年期互换利率之间插值出来的4年期利率,跟市场上实际交易的4年期互换利率差了5个基点。查了半天,原来是插值方法选错了——用贴现因子线性插值,远期利率会变得不平滑。后来改用即期利率单调三次插值,误差降到了1个基点以内。
2.4 完整的Bootstrapping流程
下面这张图,是我自己总结的Bootstrapping标准流程。每次做曲线构建,我都按这个步骤来:
这个流程我用了快十年。每次构建曲线,我都会从步骤2开始仔细检查——市场报价有没有异常?有没有因为流动性不足导致的「假报价」?我记得2015年有一次,某只10年期国债的报价明显偏离了收益率曲线,后来发现是交易员手误多打了一个数字。如果直接拿来做Bootstrapping,整条曲线都会歪掉。
2.5 实际项目中的注意事项
最后,分享几个我在实战中踩过的坑:
- 期限匹配问题:不同产品的计息基准不一样。Libor是ACT/360,国债是ACT/365。Bootstrapping之前,一定要统一成同一种计息基准。否则算出来的贴现因子会自相矛盾。
- 流动性权重:不是所有市场报价都值得信任。3个月期货流动性好,权重可以给高一些;某些长期限互换可能一天都没几笔成交,权重就要降低。我一般会用一个「流动性评分」来加权处理。
- 负利率的处理:2016年以后,欧元区和日本出现了负利率。传统的Bootstrapping方法在负利率环境下可能会算出负的贴现因子——这在数学上没问题,但很多风控系统会报错。我的做法是:改用对数贴现因子,保证结果始终为正。
- 曲线的一致性检验:构建完曲线后,一定要做回测。把曲线上的利率代回市场产品,看能不能还原出原始报价。误差超过0.5个基点的,就要回去检查了。
一个小技巧:如果你用Python做Bootstrapping,建议用scipy.optimize里的fsolve来求解非线性方程。手动迭代虽然能加深理解,但效率太低。我早期用Excel VBA写过一套,跑一次要3分钟。后来换成Python+SciPy,同样的数据,0.3秒搞定。
好了,这一章的内容就到这里。Bootstrapping是利率曲线构建的基石,理解了它,后面的多曲线框架、信用利差建模都会轻松很多。