量化庫
在 QuantLib 中建立浮動利率 IRS 的百分比
剛開始學習 Quantlib for Python。
我試圖弄清楚如何創建浮動腿是浮動指數百分比的利率掉期。例如,浮動邊為 100 萬美元 LIBOR 的 70%。
任何幫助是極大的讚賞。
注意:對於那些好奇的人,LIBOR 掉期百分比是美國市政實體的常見結構。這些實體可以發行免稅債務並調整浮動腿,因此 % = (1 - 邊際稅率)。
有兩種方法可以創建您想要的交換:(1)創建單獨的腿(
ql.FixedRateLeg
和IborLeg
),您可以在其中提供傳動裝置ql.IborLeg
並與它們建立交換(ql.Swap
)或(2)使用ql.NonstandardSwap
類首先,我將定義在範例中使用的通用樣板程式碼:
import QuantLib as ql import pandas as pd yts = ql.YieldTermStructureHandle(ql.FlatForward(2, ql.TARGET(), 0.05, ql.Actual360())) engine = ql.DiscountingSwapEngine(yts) index = ql.USDLibor(ql.Period('6M'), yts) schedule = ql.MakeSchedule(ql.Date(15,6,2021), ql.Date(15,6,2023), ql.Period('6M')) nominal = [10e6]
- 創建單獨的腿
在定義傳動裝置之前,我們可以建立一個簡單的交換並檢查它的浮動腿:
fixedLeg = ql.FixedRateLeg(schedule, index.dayCounter(), nominal, [0.05]) floatingLeg = ql.IborLeg(nominal, schedule, index) swap = ql.Swap(fixedLeg, floatingLeg) swap.setPricingEngine(engine) print(f"Floating leg NPV: {swap.legNPV(1):,.2f}\n") pd.DataFrame([{ 'fixingDate': cf.fixingDate().ISO(), 'accrualStart': cf.accrualStartDate().ISO(), 'accrualEnd': cf.accrualEndDate().ISO(), "paymentDate": cf.date().ISO(), 'gearing': cf.gearing(), 'forward': cf.indexFixing(), 'rate': cf.rate(), "amount": cf.amount() } for cf in map(ql.as_floating_rate_coupon, swap.leg(1))])
請注意,預設情況下,傳動比為 1,因此腿率與固定/前向相同。
接下來,我們使用
ql.IborLeg
建構子的“gearings”參數:floatingLeg = ql.IborLeg(nominal, schedule, index, gearings=[0.7]) swap = ql.Swap(fixedLeg, floatingLeg) swap.setPricingEngine(engine) print(f"Floating leg NPV: {swap.legNPV(1):,.2f}\n") pd.DataFrame([{ 'fixingDate': cf.fixingDate().ISO(), 'accrualStart': cf.accrualStartDate().ISO(), 'accrualEnd': cf.accrualEndDate().ISO(), "paymentDate": cf.date().ISO(), 'gearing': cf.gearing(), 'forward': cf.indexFixing(), 'rate': cf.rate(), "amount": cf.amount() } for cf in map(ql.as_floating_rate_coupon, swap.leg(1))])
請注意,我們已將腿率調整為固定/前向乘以傳動裝置。
另一種更草率的方法是將名義值乘以 iborLeg 上的傳動比,而不是使用傳動比參數。
- 非標準互換
可以對類進行完全相同的操作
ql.NonstandardSwap
,儘管您必須對建構子更加小心,因為它期望具有與相應付款時間表相同大小的名義、利率、價差、傳動比等數組。swapType = ql.VanillaSwap.Payer numDates = (len(schedule)-1) gearing = [0.7] * numDates spread = [0.0] * numDates fixedRateArray = [0.05] * numDates nominalArray = nominal * numDates nsSwap = ql.NonstandardSwap( swapType, nominalArray, nominalArray, schedule, fixedRateArray, index.dayCounter(), schedule, index, gearing, spread, index.dayCounter()) nsSwap.setPricingEngine(engine) print(f"Floating leg NPV: {nsSwap.legNPV(1):,.2f}\n") pd.DataFrame([{ 'fixingDate': cf.fixingDate().ISO(), 'accrualStart': cf.accrualStartDate().ISO(), 'accrualEnd': cf.accrualEndDate().ISO(), "paymentDate": cf.date().ISO(), 'gearing': cf.gearing(), 'forward': cf.indexFixing(), 'rate': cf.rate(), "amount": cf.amount() } for cf in map(ql.as_floating_rate_coupon, swap.leg(1))])