Quantlib

使用 QuantLib 獲取季度遠期利率

  • January 29, 2021

我正在嘗試建立一個季度遠期曲線,其中 3 個月的美元 Libor 掉期利率從 1 年到 50 年作為輸入。

從我看過的其他文章中,到目前為止,我已經設法提出了這段程式碼:

terms =['1', '2', '3', '4', '5', '6', '7', '8',
'9', '10', '12', '15', '20', '25', '30', '40', '50']
rate = [0.17, 0.17800000000000002,  0.244,  0.364,  0.499,
0.6409999999999999,  0.773,  0.887,  0.987,  1.074,  1.214, 1.355, 
1.4809999999999999, 1.5390000000000001, 1.567,
1.527, 1.45]

LIBOR= ql.IborIndex('USDLibor', ql.Period('3M'), 2, ql.USDCurrency(), ql.UnitedStates(), ql.ModifiedFollowing,  True, ql.Actual360()) 
helpers = [] # Helpers

helpers.append( ql.DepositRateHelper(0, ql.USDLibor(ql.Period('50Y'))))  # changed from one year 
helpers.append( ql.SwapRateHelper(0.06, ql.UsdLiborSwapIsdaFixAm(ql.Period('3m')))
)


curve = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), helpers, day_count)
curve.enableExtrapolation()

all_days = ql.MakeSchedule(
   curve.referenceDate(),
   curve.maxDate(),
   ql.Period('3M')
)

rates_fwd = [
   curve.forwardRate(d, calendar.advance(d,90,ql.Days), day_count, ql.Simple).rate()
   for d in all_days
]

不確定上面的程式碼是否正確,但它似乎有效。問題是它沒有使用我的輸入條款和費率。任何人都知道如何解決這個問題?

程式碼並不真正正確,因為您只提供兩種工具:利率為 0% 的 50 年存款和利率為 6% 的 3m 掉期。

如果你繪製你的 fwd 利率,你會看到:

在此處輸入圖像描述

你想要做的是為你的每個交換提供一個助手。然後 QuantLib 將為您提供的節點引導貼現因子,並使用所選方法 ( PiecewiseLogCubicDiscount) 對不是曲線節點的值插入對數貼現因子。

這是一個工作範例:

import QuantLib as ql
import matplotlib.pyplot as plt

terms =['1', '2', '3', '4', '5', '6', '7', '8',
'9', '10', '12', '15', '20', '25', '30', '40', '50']
rate = [0.17, 0.17800000000000002,  0.244,  0.364,  0.499,
0.6409999999999999,  0.773,  0.887,  0.987,  1.074,  1.214, 1.355, 
1.4809999999999999, 1.5390000000000001, 1.567,
1.527, 1.45]

index = ql.USDLibor(ql.Period('3M'))
helpers = []
dc = ql.Actual360()

for term, r in zip(terms, rate):
   swapIndex = ql.UsdLiborSwapIsdaFixAm(ql.Period(int(term), ql.Years))
   helpers.append(ql.SwapRateHelper(r/100, swapIndex))
   
curve = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), helpers, dc)
curve.enableExtrapolation()

days = ql.MakeSchedule(curve.referenceDate(), curve.maxDate(), ql.Period('3M'))
fwds = [
   curve.forwardRate(d, ql.UnitedStates().advance(d,90,ql.Days), dc, ql.Simple).rate()
   for d in days
]

plt.plot([dt.to_date() for dt in days], fwds)

在此處輸入圖像描述

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