第1章:关键利率因子——水平、斜率、曲度与Nelson-Siegel模型实战分解
做利率债投资的朋友,一定对收益率曲线不陌生。但说实话,很多人看曲线就是看个长短端利差,这太浪费了。我做了这么多年量化,发现真正能赚钱的,是把曲线拆解成几个核心因子——水平、斜率、曲度。今天我们就从Nelson-Siegel模型入手,把这套东西讲透。
1.1 为什么要把收益率曲线拆成因子?
你想想看,一条收益率曲线,从1个月到30年,几十个点。直接分析太复杂了。而且这些点之间高度相关,你没法单独交易某个期限。
我个人习惯,是把复杂问题降维。把几十个点压缩成3个因子:
- 水平因子:代表整体利率水平。说白了就是所有期限利率一起涨一起跌的那个部分。
- 斜率因子:代表长短端利差。长端减短端,正的就是陡峭,负的就是倒挂。
- 曲度因子:代表中间期限相对于两端的凸起程度。这个很多人忽略,但做蝶式交易的人最看重它。
我在项目中遇到过一件事:有次做国债期货套利,只看水平因子和斜率因子,结果老是亏钱。后来加上曲度因子,模型一下子就稳了。嗯,这里要注意——曲度因子在曲线非平行移动时特别重要。
1.2 Nelson-Siegel模型:拆解因子的标准工具
拆解因子有很多方法,主成分分析(PCA)也行,但Nelson-Siegel模型有个巨大优势——它有经济学含义。每个参数都能解释成市场行为。
模型公式长这样:
y(τ) = β₀ + β₁ × (1 - e^(-τ/λ)) / (τ/λ) + β₂ × [(1 - e^(-τ/λ)) / (τ/λ) - e^(-τ/λ)]
其中:
- τ 是期限(比如1年、10年)
- β₀ 就是水平因子(长期利率水平)
- β₁ 是斜率因子(短端贡献)
- β₂ 是曲度因子(中端贡献)
- λ 是衰减参数,控制因子在哪个期限附近最活跃
说白了,这个模型就是用三个形状函数去拟合整条曲线。每个函数对应一个因子。
关键理解:β₀变化时,整条曲线上下平移;β₁变化时,短端动得多,长端动得少;β₂变化时,中间期限动得最多,两端几乎不动。
1.3 实战:用Python拟合Nelson-Siegel模型
光讲理论没意思,我们直接上代码。这是我常用的拟合方法:
import numpy as np
from scipy.optimize import minimize
def ns_yield(tau, beta0, beta1, beta2, lam):
"""Nelson-Siegel模型计算收益率"""
term1 = (1 - np.exp(-tau/lam)) / (tau/lam)
term2 = term1 - np.exp(-tau/lam)
return beta0 + beta1 * term1 + beta2 * term2
def ns_objective(params, tau, y_obs):
"""目标函数:最小化拟合误差"""
beta0, beta1, beta2, lam = params
y_fit = ns_yield(tau, beta0, beta1, beta2, lam)
return np.sum((y_obs - y_fit) ** 2)
# 示例数据:某日国债收益率
tau = np.array([0.25, 0.5, 1, 2, 3, 5, 7, 10, 20, 30])
y_obs = np.array([1.52, 1.68, 1.95, 2.23, 2.41, 2.65, 2.78, 2.92, 3.15, 3.28])
# 初始参数猜测
init_params = [3.0, -1.5, 0.5, 2.0]
# 优化拟合
result = minimize(ns_objective, init_params, args=(tau, y_obs),
method='L-BFGS-B', bounds=[(0, 10), (-5, 5), (-5, 5), (0.1, 5)])
beta0, beta1, beta2, lam = result.x
print(f"水平因子 β₀ = {beta0:.4f}")
print(f"斜率因子 β₁ = {beta1:.4f}")
print(f"曲度因子 β₂ = {beta2:.4f}")
print(f"衰减参数 λ = {lam:.4f}")
个人经验:λ的初始值很关键。我一般设成2左右,对应中端期限。如果拟合效果不好,可以试试1.5到3之间的值。曾经有一次我λ设成0.5,结果曲度因子完全跑偏了。
1.4 三个因子的实战含义
拟合出因子后,怎么用?我总结了几条:
| 因子 | 经济含义 | 交易信号 |
|---|---|---|
| β₀(水平) | 长期通胀预期+经济增长 | β₀上升→做空长久期债券 |
| β₁(斜率) | 货币政策预期 | β₁下降(曲线变平)→做陡曲线 |
| β₂(曲度) | 市场分歧/流动性偏好 | β₂变大→做蝶式交易(多中间空两端) |
举个例子。2022年美联储加息那会儿,β₁快速下降(曲线倒挂),我当时就做了一波做陡曲线交易。嗯,这个信号其实挺准的——倒挂之后往往会有修复。
1.5 避坑指南:拟合中的常见问题
我曾经踩过一个坑:用最小二乘法拟合时,如果数据期限分布不均匀(比如短端密集、长端稀疏),拟合结果会偏向短端。后来我改用加权最小二乘法,给长端更高权重,效果就好多了。
另外,λ的稳定性也是个问题。不同时间点拟合出来的λ可能差异很大。我建议固定λ(比如设为2),只优化三个β。这样因子序列更稳定,便于做时间序列分析。
注意:Nelson-Siegel模型对极端曲线形态(比如深度倒挂)拟合效果一般。遇到这种情况,可以考虑用Svensson扩展模型(加一个曲度项)。
1.6 本章知识体系
下面这张图,是我自己画的Nelson-Siegel模型核心逻辑。你看一遍就能记住:
这张图把整个流程串起来了:从原始收益率数据出发,经过Nelson-Siegel模型拟合,得到三个因子,然后应用到实战中。右侧的因子载荷图很关键——它告诉你每个因子主要影响哪些期限。
好了,这一章就到这里。记住三个因子:水平、斜率、曲度。下一章我们讲怎么用这些因子构建利率预测模型,到时候会用到时间序列方法。
公众号:蓝海资料掘金营,微信deep3321