第1章:收益率曲线构建——从数据到曲线的实战之路

做固收交易这些年,我最大的体会就是:收益率曲线是债券市场的“温度计”。你想想看,没有准确的曲线,你拿什么去定价?拿什么去发现套利机会?今天这一章,我就把曲线构建的几种核心方法掰开揉碎了讲给你听。

核心知识点一览:

  • Bootstrapping:从零息债券到即期利率的“剥洋葱”
  • Nelson-Siegel模型:用4个参数拟合整条曲线
  • Svensson模型:NS模型的升级版,多一个弯
  • 插值方法:线性 vs 三次样条,怎么选?
收益率曲线构建方法体系 收益率曲线 Bootstrapping 从附息债→零息利率 Nelson-Siegel 4参数:β₀,β₁,β₂,τ Svensson 6参数:多一个弯 插值方法 线性 / 三次样条 实战中常组合使用:Bootstrapping + 插值 或 NS/Svensson 参数化

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