量化庫

在 QuantLib 中建立浮動利率 IRS 的百分比

  • March 9, 2021

剛開始學習 Quantlib for Python。

我試圖弄清楚如何創建浮動腿是浮動指數百分比的利率掉期。例如,浮動邊為 100 萬美元 LIBOR 的 70%。

任何幫助是極大的讚賞。

注意:對於那些好奇的人,LIBOR 掉期百分比是美國市政實體的常見結構。這些實體可以發行免稅債務並調整浮動腿,因此 % = (1 - 邊際稅率)。

有兩種方法可以創建您想要的交換:(1)創建單獨的腿(ql.FixedRateLegIborLeg),您可以在其中提供傳動裝置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]
  1. 創建單獨的腿

在定義傳動裝置之前,我們可以建立一個簡單的交換並檢查它的浮動腿:

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 上的傳動比,而不是使用傳動比參數。

  1. 非標準互換

可以對類進行完全相同的操作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))])

在此處輸入圖像描述

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