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

基于Quantlib Python的Cap定价:波动率曲线适配引擎问题

QuantLib Python Cap定价:Bachelier引擎创建问题解决

问题1:正确创建ql.BachelierCapFloorEngine的方法

由于你只有各到期日的Cap波动率曲线,需要先将其转换为Cap波动率曲面(满足OptionletStripper1的接口要求),再剥离出单个期权(Optionlet)的波动率结构,最终构造Bachelier引擎。具体代码如下:

# 基于现有波动率数据构造CapFloorTermVolSurface(行权价维度用单值,假设是ATM波动率)
strikes = [capRate]  # 用你的Cap行权价作为行权价维度的唯一值
vol_surface = ql.CapFloorTermVolSurface(
    ref_date,
    calendar,
    ql.ModifiedFollowing,
    exp_dates_vola,
    strikes,
    [rates_vola],  # 每个行权价对应一组到期日波动率
    ql.Actual360()
)

# 构造与Cap一致的IBOR指标
ibor_index = ql.Euribor3M(curve_3M_handle)

# 从Cap波动率曲面剥离Optionlet波动率(正态模型对应Bachelier)
optionlet_stripper = ql.OptionletStripper1(
    vol_surface,
    ibor_index,
    type=ql.Normal
)

# 将剥离结果转换为OptionletVolatilityStructure
optionlet_vol_struct = ql.StrippedOptionAdapter(optionlet_stripper)
vol_handle = ql.OptionletVolatilityStructureHandle(optionlet_vol_struct)

# 最终创建BachelierCapFloorEngine
engine = ql.BachelierCapFloorEngine(curve_ois_handle, vol_handle)

# 给Cap设置引擎并计算NPV
cap.setPricingEngine(engine)
print("Cap NPV:", cap.NPV())

关键说明:

  • 必须将一维的波动率曲线转换为二维曲面:即使只有单一行权价的波动率,也要构造包含到期日+行权价维度的曲面,满足OptionletStripper1的输入要求。
  • 指定ql.Normal类型:对应Bachelier模型的正态波动率假设,与BachelierCapFloorEngine的模型逻辑匹配。

问题2:ql.CapFloorTermVolCurve无法用于后续计算的原因

  1. 波动率统计对象不匹配:
    CapFloorTermVolCurve描述的是整个Cap/Floor产品的组合波动率(即构成Cap的所有期权打包后的整体波动率),而BachelierCapFloorEngine需要的是单个期权(Optionlet)的波动率结构(OptionletVolatilityStructure类型)。两者统计的标的不同,无法直接兼容。

  2. 接口参数类型要求不满足:
    用于从Cap波动率推导单个期权波动率的OptionletStripper1,明确要求输入二维的CapFloorTermVolSurface类型(包含到期日和行权价两个维度),而CapFloorTermVolCurve是一维结构(仅覆盖到期日维度),不符合接口的参数类型约束。

内容的提问来源于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.14 00:39:52