QuantLib v1.26中两类基差互换RateHelper的Bootstrap使用咨询
QuantLib v1.26 基差互换RateHelper曲线构建实操指引
一、先搞懂这俩Helper的定位
IborIborBasisSwapRateHelper:专门处理Libor-Libor基差互换,用来同步校准两条不同期限/币种的Ibor曲线OvernightIborBasisSwapRateHelper:处理OIS-Ibor基差互换,核心价值是用它同时搞定OIS贴现曲线(自带投影曲线)和IRS曲线(依赖OIS曲线做贴现)
二、用OvernightIborBasisSwapRateHelper 构建双曲线实操(Python代码)
1. 先搭基础环境
所有曲线构建的前置操作,先把日期、日历、计息规则这些定好:
import QuantLib as ql # 设置估值日 today = ql.Date(15, ql.July, 2024) ql.Settings.instance().evaluationDate = today # 用TARGET日历(欧元区常用,其他币种换对应日历) calendar = ql.TARGET() day_counter = ql.Actual360()
2. 定义Overnight指数(OIS曲线核心)
OIS曲线依赖隔夜指数,比如欧元区的EONIA、美元的SOFR,这里以EONIA为例:
eonia = ql.Eonia() # 先搞个临时OIS曲线用DepositHelper搭,后面会用基差互换校准 ois_deposits = [ ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.03)), ql.Period(1, ql.Days), 2, calendar, ql.Following, False, day_counter) ] initial_ois_curve = ql.PiecewiseFlatForward(0, calendar, ois_deposits, day_counter) ois_curve_handle = ql.YieldTermStructureHandle(initial_ois_curve) # 给EONIA绑定临时曲线,顺便加个历史定盘价(可选,没有也能跑) eonia.addFixing(ql.Date(12, ql.July, 2024), 0.03) eonia.setTermStructure(ois_curve_handle)
3. 定义Ibor指数(IRS曲线核心)
比如欧元区的6M Libor,这里先绑定临时OIS曲线做贴现:
eur_6m_libor = ql.Euribor6M(ois_curve_handle)
4. 准备OIS-Ibor基差互换报价
假设你有1Y、2Y、5Y的基差报价(比如15bps=0.0015),把这些转成RateHelper:
basis_quotes = [ (ql.Period(1, ql.Years), 0.0015), (ql.Period(2, ql.Years), 0.0018), (ql.Period(5, ql.Years), 0.0022) ] basis_helpers = [] for tenor, spread in basis_quotes: helper = ql.OvernightIborBasisSwapRateHelper( ql.QuoteHandle(ql.SimpleQuote(spread)), tenor, calendar, ql.Following, day_counter, eonia, eur_6m_libor, ois_curve_handle # 传入待校准的OIS曲线handle ) basis_helpers.append(helper)
5. 同步校准OIS曲线和IRS曲线
这一步是核心,OIS曲线要把Deposit和基差Helper放一起校准,IRS曲线用已校准的OIS做贴现:
# 合并OIS的Deposit和基差Helper,构建最终OIS曲线(自动校准基差互换) final_ois_helpers = ois_deposits + basis_helpers final_ois_curve = ql.PiecewiseLogCubicDiscount(0, calendar, final_ois_helpers, day_counter) ois_curve_handle.linkTo(final_ois_curve) # 现在构建IRS曲线:用Libor存款、期货、互换,贴现用刚校准好的OIS曲线 irs_deposits = [ ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.032)), ql.Period(6, ql.Months), 2, calendar, ql.Following, False, day_counter) ] irs_futures = [ ql.FuturesRateHelper(ql.QuoteHandle(ql.SimpleQuote(96.7)), ql.Date(15, ql.January, 2025), calendar, day_counter, ql.Following, eur_6m_libor, ois_curve_handle) ] irs_swaps = [ ql.SwapRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.035)), ql.Period(10, ql.Years), calendar, ql.Annual, ql.Unadjusted, day_counter, eur_6m_libor, ql.QuoteHandle(), ql.Period(0, ql.Days), ois_curve_handle) ] irs_helpers = irs_deposits + irs_futures + irs_swaps irs_curve = ql.PiecewiseLogCubicDiscount(0, calendar, irs_helpers, day_counter) irs_curve_handle = ql.YieldTermStructureHandle(irs_curve) # 最后别忘了更新Libor指数的投影曲线为刚校准的IRS曲线 eur_6m_libor.setTermStructure(irs_curve_handle)
三、必踩坑的注意事项
- OIS曲线的双重身份:Overnight指数的termStructure既是贴现曲线,也是自身的投影曲线(因为OIS是隔夜利率,不需要额外投影)
- 临时曲线的作用:初始OIS曲线只是个“占位符”,加入基差Helper后,QuantLib会自动迭代校准到符合基差互换报价的曲线
- Libor指数的绑定顺序:IRS曲线建好后必须更新Libor的termStructure,不然后续定价会用错投影曲线
- 报价单位要统一:基差是年化差值,比如15bps要传0.0015,和其他RateHelper的报价单位保持一致
四、IborIborBasisSwapRateHelper 快速上手
如果是Libor-Libor基差互换(比如3M vs 6M Libor),逻辑类似:
- 定义两个Ibor指数,其中一个先绑定初始贴现曲线
- 用
IborIborBasisSwapRateHelper传入基差报价、期限、两个指数、贴现曲线handle - 将Helper加入其中一条曲线的校准列表,同步得到两条匹配的曲线
内容的提问来源于stack exchange,提问作者raghav
相关产品推荐
相关产品推荐

