You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Quantlib Python定价Cap时缺失Euribor3M Fixing的问题

问题分析与解决办法

核心问题

报错提示缺失2025年2月25日的Euribor3M定盘价,本质原因是:

  • 你的Euribor零息曲线(curve_3M)第一个数据节点是2025年11月25日,需要计算的2025年2月25日远期利率早于这个节点,且曲线未启用向前外推功能,QuantLib无法通过插值/外推得到该日期的利率,因此误判为需要历史定盘价。
  • 代码存在几处语法错误,会导致运行失败或逻辑异常。

具体修复步骤

1. 修正语法错误+启用曲线外推

修复代码中的括号缺失、变量名错误,并添加外推启用逻辑:

ref_date = ql.Date(25,11,2019)
    
calendar = ql.TARGET()
curve_ois = ql.ZeroCurve(dates_ois, rates_ois, ql.Actual360(), calendar, ql.Linear(), ql.Compounded, ql.Annual)
curve_ois_handle = ql.YieldTermStructureHandle(curve_ois)
curve_3M = ql.ZeroCurve(dates_3M, rates_3M, ql.Actual360(), calendar, ql.Linear(), ql.Compounded, ql.Annual)
# 启用曲线向前外推,允许计算节点之前的远期利率
curve_3M.enableExtrapolation()
curve_3M_handle = ql.YieldTermStructureHandle(curve_3M)

startDate = ref_date + 2
# 补全右括号
endDate = calendar.advance(ref_date, ql.Period('72M'))
schedule = ql.Schedule(startDate, endDate, ql.Period(ql.Quarterly), calendar, ql.ModifiedFollowing, ql.ModifiedFollowing, ql.DateGeneration.Forward, False)
nom = 1000000
capRate = 0.03

# 变量名从nominal改为定义好的nom
cap = ql.Cap(ql.IborLeg([nom], schedule, ql.Euribor3M(curve_3M_handle)), [capRate])

# 补全右括号
engine = ql.BachelierCapFloorEngine(curve_ois_handle, ql.QuoteHandle(ql.SimpleQuote(0.3439)))
cap.setPricingEngine(engine)
print(cap.NPV())

2. 验证曲线节点覆盖范围

确认dates_3M列表确实包含2019年11月25日的节点(你描述中提到的“起始于ql.Date(25,11,2019)”),如果实际第一个节点是2025年11月25日,建议补充2019年11月25日到2025年11月25日之间的利率节点,否则外推结果可能不符合实际市场逻辑。

额外说明

  • 对于未来日期的Ibor利率,QuantLib会优先通过收益率曲线计算远期利率,只有当日期早于定价参考日(ref_date)时,才需要提供历史定盘价。
  • 如果你的dates_3M确实从2019年11月25日开始,但中间缺少2022-2025年的月度节点,线性插值可以处理,但补充关键期限节点能提高定价精度。

内容的提问来源于stack exchange,提问作者Maria Reinhardt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:46:15