量化庫

根據市場數據創建美元 LIBOR 遠期曲線的最佳方法

  • October 30, 2020

這是一個非常基本的問題,我確信之前已經回答了這個問題,但我似乎找不到它。

根據市場數據建構美元 Libor 遠期曲線的最佳方法是什麼?

例如,我可以拉下美元 Libor 的以下遠期/預測曲線:

maturity   1M USD Libor   3M USD Libor   6M USD Libor   1Y USD Libor
1M          0.1551          0.2357         0.249          0.3658
3M          0.1622          0.2341         0.2473         0.3809
6M          0.1439          0.2051         0.2478         0.4081
1Y          0.1202          0.1948         0.2758         0.4797
2Y          0.1069          0.2265         0.3754         0.6704
3Y          0.2094          0.3452         0.5159         0.8479
4Y          0.392           0.5293         0.7074         1.0331
5Y          0.5843          0.7193         0.8862         1.2173
7Y          0.9077          1.0438         1.2055         1.5262
10Y         1.2002          1.3265         1.4985         1.763
15Y         1.255           1.3852         1.5278         1.7989
20Y         1.2285          1.3538         1.4866         1.7496
30Y         0.9059          1.0612         1.1455         1.3755

注意:為簡單起見,我只選擇了沿我可以訪問的曲線的費率。實際上,這些都是我每天都可以使用的。

我一直在嘗試導入上述數據(儘管我不確定哪個 Helper 最合適),最終目標是使用生成的曲線來預測浮動利率以評估 IRS。

編輯:為了澄清,最好將上述曲線視為前向生成或投影曲線。其預期用途是預測未來 300 萬美元的 LIBOR 利率。

編輯 2:上述曲線根據期限進行了調整,我使用單獨的曲線進行貼現/估值。

如果這些數字只是 3M 利率,我擔心您沒有足夠的資訊來建構曲線來評估其他工具。

例如,您有一個從 1Y 和 2Y 開始的 3M 利率,但沒有即期或掉期利率,您沒有關於從 1Y3M、1Y6M 和 1Y9M 開始的 3M 期貨的資訊……

我認為您可以做的一件事是建構一條曲線,使用ql.ForwardCurve該類對這些速率進行平面插值(期望連續速率作為輸入)。

import QuantLib as ql
import matplotlib.pyplot as plt

nodes = [
   ('1M', 0.2357),
   ('3M', 0.2341),
   ('6M', 0.2051),
   ('1Y', 0.1948),
   ('2Y', 0.2265),
   ('3Y', 0.3452),
   ('4Y', 0.5293),
   ('5Y', 0.7193),
   ('7Y', 1.0438),
   ('10Y', 1.3265),
   ('15Y', 1.3852),
   ('20Y', 1.3538),
   ('30Y', 1.0612),  
] 

today = ql.Date().todaysDate()
calendar = ql.TARGET()
dates = [calendar.advance(today, ql.Period(tenor)) for tenor, rate in nodes]
rates = [rate for tenor, rate in nodes]
dayCounter = ql.Actual360()
contRates = [ql.InterestRate(rate, dayCounter, ql.Compounded, ql.Quarterly).equivalentRate(ql.Continuous, ql.NoFrequency, 1).rate() for rate in rates]

curve = ql.ForwardCurve(dates, contRates, ql.Actual360())
curve.enableExtrapolation()

rates = [curve.forwardRate(dt, dt+ql.Period('3M'), ql.Actual360(),ql.Compounded, ql.Quarterly).rate() for dt, rate in curve.nodes()]
times = [dayCounter.yearFraction(today, dt) for dt, rate in curve.nodes()]
plt.plot(times, rates, 'o');

在此處輸入圖像描述

請注意,我故意繪製了點而不是線,因為您實際使用這條曲線得到的是所提供的前向的平面插值,即:

allDates = ql.MakeSchedule(dates[0], curve.maxDate(), ql.Period('1D'))
allTimes = [dayCounter.yearFraction(today, dt) for dt in allDates]
fwds = [curve.forwardRate(dt, dt+ql.Period('3M'), ql.Actual360(),ql.Compounded, ql.Quarterly).rate() for dt in allDates]
plt.plot(allTimes, fwds)

在此處輸入圖像描述

其他替代方法是將曲線擬合到這些點或使用更高級的插值方法,儘管您可能在任何這些替代方法上的點太少而無法獲得不錯的結果。

這是使用單調凸插值的前向曲線的樣子。

在此處輸入圖像描述

您有更多的流動性工具可用於建構您的 LIBOR 曲線,尤其是在 5Y 點以下。我們通常做的是將所有低於 5 年的歐洲美元期貨合約(所以現在最後一個是 SEP25 合約)並應用適當的平滑凸函式(記住遠期 libor = 歐洲美元期貨 + 凸性)。您需要這些未來合約(20 份合約)的 ech 的凸度值,通常您可以使用 1Y、2Y、3Y、4Y、5Y 交換點擬合平滑凸度(例如對數多項式)。這樣你就有了一個更細化的曲線,你在前 5 年內的遠期不會受到插值,而是根據市場進行校準。

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