| 阶段 | 代表方法 | 关键特征 | 局限 |
|---|---|---|---|
| 1980s | 线性/多项式插值(interpolation) | 简单、快 | 不平滑、端点不稳 |
| 1990s | 样条(McCulloch、Vasicek–Fong) | 平滑、局部控制 | 可能违背无套利 |
| 2000s | Nelson–Siegel / Svensson | 少参数、经济含义 | 拟合端点/局部难 |
| 2010s | Hagan–West 单调凸性 | 单调/凸性友好 | 实现细节敏感 |
| 2010s | Smith–Wilson | 端点锚定、EIF合规 | 参数与UFR设定 |
| 2020s | 机器学习/贝叶斯 | 非线性、自适应 | 可解释性/约束难 |
演进主线:在“金融合理性”与“数值稳定性”之间不断迭代。
参考路径(示例):CFETS/SHCH 实时报价 → Wind/Bloomberg 历史 → Python 自举与回测。
定义与公式
含义
今天支付多少现值,才能在到期
关系
若瞬时远期在
定义与公式
含义
把整段
备注
若使用年复利/半年复利等计息方式,公式会相应变化;上式特指“连续复利零息”。
平段远期,piecewise-constant instantaneous forwards。即在每个相邻结点区间
若在整个
其中
更一般地,对分段区间
区间均值远期(或离散近似)可由相邻贴现因子反推:
公式(名义本金 1,固定端票息
平价互换(par swap)时,固定端现值 = 浮动端现值。由于浮动端现值等于
实际交易会涉及:
若假设瞬时远期
在负利率环境,
计算隐含区间远期
应避免不合理的剧烈“锯齿”(相邻区间大幅正负跳变),这常源于过拟合或插值器不当。
实务工作中常用以下方法获得平滑、形状可解释的远期曲线:
用得到的
检查短端到长端的连续性、端点外推的合理性(例如 UFR 设定)。
| 期限区间 | 典型使用工具 | 理由 |
|---|---|---|
| 短端(< 6 M) | 存款、OIS、回购 | 最贴近央行政策利率、短期流动性决定价,报价丰富 |
| 中短端(6 M – 1 Y – 2 Y) | Interest Rate Swap(IRS)的固定腿 | Swap 市场流动性最好、覆盖丰富且反映无风险利率水平 |
| 国债(Gov Bonds) | 可作为替代校验,但不适合直接引自举 | 含信用利差、税务因素、票息结构复杂 |
| 长端(> 2 Y) | 长期 IRS、Swap Futures | 持续延伸期限到 30Y+,定价流动性高 |
步骤:
插值:推荐分段指数(对
按 Shibor 互换曲线构建基础贴现因子并绘制即期曲线。
import numpy as np
import pandas as pd
# 存款与IRS报价(简化中国市场实例)
deposits = pd.DataFrame({
"Tenor": [7/365, 1/12, 0.25],
"Rate": [0.018, 0.019, 0.021]
})
swaps = pd.DataFrame({
"Tenor": [1, 2, 3],
"SwapRate": [0.024, 0.0265, 0.029],
"Freq": [4, 4, 4] # 季付
})
deposits["DF"] = 1 / (1 + deposits["Rate"] * deposits["Tenor"])
P = dict(zip(deposits["Tenor"], deposits["DF"]))
def bootstrap_swaps(P, swaps):
alpha = 1 / 4
for _, row in swaps.iterrows():
K, Tn = row["SwapRate"], row["Tenor"]
N = int(Tn / alpha)
known = sum(alpha * P[t] for t in P if t < Tn)
P[Tn] = (1 - K * known) / (1 + K * alpha)
return P
P = bootstrap_swaps(P, swaps)
T = np.array(sorted(P.keys()))
R = -np.log(list(P.values())) / T
pd.DataFrame({"T":T, "Zero":R})
import matplotlib.pyplot as plt
plt.plot(T, R*100, 'o-', label='Shibor单曲线')
plt.xlabel("期限(年)"); plt.ylabel("即期利率(%)")
plt.title("单曲线自举结果"); plt.legend()
plt.show()
在 2008 年金融危机之前,市场普遍假设:
存款利率、远期利率(如 LIBOR )、贴现因子 → 来自同一条收益率曲线。
可用同一条曲线:
数学上:
贴现因子
“单曲线”假设隐含:
2008 年全球危机揭示:
于是形成了新的理念:
不同利率基准
不同曲线。
架构概念
| 曲线类型 | 功能 | 典型基准 | 主要报价来源 |
|---|---|---|---|
| 贴现曲线 (Discount Curve) | 反映无风险资金折现,用于现值测算 | OIS / 回购(如 DR007, FR007) | OIS 利率、回购加权报价 |
| 预测曲线 (Projection Curve) | 定义未来浮息现金流预期 | Shibor / LIBOR / 存单曲线 | IRS、FRAs、CD 报价 |
| 基差曲线 (Basis Curve) | 协调不同期限或指数间利差 | OIS–IBOR Spread | Basis Swap 报价或估算 |
| 长期外推曲线 (Long‑term) | 延伸到 30Y+ 的定价与风险管理 | Treasury / IRS 长端 | 长期 IRS、Futures 报价 |
| 步骤 | 内容 | 用到的工具 |
|---|---|---|
| Step 1 | 构建 OIS 贴现曲线 (核心主线) | OIS swap、央行数据 |
| Step 2 | 构建 3M、6M 等浮息基准的远期曲线 | FRA 、Basis Swap 、IRS |
| Step 3 | 调整各远期曲线相对 OIS 贴现的一致性 | 多曲线自举法(multi‑bootstrapping) |
| Step 4 | 验证市场无套利与所有 swap 报价复现 | 校准误差 ≈ 0 |
构建 OIS 贴现曲线与 Shibor 预测曲线并对比。
ois_quotes = pd.DataFrame({
"Tenor": [0.5, 1, 2],
"Rate": [0.019, 0.020, 0.021]
})
P_ois = {T: 1/(1+R*T) for T,R in zip(ois_quotes["Tenor"], ois_quotes["Rate"])}
以 OIS 贴现、用 IRS 平价求预测浮息
alpha = 0.25
P_d = P_ois.copy()
for T,K in zip(swaps["Tenor"], swaps["SwapRate"]):
N = int(T/alpha)
known = sum(alpha*P_d.get(round(i*alpha,2), 1) for i in range(1,N))
P_d[T] = (1 - K*known)/(1+K*alpha)
# 前向利率近似
Tn = np.array(sorted(P_d.keys()))
Ld = (1/np.array(list(P_d.values())) - 1)/Tn
plt.plot(Tn, np.array(list(ois_quotes["Rate"]))*100, 'o--', label='OIS贴现')
plt.plot(Tn, Ld*100, 's-', label='Shibor预测(近似)')
plt.title("多曲线体系比较"); plt.xlabel("期限(年)"); plt.ylabel("利率(%)")
plt.legend(); plt.show()
核心目的
常用方法总览
| 方法 | 插值对象 | 思想 | 优点 | 典型用途 |
|---|---|---|---|---|
| ln P 线性 | 对 |
假设区间远期率恒定 | 简单、无套利 | 初级曲线、自举阶段 |
| Cubic Spline | 对 |
保证一阶二阶导连续 | 光滑自然、形态柔和 | 国债曲线、图形展示 |
| Hagan–West | 对远期率做单调保持插值 | 平滑且防负远期 | 无套利、业界标准 | ISDA/监管曲线 |
推荐实践
思想:
在相邻柱点间保持瞬时远期率
特点:
适用:
思想:
每两个柱点间用三次多项式拟合,保证
优点:
缺点:
改进:
提出者:
Patrick Hagan & Graeme West (2006) - 《Interpolation Methods for Yield Curve Construction》
核心思想:
一般形式:
特点与应用:
| 优点 | 说明 | 优点 | 说明 |
|---|---|---|---|
| 保持贴现单调、远期正值 | 局部调整影响有限 | ||
| 一阶导连续,曲线自然 | ISDA、EIOPA 等监管标准曲线 |
对比总结
| 方法 | 平滑度 | 无套利性 | 实现复杂度 | 适用范围 | 备注 |
|---|---|---|---|---|---|
| ln P 线性 | ★ | ★ | 短端、自举阶段 | 默认稳健方案 | |
| Cubic Spline | ★★★ | ★★★ | 中段展示性曲线 | 可能负远期 | |
| Hagan–West | ★★☆ | ★★☆ | 中长端平滑曲线 | 监管推荐标准 |
实务建议
衔接
T = np.array([0.25, 0.5, 1, 2, 3, 5])
R = np.array([0.021, 0.022, 0.024, 0.0265, 0.029, 0.025])
from scipy.interpolate import interp1d, CubicSpline
# ln P 线性
lnP = -R*T
f_lnP = interp1d(T, lnP, kind='linear', fill_value='extrapolate')
# Cubic Spline
cs = CubicSpline(T, R, bc_type='natural')
# Hagan–West 风格平滑 (近似实现)
def hagan_west(t, T, R):
from numpy import exp
return np.interp(t, T, R)
t_grid = np.linspace(0.1,5,100)
plt.plot(T, R*100, 'o', label='样本点')
plt.plot(t_grid, -f_lnP(t_grid)/t_grid*100, '--', label='lnP线性')
plt.plot(t_grid, cs(t_grid)*100, '-', label='Cubic Spline')
plt.plot(t_grid, hagan_west(t_grid, T, R)*100, ':', label='Hagan–West近似')
plt.title("无套利平滑插值比较")
plt.legend(); plt.show()
核心目的
常用模型概览
| 模型 | 核心参数 | 曲线特征 | 收敛行为 | 典型用途 |
|---|---|---|---|---|
| Nelson–Siegel (NS) | 单峰形曲线 | 向长期 |
国债或IRS短中端 | |
| Nelson–Siegel–Svensson (NSS) | 双峰/更灵活 | 向长期 |
市场/策略拟合 | |
| Smith–Wilson (SW) | 正贴现、UFR 收敛 | 远期 → UFR | Solvency II 监管外推 |
建模步骤
|
|
构想: 以三个经济含义明确的因子描述曲线。
| Level(长期利率) | Slope(短端斜率) | Curvature(中段曲率) | 时间衰减常数 |
|---|---|---|---|
公式:
性质:
优点: 参数少、形状清晰、易解释。
缺点: 长端单一收敛,灵活性有限。
扩展思想:
在 NS 基础上增加第二组曲率控制项 (
公式:
特点:
限制:
监管标准来源: EIOPA / Solvency II 框架 — 要求曲线 → UFR (终极远期利率),且贴现单调。
贴现因子形式:
其中
参数说明:
优势: 保证无套利( P 单调 );长期收敛 → UFR;符合监管要求。
| 模型 | 参数量 | 无套利 | 平滑性 | 收敛控制 | 应用场景 |
|---|---|---|---|---|---|
| NS | 4 | ★★ | 向 β₀ 收敛 | 一般市场拟合 | |
| NSS | 6 | ★★★ | 向 β₀ 收敛 | 高精度拟合、策略分析 | |
| Smith–Wilson | N + 2 | ★★ | 向 UFR 收敛 | 监管外推、保险贴现 |
实务建议
衔接
from scipy.optimize import curve_fit
def NSS(t,b0,b1,b2,b3,tau1,tau2):
term1 = (1 - np.exp(-t/tau1))/(t/tau1)
term2 = term1 - np.exp(-t/tau1)
term3 = (1 - np.exp(-t/tau2))/(t/tau2) - np.exp(-t/tau2)
return b0 + b1*term1 + b2*term2 + b3*term3
popt,_ = curve_fit(NSS, T, R, p0=[0.02,-0.01,0.01,0.005,1.0,3.0])
规定长期 UEP = 2 %。
def smith_wilson(t, UEP=0.02, alpha=0.1):
return UEP + (R[-1]-UEP)*np.exp(-alpha*(t-T[-1]))
t_grid = np.linspace(0.1,30,300)
plt.plot(T, R*100,'o',label='市场点')
plt.plot(t_grid, NSS(t_grid,*popt)*100,'--',label='NSS拟合')
plt.plot(t_grid, smith_wilson(t_grid)*100,':',label='Smith–Wilson外推')
plt.xlim(0,30); plt.xlabel("期限(年)"); plt.ylabel("利率%")
plt.title("参数化模型与外推比较"); plt.legend(); plt.show()
def check_arbitrage(P):
T = np.array(sorted(P.keys()))
DF = np.array([P[t] for t in T])
fwd = np.diff(-np.log(DF))/np.diff(T)
if np.any(fwd<0): print("
发现负远期率! 需修正")
if np.any(np.diff(DF)>0): print("
DF 非单调! 检查插值")
check_arbitrage(P)
import json, datetime
version = {"date":str(datetime.date.today()),"DF":P}
with open(f"curve_{version['date']}.json","w") as f: json.dump(version,f,indent=2)
核心目的
主要指标
| 指标 | 定义 / 意义 | 常见单位 | 应用场景 |
|---|---|---|---|
| 久期 (Duration) | 价格对整个曲线平移的敏感度 | 年 | 一般利率风险衡量 |
| DV01 | 利率变化 1 bp 引起的价格变动 | 货币 | 交易层风险管理 |
| Key Rate Duration (KRD) | 曲线特定关键期限单独平移时的敏感度 | 年 | 非平移风险拆解 |
数学关系
|
|
|
|
常见曲线情景
| 情景 | 设定 | 典型影响 |
|---|---|---|
| 平移 (Parallel Shift) | 全期限 ±x bp | 久期风险 |
| 陡峭化 (Steepening) | 长端上升、短端下降 | 长久期资产承压 |
| 扭曲 (Twist) | 中段变化最大 | 曲线非线性风险 |
| 波动压缩 | 波动率降低、收益率收敛 | 减少机会成本 |
|
|
曲线敏感度治理
可视化输出
典型实践
一张 3Y 固定利率债券,年付票息 2.9 %。
def bond_price(y, c=0.029, T=3, freq=1):
times = np.arange(1/freq, T+1/freq, 1/freq)
cf = np.repeat(c/freq, len(times)); cf[-1] += 1
disc = np.exp(-y*times)
return np.sum(cf*disc)
y0 = R[T==3][0]
dy = 0.0001
P0 = bond_price(y0)
P1 = bond_price(y0+dy)
DV01 = (P0-P1)/dy
print(f"DV01 = {DV01:,.2f} per 1 bp")
key_rates = [1,3,5]
shifts = {k:0.0001 for k in key_rates}
def key_rate_shift(R,shift,k):
R2 = R.copy()
if k in key_rates:
i = np.where(T==k)[0][0]
R2[i] += shift
return R2
for k in key_rates:
R_shift = key_rate_shift(R,0.0001,k)
y3 = R_shift[T==3][0]
print(f"KeyRate({k}Y) = {(bond_price(y0)-bond_price(y3))/0.0001:,.2f}")
资深量化与固定收益讲师|面向金融工程本科高年级 Python开源栈|多曲线|无套利|可复现 - 理论与应用双主线:从数据→约束→模型→校准→验证→应用 - 可授课、可演练、可复现的完整教学资产(含代码与题库)
**可视化建议:** 一个“收益率曲线 vs 经济周期”示意图。
要点:没有可用曲线,就没有可比价、可控风险与可执行策略。
(优先)
(常用)
(补充)
提示:实时OTC报价多属会员数据,教学/研究可用数据商或延迟数据替代。
- 常见同义 log-linear on discount factors $\Longleftrightarrow$ 区间内瞬时远期为常数(即“平段远期”)。
- 上式是教学用的标准化表达,用于阐明定价等式与直观机制。
AFNS /
--- ### AFNS(Arbitrage-Free NSS) - 将NSS写为无套利可生成的因子过程(状态空间): - 状态:$x_t = A x_{t-1} + w_t$ - 观测:$y_t = H(\text{tenor};\lambda) x_t + e_t$ - 卡尔曼滤波估计因子路径与参数(A,Q,R,可能含$\lambda$) - 区分度量:风险中性(定价) vs 真实世界(预测/情景)
🧩 **衔接** → 与 Part IV 参数化曲线 输出对接, 支持 DV01 / Key Rate 自动计算与风险聚合。