衍生品

Quantlib USDLibor() 方法

  • October 20, 2021

我正在嘗試同時移動折扣和投影曲線,但由於 Ibor 輸入要求而無法通過 VanillaSwap() - 我正在嘗試計算美元掉期的 dv01,這需要基礎和移位(上、下)3mL曲線和SOFR曲線。如何通過 ql.USDLibor() 方法傳遞移動的 3mL 曲線?我收到一個錯誤。

我從日期和折扣因子開始生成 US3mL 和 SOFR 對象。

然後我使用日期、df 列表創建了 DiscountCurve (US3mL, SOFR) 對象。

US3mL = ql.DiscountCurve(curve_US3mL_dates, curve_US3mL_df, ql.Thirty360(), ql.UnitedStates(ql.UnitedStates.GovernmentBond))
SOFR = ql.DiscountCurve(curve_USSOFR_dates, curve_USSOFR_df, ql.Actual360(), ql.UnitedStates(ql.UnitedStates.GovernmentBond))
shift = 0.0001
discount_curve = ql.YieldTermStructureHandle(SOFR)
discount_curve_shiftUp = ql.ZeroSpreadedTermStructure(discount_curve, ql.QuoteHandle(ql.SimpleQuote(shift)))
discount_curve_shiftDown = ql.ZeroSpreadedTermStructure(discount_curve, ql.QuoteHandle(ql.SimpleQuote(-shift)))
libor_curve = ql.YieldTermStructureHandle(US3mL)
libor_curve_shiftUp = ql.ZeroSpreadedTermStructure(libor_curve, ql.QuoteHandle(ql.SimpleQuote(shift)))
libor_curve_shiftDown = ql.ZeroSpreadedTermStructure(libor_curve, ql.QuoteHandle(ql.SimpleQuote(-shift)))
libor3M_index = ql.USDLibor(ql.Period('3M'),libor_curve) 
#libor3M_index_shiftUp = ql.USDLibor(ql.Period('3M'), libor_curve_shiftUp) 
#libor3M_index_shiftDown = ql.USDLibor(ql.Period('3M'), libor_curve_shiftDown)

最後兩行註釋程式碼失敗,但 Ibor 對象必須通過 VanillaSwap() 作為“索引”輸入。

不要更改索引,而是重新連結或修改曲線。

對於第一種方法(重新連結),將索引設置為:

libor_curve = ql.RelinkableYieldTermStructureHandle(US3mL)
libor3M_index = ql.USDLibor(ql.Period('3M'), libor_curve) 

並使用libor3M_index. 當你想上移曲線時:

libor_curve.linkTo(
   ql.ZeroSpreadedTermStructure(ql.YieldTermStructureHandle(US3mL),
                                ql.QuoteHandle(ql.SimpleQuote(shift))))

下次呼叫他們的方法時,索引和間接交換將使用新曲線。完成後打電話

libor_curve.linkTo(US3mL)

將曲線重置為原始水平。

對於第二種方法,設置為:

spread = ql.SimpleQuote(0.0)
libor_curve = ql.ZeroSpreadedTermStructure(ql.YieldTermStructureHandle(US3mL),
                                          ql.QuoteHandle(spread))
libor3M_index = ql.USDLibor(ql.Period('3M'), libor_curve) 

所以擴展曲線等於US3mL(因為擴展為 0)。建立交換,當你想向上或向下移動曲線時執行:

spread.setValue(shift)  # or spread.setValue(-shift)

同樣,曲線將更新,掉期將使用新的水平。要回到第一方,執行

spread.setValue(0.0)

ql.ZeroSpreadedTermStructure返回一個 YieldTermstructure 但對於ql.USDLibor contructor您需要一個ql.YieldTermStructureHandle.

將最後兩行更改為:

libor3M_index_shiftUp = ql.USDLibor(ql.Period('3M'), ql.YieldTermStructureHandle(libor_curve_shiftUp))
libor3M_index_shiftDown = ql.USDLibor(ql.Period('3M'), ql.YieldTermStructureHandle(libor_curve_shiftDown))

引用自:https://quant.stackexchange.com/questions/68433