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

收益率曲线,说白了就是债券市场的「定价基准」。我刚开始做利率衍生品做市那会儿,每天开盘第一件事就是盯着曲线看——它要是歪了,整个组合的估值都得重算。今天咱们就来聊聊,怎么从一堆零散的债券报价,构建出一条能用的收益率曲线。

4.1 Bootstrapping:从零息到全曲线的核心算法

Bootstrapping,中文叫「自举法」。名字挺唬人,其实逻辑很简单:用已知的零息债券价格,一步步推导出未知的即期利率。

举个例子。假设市场上有三只国债:

期限 票面利率 价格(面值100)
1年 0% 98.04
2年 2% 99.50
3年 3% 100.50

第一步,1年期零息债券。价格98.04,面值100,那1年期即期利率就是:

r1 = (100 / 98.04) - 1 = 0.02  → 2%

第二步,2年期附息债券。票面利率2%,每年付息一次。它的现金流是:第1年拿2元,第2年拿102元。价格99.50,所以:

99.50 = 2 / (1 + r1) + 102 / (1 + r2)^2

r1我们已经知道是2%,代入求解:

99.50 = 2 / 1.02 + 102 / (1 + r2)^2
99.50 = 1.9608 + 102 / (1 + r2)^2
(1 + r2)^2 = 102 / (99.50 - 1.9608) = 102 / 97.5392 = 1.0457
r2 = sqrt(1.0457) - 1 = 0.0226 → 2.26%

第三步,3年期债券同理。你看,这就是Bootstrapping——像剥洋葱一样,一层层把即期利率「剥」出来。

核心要点:Bootstrapping要求输入数据必须是「干净」的。如果市场上有流动性不足的债券,或者报价有明显套利空间,你剥出来的利率可能根本没法用。

我的经验:我在项目中遇到过一个问题——某只3年期债券因为大额交易,价格突然跳了0.5个基点。直接用这个价格做Bootstrapping,整条曲线都跟着抖。后来我加了一步:先用中位数或加权平均把异常报价过滤掉,再做自举。嗯,曲线稳多了。

4.2 Nelson-Siegel / Svensson模型:用参数拟合曲线

Bootstrapping有个硬伤——它只能给出离散点上的利率。可实际做市时,我们需要任意期限的利率。怎么办?用参数模型来拟合。

Nelson-Siegel模型长这样:

r(t) = β0 + β1 * (1 - exp(-t/τ)) / (t/τ) + β2 * [(1 - exp(-t/τ)) / (t/τ) - exp(-t/τ)]

四个参数:β0(长期利率水平)、β1(短期偏离)、β2(中期曲率)、τ(衰减速度)。

Svensson是它的升级版,加了两个参数来处理更复杂的曲线形状:

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,能拟合出双驼峰或者更扭曲的曲线。

避坑指南:我曾经用Svensson拟合一条倒挂严重的曲线,结果参数β0跑到了负值。为什么?因为τ1和τ2的初始值没设好,优化算法掉进了局部最优。后来我改用全局优化算法(比如差分进化),才把问题解决。记住:参数初始值很重要,别偷懒。

4.3 插值方法:线性 vs 三次样条

参数模型适合「全局拟合」,但有时候我们只需要在已知点之间「填空」。这时候插值就派上用场了。

线性插值:最简单,也最粗暴。两点之间画直线。

r(t) = r1 + (r2 - r1) * (t - t1) / (t2 - t1)

优点:计算快,不会出现奇怪的震荡。缺点:曲线不光滑,一阶导数不连续。

三次样条插值:每两个点之间用一个三次多项式连接,保证整条曲线二阶连续可导。

Si(t) = ai + bi*(t - ti) + ci*(t - ti)^2 + di*(t - ti)^3

优点:曲线光滑,看起来「专业」。缺点:容易过拟合,尤其在数据稀疏的地方。

方法 光滑性 计算速度 过拟合风险 适用场景
线性插值 短期、数据密集
三次样条 长期、需要光滑

我的建议:做市商报价时,我一般用线性插值算短期利率(1年以内),用三次样条算长期利率。为什么?短期流动性好,报价密集,线性就够了;长期数据稀疏,需要光滑曲线来「脑补」中间值。你想想看,要是用线性插值去连一个10年和30年的点,中间那段利率走势得多难看?

4.4 曲线平滑与正则化:别让曲线「抽风」

不管是Bootstrapping还是参数拟合,都可能遇到一个问题:曲线在某些期限上突然「抽风」——利率跳得离谱。原因可能是数据噪声,也可能是模型本身不稳定。

解决办法:加正则化项。

说白了,就是在优化目标里加一个惩罚项,让曲线不要弯得太厉害。常见的做法是惩罚二阶导数的平方:

minimize: Σ(wi * (ri - r̂i)^2) + λ * ∫(r''(t))^2 dt

前半部分是拟合误差,后半部分是光滑惩罚。λ是调节参数——λ越大,曲线越光滑;λ越小,曲线越贴合数据。

关键点:λ怎么选?我常用的方法是交叉验证。把数据分成训练集和验证集,选一个让验证集误差最小的λ。别问我为什么不用AIC/BIC——那些理论指标在实际交易中往往不如交叉验证靠谱。

我曾经遇到过一个极端案例:某天市场波动特别大,10年期国债收益率在5分钟内跳了10个基点。如果不加正则化,拟合出来的曲线在10年附近会有一个「尖刺」,导致所有基于这条曲线的衍生品估值都出问题。加了正则化之后,曲线平滑了,虽然拟合误差大了点,但至少不会让交易员在风控会上被骂。

知识体系总览

下面这张图,是我自己整理的知识结构。你把它存下来,以后做曲线构建时对照着看,基本不会跑偏。

收益率曲线构建知识体系 收益率曲线构建 Bootstrapping 参数模型 插值方法 零息债券推导 附息债券剥离 数据清洗 Nelson-Siegel Svensson扩展 参数优化 线性插值 三次样条 光滑性对比 曲线平滑与正则化 实线:直接关联 | 虚线:间接影响

这张图把整个知识体系串起来了。你从Bootstrapping拿到离散点,用参数模型或插值方法补全,最后用正则化保证曲线不「抽风」。每一步都有坑,但每一步也都有解法。

最后说一句:曲线构建这件事,理论再漂亮,最终还是要拿到实盘上去检验。我见过太多人在回测里曲线拟合得漂漂亮亮,一上实盘就崩。为什么?因为实盘数据有噪声、有缺失、有异常。所以,别光看书,多动手写代码,多拿真实数据跑一跑。嗯,这才是做市商的生存之道。

蓝海数据掘金营,专注资料整理