基于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无法用于后续计算的原因
波动率统计对象不匹配:
CapFloorTermVolCurve描述的是整个Cap/Floor产品的组合波动率(即构成Cap的所有期权打包后的整体波动率),而BachelierCapFloorEngine需要的是单个期权(Optionlet)的波动率结构(OptionletVolatilityStructure类型)。两者统计的标的不同,无法直接兼容。接口参数类型要求不满足:
用于从Cap波动率推导单个期权波动率的OptionletStripper1,明确要求输入二维的CapFloorTermVolSurface类型(包含到期日和行权价两个维度),而CapFloorTermVolCurve是一维结构(仅覆盖到期日维度),不符合接口的参数类型约束。
内容的提问来源于stack exchange,提问作者Maria Reinhardt
相关产品推荐
相关产品推荐

