程式

使用 QuantLib 使用自定義優惠券進行交換

  • May 21, 2020

我想評估一個自定義 Libor3M - 在 Python 中修復與 QuantLib 的交換。自定義我的意思是,每個優惠券的自定義開始/結束/付款日期,浮動腿中的固定優惠券(starting_date <evaluation_date,即已經開始的掉期)和每張優惠券的自定義攤銷金額。

我最近問了一個類似的問題(Valuating Custom Amortization Schedule Libor IRS with QuantLib),但提供的程式碼對我的目的不起作用,因為我需要一次建構這些交換一張優惠券以避免載入到 QuantLib 的資訊和我的投資組合時間表。

除非您有一些非常奇特的定制日期,否則我很確定 QuantLib 將能夠滿足您的需求。市場慣例的目的正是讓不同系統的不同實體獲得完全相同的現金流。

話雖如此,QuantLib 非常靈活,因此您實際上可以根據需要定義每張優惠券。

以下是使用單個優惠券定義固定邊的範例:

data = [
   # nominal, rate, startDate, endDate
   (100, 0.015, '15-06-2020', '15-12-2020'),
   (100, 0.015, '15-12-2020', '15-05-2021'),
   (50, 0.025, '15-05-2021', '15-11-2021'),
   (50, 0.012, '15-11-2021', '15-06-2022'),
]

fixedLeg = ql.Leg()
for nominal, rate, startDate, endDate in data:
   startDate = ql.Date(startDate, '%d-%m-%Y')
   endDate = ql.Date(endDate, '%d-%m-%Y')
   fixedCoupon = ql.FixedRateCoupon(
       endDate, nominal, rate, ql.Thirty360(), startDate, endDate)
   fixedLeg.append(fixedCoupon)

calendar = ql.TARGET()
start = ql.Date(15,6,2020)
maturity = calendar.advance(start, ql.Period('2y'))

floatSchedule = ql.MakeSchedule(start, maturity, ql.Period('6M'))
floatLeg = ql.IborLeg([100, 100, 50, 50], floatSchedule, ql.Euribor6M(), ql.Actual360())

swap = ql.Swap(fixedLeg, floatLeg)

for cf in map(ql.as_coupon, swap.leg(0)):
   print(cf.date().ISO(), cf.rate(), cf.amount())

2020-12-15 0.015 0.7500000000000062

2021-05-15 0.015 0.6250000000000089

2021-11-15 0.025 0.6249999999999978

2022-06-15 0.012 0.34999999999999476

或者,您可以創建一個包含自定義日期列表的時間表:

calendar = ql.TARGET()
start = ql.Date(15,6,2020)
maturity = calendar.advance(start, ql.Period('2y'))

fixedSchedule = ql.Schedule([
   ql.Date(15,6,2020),
   ql.Date(15,12,2020),
   ql.Date(15,5,2021),
   ql.Date(15,11,2021),
   ql.Date(15,6,2022)
])
fixedLeg = ql.FixedRateLeg(fixedSchedule, ql.Thirty360(), [100, 100, 50, 50], [0.015, 0.015, 0.025, 0.012])

floatSchedule = ql.MakeSchedule(start, maturity, ql.Period('6M'))
floatLeg = ql.IborLeg([100, 100, 50, 50], floatSchedule, ql.Euribor6M(), ql.Actual360())

swap = ql.Swap(fixedLeg, floatLeg)

for cf in map(ql.as_coupon, swap.leg(0)):
   print(cf.date().ISO(), cf.rate(), cf.amount())

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