量化庫
Py QuantLib 中的零利率到分段線性遠期利率
給定 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
您對即期匯率應用線性插值的情況下,其已知缺點是在遠期中表現出不連續性