利率曲线核心在于 插值(interpolation)。
QuantLib 支持很多插值方式:
| 插值类型 | 类别 | 特点 |
|---|---|---|
| Linear | 线性 | 简单、快速、常用 |
| LogLinear | 对 discount 整体取 log-linear | 常用于折现因子 |
| Cubic | 三次样条 | 平滑 |
| LogCubic | 折现因子 log-cubic | 专业债券估值常用 |
| MonotonicCubic | 保证单调性 | 避免负利率出现 |
🔹常用:PiecewiseLinearZero(线性 zero curve)
curve = ql.PiecewiseLinearZero(
today, helpers, ql.Actual365Fixed()
)
🔹专业常用:PiecewiseLogCubicDiscount(log-cubic DF)
curve = ql.PiecewiseLogCubicDiscount(
today, helpers, ql.Actual365Fixed()
)
🔹比较不同插值的零息利率(示例)
curves = {
"LinearZero": ql.PiecewiseLinearZero(today, helpers, day_count),
"LogCubicDF": ql.PiecewiseLogCubicDiscount(today, helpers, day_count)
}
for name, c in curves.items():
rate1y = c.zeroRate(1.0, day_count, ql.Compounded, ql.Annual).rate()
rate5y = c.zeroRate(5.0, day_count, ql.Compounded, ql.Annual).rate()
print(name, "1Y:", rate1y, "5Y:", rate5y)
- 插值方式影响 债券定价、swap定价、曲线光滑度
-
常用:
- Zero curve → Linear
- Discount curve → Log Linear / Log Cubic
- 插值不同会影响曲线的形状(特别是 5–30 年)
# Linear 插值
linear_curve = ql.ZeroCurve(dates, rates, day_count, ql.Linear())
linear_handle = ql.YieldTermStructureHandle(linear_curve)
# Cubic 插值
cubic_curve = ql.ZeroCurve(dates, rates, day_count, ql.Cubic())
cubic_handle = ql.YieldTermStructureHandle(cubic_curve)
# LogLinear 插值
loglinear_curve = ql.ZeroCurve(dates, rates, day_count, ql.LogLinear())
loglinear_handle = ql.YieldTermStructureHandle(loglinear_curve)
# 对比 1.5 年折现因子
print("Linear:", linear_handle.zeroRate(1.5, ql.Continuous).rate())
print("Cubic:", cubic_handle.zeroRate(1.5, ql.Continuous).rate())
print("LogLinear:", loglinear_handle.zeroRate(1.5, ql.Continuous).rate())