第四章:收益率曲线构建方法
收益率曲线这东西,说白了就是市场的“体温计”。你想想看,不同期限的债券收益率摆在一起,能告诉你市场对未来利率怎么看、对经济前景怎么想。但问题是——这些收益率不是现成的,你得自己“造”出来。
我个人习惯把收益率曲线构建分成四类方法:Bootstrapping、Nelson-Siegel、Svensson、样条插值。每种方法都有自己的脾气,咱们一个一个聊。
4.1 Bootstrapping方法
Bootstrapping,中文叫“自举法”。名字挺唬人,其实逻辑很简单——从已知的附息债券价格,一步步倒推出零息收益率。
我在项目中遇到过不少新手,上来就问:“老师,为什么不用直接到期的收益率?” 嗯,问题在于市场上真正零息的债券很少,大部分是附息债。你得把利息剥离掉,才能得到纯纯的折现因子。
核心思路:
短端收益率已知 → 用短端折现长端的第一笔现金流 → 解出长端收益率 → 依次迭代
举个例子。假设市场上有三只国债:
| 期限 | 票面利率 | 价格(面值100) |
|---|---|---|
| 1年 | 0% | 97.5 |
| 2年 | 4% | 101.2 |
| 3年 | 5% | 103.8 |
第一步,1年期零息收益率直接算:
r1 = (100 / 97.5)^(1/1) - 1 = 2.564%
第二步,2年期附息债。每年付息4元,第一笔利息用r1折现:
4 / (1 + 2.564%) + (100 + 4) / (1 + r2)^2 = 101.2
解出 r2 = 3.128%
第三步,3年期同理,用r1和r2折现前两笔利息,解出r3。
我的经验:Bootstrapping最怕数据缺失。如果某个期限没有对应债券,你就得插值。我曾经因为1.5年期数据缺失,硬是用线性插值补了一个,结果曲线在1.5年处出现“折角”,看着就别扭。
注意:Bootstrapping要求债券的现金流日期对齐。如果付息日不一致,你得先做日期调整。别小看这个细节,差一天可能差好几个BP。
4.2 Nelson-Siegel模型
Bootstrapping虽然精确,但有个毛病——它只给你离散的点。你想想看,如果我要一个2.37年期的收益率,怎么办?插值?那插出来的东西靠谱吗?
Nelson-Siegel模型就是来解决这个问题的。它用一个简洁的数学公式,把整条收益率曲线“捏”出来。
公式长这样:
r(t) = β0 + β1 * [1 - exp(-t/τ)] / (t/τ) + β2 * [ [1 - exp(-t/τ)] / (t/τ) - exp(-t/τ) ]
看着复杂?我拆开给你看:
- β0:长期利率水平,决定了曲线右端的高度
- β1:短期利率偏离,决定了曲线左端的斜率
- β2:中期曲率,决定了曲线中间是凸还是凹
- τ:衰减速度,控制曲线从短期到长期的过渡快慢
我个人习惯用Nelson-Siegel做“快速扫描”。比如早上开盘前,拿最近10只活跃券的价格,跑一遍优化,5秒钟就能得到一条平滑的曲线。虽然拟合精度不如Bootstrapping,但胜在快、稳。
避坑指南:我曾经遇到一个案例——用Nelson-Siegel拟合超长期国债(30年+),结果β0一直收敛不到合理值。后来发现,30年以上的债券流动性太差,报价本身就有问题。记住:模型再牛,也救不了垃圾数据。
4.3 Svensson模型
Svensson是Nelson-Siegel的升级版。它多加了两个参数,专门用来处理“双驼峰”形状的收益率曲线。
什么时候会出现双驼峰?我告诉你——经济复苏初期,或者货币政策预期混乱的时候。比如2020年疫情后,短端被央行压着,长端因为通胀预期飙升,中间段又因为复苏不确定性,结果曲线就扭成了“S”形。
Svensson的公式在Nelson-Siegel基础上加了一项:
r(t) = β0 + β1 * [1 - exp(-t/τ1)] / (t/τ1) + β2 * [ [1 - exp(-t/τ1)] / (t/τ1) - exp(-t/τ1) ]
+ β3 * [ [1 - exp(-t/τ2)] / (t/τ2) - exp(-t/τ2) ]
多出来的β3和τ2,就是用来捕捉第二个“驼峰”的。
| 参数 | 含义 | 典型范围 |
|---|---|---|
| β0 | 长期利率 | 2%~5% |
| β1 | 短期偏离 | -3%~3% |
| β2 | 第一曲率 | -5%~5% |
| β3 | 第二曲率 | -3%~3% |
| τ1, τ2 | 衰减速度 | 0.5~10 |
我的建议:Svensson参数多,拟合时容易过拟合。我一般会加一个正则化项,让β3尽量小——除非数据真的强烈支持双驼峰。否则,你拟合出来的曲线可能“扭”得跟麻花似的,看着就不对劲。
4.4 样条插值法
样条插值,说白了就是“分段拟合”。把收益率曲线切成几段,每段用一个低阶多项式去拟合,然后在连接点保证平滑。
常用的有三次样条(Cubic Spline)和B样条(B-Spline)。我个人更偏爱B样条,因为它局部控制能力强——你改一个点的数据,不会影响整条曲线。
样条插值的步骤:
- 选择节点(knots)——通常放在1年、3年、5年、10年、30年
- 在每个区间内拟合三次多项式
- 在节点处保证函数值、一阶导数、二阶导数连续
- 用最小二乘法求解所有系数
# Python伪代码示例
import numpy as np
from scipy.interpolate import CubicSpline
# 已知期限和收益率
maturities = np.array([1, 2, 3, 5, 7, 10, 30])
yields = np.array([2.5, 2.8, 3.0, 3.2, 3.3, 3.5, 3.8])
# 三次样条插值
cs = CubicSpline(maturities, yields, bc_type='natural')
# 预测2.5年收益率
yield_2_5 = cs(2.5)
print(f"2.5年收益率: {yield_2_5:.2f}%")
注意:样条插值在端点处容易“翘尾巴”。尤其是30年以上的部分,如果数据稀疏,样条可能会给出离谱的预测。我曾经见过一个模型,30年收益率3.8%,样条插到40年直接飙到6%——这明显不合理。解决办法是加一个“自然边界条件”,强制二阶导数为零。
4.5 方法对比与选择
说了这么多,到底该用哪个?我列个表给你参考:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Bootstrapping | 精确匹配市场数据 | 离散点、依赖数据完整性 | 定价、套利分析 |
| Nelson-Siegel | 平滑、参数少、计算快 | 无法拟合双驼峰 | 快速扫描、宏观分析 |
| Svensson | 能拟合复杂形状 | 参数多、易过拟合 | 货币政策分析、复杂曲线 |
| 样条插值 | 局部灵活、精度高 | 端点不稳定、节点选择敏感 | 精细定价、风险管理 |
我个人习惯是:做交易决策时用Bootstrapping+样条插值组合,确保精度;做策略研究时用Nelson-Siegel或Svensson,追求平滑和可解释性。
最后说一句:没有完美的模型,只有合适的模型。你想想看,如果市场流动性极差,报价都失真,你用再复杂的模型也是白搭。做固收交易,第一课永远是——尊重数据,敬畏市场。