第1章:收益率曲线构建——从数据到曲线的实战之路
做固收交易这些年,我最大的体会就是:收益率曲线是债券市场的“温度计”。你想想看,没有准确的曲线,你拿什么去定价?拿什么去发现套利机会?今天这一章,我就把曲线构建的几种核心方法掰开揉碎了讲给你听。
核心知识点一览:
- Bootstrapping:从零息债券到即期利率的“剥洋葱”
- Nelson-Siegel模型:用4个参数拟合整条曲线
- Svensson模型:NS模型的升级版,多一个弯
- 插值方法:线性 vs 三次样条,怎么选?
1.1 Bootstrapping:最朴素的曲线构建法
Bootstrapping,说白了就是“剥洋葱”。你手里有一堆附息国债的报价,但你需要的是零息利率——怎么办?一层层剥开。
我记得刚入行时,师傅丢给我一堆国债数据说:“把即期利率算出来。”我当时一脸懵。后来才明白,Bootstrapping的核心逻辑就是:利用短端已知的零息利率,倒推长端。
具体怎么做?我举个例子:
- 1年期国债是零息债,直接得到1年期即期利率 r₁
- 2年期国债是附息债,票息C,价格P₂
- 公式:P₂ = C/(1+r₁) + (100+C)/(1+r₂)²
- 已知P₂、C、r₁,解出r₂
- 以此类推,3年期、5年期……
我的实战经验:Bootstrapping最怕遇到“数据缺失”。比如3年期国债流动性差,报价不连续。我一般会先用线性插值补一个虚拟券,再继续剥。虽然不完美,但比硬算强。
# Python伪代码:Bootstrapping核心逻辑
def bootstrap(coupon_bonds):
spot_rates = {}
for bond in sorted(coupon_bonds, key=lambda x: x.maturity):
if bond.is_zero_coupon:
spot_rates[bond.maturity] = bond.ytm
else:
# 用已知短端利率折现所有票息
pv_coupons = sum(c/(1+spot_rates[t])**t for t in bond.coupon_dates)
# 解出长端利率
spot_rates[bond.maturity] = (bond.face_value / (bond.price - pv_coupons))**(1/bond.maturity) - 1
return spot_rates
避坑指南:我曾经在2018年做国债曲线时,忽略了“应计利息”的处理,结果算出来的曲线在1年期位置有个诡异的凹陷。查了两天才发现是应计利息没扣干净。记住:Bootstrapping用的价格必须是全价减去应计利息后的净价。
1.2 Nelson-Siegel模型:用4个参数讲一个故事
Bootstrapping虽然直观,但有个致命问题:它只能给出离散点。如果你需要任意期限的利率,怎么办?这时候参数化模型就登场了。
Nelson-Siegel模型是我个人最喜欢的曲线模型。它用4个参数就能描述整条曲线的形状:
- β₀(长期利率水平):曲线最右端的渐近值
- β₁(短期偏离):曲线左端相对于长期水平的偏移
- β₂(中期曲率):曲线中间是凸还是凹
- τ(衰减因子):控制曲线弯曲的位置
公式长这样:
r(t) = β₀ + β₁ * [1 - exp(-t/τ)] / (t/τ) + β₂ * [ [1 - exp(-t/τ)] / (t/τ) - exp(-t/τ) ]
你想想看,这4个参数分别对应曲线的水平、斜率、曲率和位置。是不是很优雅?
实战要点:拟合NS模型时,我习惯用最小二乘法。但要注意,τ这个参数是非线性的,需要迭代求解。我一般用scipy.optimize.curve_fit,初始值设τ=2(年),迭代10次以内基本收敛。
1.3 Svensson模型:给曲线多一个弯
NS模型虽然好,但有时候曲线形状比较复杂——比如2008年金融危机时的“双峰”形态。这时候NS模型就有点力不从心了。
Svensson模型在NS基础上加了两个参数:β₃和τ₂。说白了,就是允许曲线有两个弯曲点。
# Svensson模型公式
r(t) = β₀ + β₁ * [1 - exp(-t/τ₁)] / (t/τ₁)
+ β₂ * [ [1 - exp(-t/τ₁)] / (t/τ₁) - exp(-t/τ₁) ]
+ β₃ * [ [1 - exp(-t/τ₂)] / (t/τ₂) - exp(-t/τ₂) ]
多了β₃和τ₂,拟合能力确实强了。但代价是什么?参数多了,过拟合风险也大了。
我的建议:除非你明确看到曲线有两个明显的弯曲(比如短端陡、中段平、长端又陡),否则用NS就够了。Svensson的6个参数在优化时很容易陷入局部最优。我一般只在做10年以上国债曲线时才考虑用Svensson。
1.4 插值方法:线性还是三次样条?
Bootstrapping得到的是离散点,但交易时需要任意期限的利率。这时候插值就派上用场了。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 线性插值 | 简单、不会过冲 | 一阶导数不连续 | 短端(1年以内) |
| 三次样条 | 光滑、导数连续 | 可能过冲(overshoot) | 长端(1年以上) |
我个人习惯:1年以内用线性,1年以上用三次样条。为什么?短端利率波动大,线性插值不会引入虚假的弯曲;长端利率变化平滑,三次样条能更好地捕捉趋势。
我曾经踩过的坑:有一次用三次样条插值5年和7年之间的利率,结果在6年位置插出了一个“驼峰”,比两边都高。后来一查,是因为5年和7年的数据点本身就有异常。三次样条对异常值非常敏感,插值前一定要先做数据清洗。
1.5 实战中的选择策略
说了这么多,到底该用哪种方法?我总结了一个决策树:
- 如果你只有几个关键期限的报价 → Bootstrapping + 线性插值(简单粗暴)
- 如果你需要整条光滑曲线做定价 → NS模型(4参数够用)
- 如果你发现曲线形状特别复杂 → Svensson模型(但小心过拟合)
- 如果你在做高频交易或回测 → 三次样条插值(光滑性好)
最后说一句:没有完美的曲线构建方法。我在不同市场、不同品种上用过不同的组合。比如国债期货的定价,我偏好NS模型;信用债的曲线,我反而用Bootstrapping加三次样条。关键是要理解每种方法的假设和局限,然后根据你的交易需求做选择。
公众号:蓝海资料掘金营,微信deep3321