第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模型:收益率曲线因子分解 输入:各期限收益率 1月、3月、1年...30年 Nelson-Siegel拟合 优化 β₀, β₁, β₂, λ 三个关键因子 β₀ 水平因子 β₁ 斜率因子 β₂ 曲度因子 实战应用 利率预测 | 组合构建 | 套利策略 | 风险对冲 因子载荷(各期限对因子的敏感度) β₀(常数1) β₁(短端高→长端低) β₂(中端最高) 短端 中端 长端

这张图把整个流程串起来了:从原始收益率数据出发,经过Nelson-Siegel模型拟合,得到三个因子,然后应用到实战中。右侧的因子载荷图很关键——它告诉你每个因子主要影响哪些期限。

好了,这一章就到这里。记住三个因子:水平、斜率、曲度。下一章我们讲怎么用这些因子构建利率预测模型,到时候会用到时间序列方法。


公众号:蓝海资料掘金营,微信deep3321