量化庫

Py QuantLib 中的零利率到分段線性遠期利率

  • March 4, 2020

給定 Py QuantLib 中給定交易日期的零利率期限結構,我如何提取分段線性遠期利率。這用於為 ir 掉期定價。

我的嘗試是創建一個帶有日期、費率和天數約定的 ZeroCurve 對象,將其傳遞給 YieldTermStructureHandle,將其傳遞給 USDLibor 對象,最後將其傳遞給 NonstandardSwap 對象。

這就是我為零利率所做的。

import QuantLib as ql

calendar = ql.UnitedKingdom()    
curve_date = ql.Date(5, 12, 2019)
zcr = [ (calendar.advance(curve_date, 365, ql.Days), 0.02),
       (calendar.advance(curve_date, 730, ql.Days), 0.03),
       (calendar.advance(curve_date, 365, ql.Days), 0.05) ]
dates, rates = zip(*zcr)
forward_term_structure = ql.YieldTermStructureHandle(ql.ZeroCurve(dates, rates, ql.Actual360()))
libor_index = ql.USDLibor(ql.Period(1, ql.Months), forward_term_structure)

這是正確的方法嗎?請注意,zcr 中有更多節點,但為了說明,我製作了三個座標。謝謝你。

您的程式碼中可能存在拼寫錯誤,因為您有 365 天的兩個節點,但解決了這個問題(並且還給了曲線一個更短的時間節點):

calendar = ql.UnitedKingdom()    
curve_date = ql.Date(5, 12, 2019)
dates = [calendar.advance(curve_date, ql.Period(n, ql.Years)) for n in range(0,4)]
rates = [0.01, 0.02, 0.03, 0.05]
forward_term_structure = ql.YieldTermStructureHandle(ql.ZeroCurve(dates, rates, ql.Actual360()))
forward_term_structure.enableExtrapolation()

有幾種方法可以做你想做的事。

1. 直接從 YieldTermStructure 獲取遠期利率

   import matplotlib.pyplot as plt
   fwds = [forward_term_structure.forwardRate(date, date + ql.Period('1M'), ql.Actual360(), ql.Simple).rate() for date in dates]     
   plt.plot(rates, 'o-', label="Spot")
   plt.plot(fwds, 'o-', label="1M Forward")
   plt.legend()

在這裡,您正在提取簡單的 1M 遠期匯率 Actual360:

在此處輸入圖像描述

2. 建立一個浮動利率腿並得到指數的利率:

   ql.Settings.instance().evaluationDate = curve_date
   start = calendar.advance(curve_date, 2, ql.Days)
   end = calendar.advance(start, 3, ql.Years)
   schedule = ql.MakeSchedule(start, end, ql.Period('1M'))
   index = ql.USDLibor(ql.Period('1M'), forward_term_structure)
   leg = ql.IborLeg([100], schedule, index)
   fwds = [cf.rate() for cf in map(ql.as_coupon, leg)]
   plt.plot(rates, 'o-', label="Spot")
   times = [ql.Actual360().yearFraction(curve_date, cf.date()) for cf in leg]
   plt.plot(times, fwds, 'o-', label="1M Forward")
   plt.legend()

這會給你:

在此處輸入圖像描述

請注意,在ql.ZeroCurve您對即期匯率應用線性插值的情況下,其已知缺點是在遠期中表現出不連續性

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