Cubic Spline Fitting of Yield Curve(收益率曲线的三次样条拟合)详解
1. 概述
Cubic Spline Fitting(三次样条拟合) 是一种用于拟合 收益率曲线(Yield Curve) 的方法。它利用分段三次多项式在数据点之间进行插值或平滑,以构建一个光滑的收益率曲线。
与 Nelson-Siegel 这类参数化模型不同,三次样条拟合是一种非参数方法,可以更灵活地适应复杂的曲线形状。
它的核心思想是:
将收益率曲线分成多个区间,每个区间用三次多项式拟合。
确保段与段之间的连接处光滑(即保证一阶导数、二阶导数连续)。
可以插值或平滑数据,适用于市场收益率曲线的构建。
2. 三次样条(Cubic Spline)的数学定义
(1) 设定问题
假设我们有 个数据点(即收益率曲线上的市场数据):
其中:
表示债券的期限(Maturity)。
表示对应的收益率(Yield)。
(2) 三次样条函数
我们希望在每个区间 上用一个三次多项式 进行拟合:
其中:
是每个区间的待定系数。
(3) 约束条件
为了保证光滑连接,需要满足以下四个条件:
插值条件(Interpolation Condition):
每个样条曲线要经过数据点:一阶导数连续(First Derivative Continuity):
每个区间的导数在连接点处相等:二阶导数连续(Second Derivative Continuity):
每个区间的二阶导数在连接点处相等:边界条件(Boundary Conditions):
自然边界(Natural Spline):
黏性边界(Clamped Spline)(已知起点和终点的一阶导数):
这样,我们可以通过 个方程 + 额外的边界条件,解出所有 的值。
3. 三次样条拟合的计算方法
(1) 组建矩阵方程
定义 ,即每个数据点的二阶导数值。
通过样条条件可以建立一个三对角线矩阵(Tridiagonal Matrix) 来求解 :
解出 后,可以计算 并得到完整的样条函数。
4. Python 实现
Python 提供了 scipy.interpolate.CubicSpline
来实现三次样条拟合:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import CubicSpline # 市场收益率曲线数据(期限:年,收益率:%) maturities = np.array([0.25, 0.5, 1, 2, 5, 10, 20]) yields = np.array([3.0, 2.8, 2.5, 2.3, 2.1, 2.4, 2.7]) # 三次样条拟合 cs = CubicSpline(maturities, yields, bc_type='natural') # 自然边界条件 # 生成平滑曲线 x_new = np.linspace(0.1, 30, 100) y_new = cs(x_new) # 绘制结果 plt.scatter(maturities, yields, color='red', label='Market Data') plt.plot(x_new, y_new, label='Cubic Spline Fit', color='blue') plt.xlabel('Maturity (Years)') plt.ylabel('Yield (%)') plt.title('Cubic Spline Yield Curve') plt.legend() plt.show()
5. Cubic Spline Fitting vs Nelson-Siegel
对比 | 三次样条拟合(Cubic Spline) | Nelson-Siegel |
---|---|---|
方法类型 | 非参数方法 | 参数化方法 |
灵活性 | 很高,可精确拟合 | 受限于模型形式 |
计算复杂度 | 需要解矩阵方程 | 只需优化 4 个参数 |
金融解释 | 仅用于插值/平滑 | 可解释为长期/短期/曲度 |
适用性 | 适用于局部插值 | 适用于收益率曲线建模 |
6. 结论
✅ 三次样条拟合适用于短期国债和零息收益率曲线的插值,但不能解释收益率曲线的经济含义。
✅ 在央行、金融机构中,通常结合 Nelson-Siegel 方法和三次样条进行分析。
✅ 适用于需要高精度曲线的场景(如定价衍生品)。
系统当前共有 440 篇文章