金融工程学 quantlib 利率曲线插值

利率曲线核心在于 插值(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())