程式
使用 QuantLib 使用自定義優惠券進行交換
我想評估一個自定義 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())