利率

Quantlib-Python:使用零利率獲得最初的自舉曲線

  • March 26, 2019

假設我正在嘗試使用 Python 中的三種 Quantlib 方法之一使用存款、期貨和掉期來建構曲線,如下所示:

crv = ql.PiecewiseLogCubicDiscount(2, ql.TARGET(), deposits + futures + swaps, ql.Actual365Fixed())

或者

crv = ql.PiecewiseLinearZero(2, ql.TARGET(), deposits + futures + swaps, ql.Actual365Fixed())

或者

crv = ql.PiecewiseFlatForward(2, ql.TARGET(), deposits + futures + swaps, ql.Actual365Fixed())

然後我得到一組關鍵期限的零利率,如下所示:

spotDate = crv.referenceDate()
dates = [ql.TARGET().advance(spotDate, t, ql.Days) for t in keytenors ]
rates = [ crv.zeroRate(t, ql.Continuous).rate() for t in keytenors ]

如果我在上述三種情況下通過這些零利率來獲取原始的 crv 對象,我該怎麼做呢?我試過:

zero_curve = ql.ZeroCurve(dates, rates,  ql.Actual365Fixed())

但我得到的曲線與我引導的曲線不同。一般來說,我獲得的零曲線不太平滑,並且似乎以某種方式線性插值。我怎樣才能獲得 PiecewiseLogCubicDiscount、PiecewiseLinearZero 和 PiecewiseFlatForward?

要檢索原始曲線,您需要使用與原始曲線相同的關鍵音階和相同的插值。例如,當您將原始曲線創建為:

crv = ql.PiecewiseLinearZero(2, ql.TARGET(), deposits + futures + swaps, ql.Actual365Fixed())

該曲線在節點之間線性內插零利率,這些節點由通過的存款、期貨和掉期的到期日給出。您可以通過呼叫 檢索一組基礎日期和相應的匯率crv.nodes(),這將返回一系列 (date, rate) 對;例如,如果我在此範例中定義的曲線上呼叫它,我會得到:

((Date(8,11,2001), 0.038716178576382605),
(Date(15,11,2001), 0.038716178576382605),
(Date(10,12,2001), 0.037654445569665344),
(Date(8,2,2002), 0.03663450512870074),
(Date(8,5,2002), 0.03704480712236303),
(Date(8,8,2002), 0.037185800177110054),
(Date(8,11,2002), 0.03725571728097072),
(Date(10,11,2003), 0.03633800161641973),
(Date(8,11,2004), 0.039086101826569714),
(Date(8,11,2006), 0.04547303923680055),
(Date(8,11,2011), 0.051542294488560084),
(Date(8,11,2016), 0.055797299887186284))

(範例中使用的評估日期是 2001 年 11 月 6 日)。

由於曲線是一個PiecewiseLinearZero實例,所以上面返回的利率是零利率;如果你用它們來創建一個實例ZeroCurve(它也線性插值)……

dates, rates = zip(*crv.nodes())
crv2 = ql.ZeroCurve(dates, rates, ql.Actual365Fixed())

…您將獲得與原始曲線相同的曲線:

spot = crv.referenceDate()
sample_dates = [ spot + ql.Period(i, ql.Weeks) for i in range(15*52) ]
z1 = [ crv.zeroRate(d, ql.Actual365Fixed(), ql.Continuous).rate() for d in sample_dates ]
z2 = [ crv2.zeroRate(d, ql.Actual365Fixed(), ql.Continuous).rate() for d in sample_dates ]

fig = plt.figure(figsize=(12,6))
ax = fig.add_subplot(1,1,1)
ax.plot_date([d.to_date() for d in sample_dates], z1, '.')
ax.plot_date([d.to_date() for d in sample_dates], z2, '-')

相同的曲線

問題是,如果你在不同的節點對零利率進行採樣,你會在曲線上得到點;但是在它們之間進行插值,你會得到不同的值。

sample_nodes = [ spot + ql.Period(3*i, ql.Years) for i in range(6) ]
sample_rates = [ crv.zeroRate(d, ql.Actual365Fixed(), ql.Continuous).rate() for d in sample_nodes ]
crv3 = ql.ZeroCurve(sample_nodes, sample_rates, ql.Actual365Fixed())

z3 = [ crv3.zeroRate(d, ql.Actual365Fixed(), ql.Continuous).rate() for d in sample_dates ]

fig = plt.figure(figsize=(12,6))
ax = fig.add_subplot(1,1,1)
ax.plot_date([d.to_date() for d in sample_dates], z1, '.')
p, = ax.plot_date([d.to_date() for d in sample_dates], z3, '-')
ax.plot_date([d.to_date() for d in sample_nodes], sample_rates, 'o', markersize=8, color=p.get_color())

具有不同節點的曲線

簡而言之:您需要使用相同的節點和插值。您可以從原始曲線中檢索前者curve.nodes(),並且您必須選擇提供後者的類。對於PiecewiseLinearZero,您必須使用ZeroCurve; 對於PiecewiseFlatForward,該nodes方法將返回成對的日期和瞬時遠期匯率,您可以使用它們來創建 的實例ForwardCurve

對於PiecewiseLogCubicDiscount,該nodes方法將返回成對的日期和折扣因子,您必須將它們傳遞給相應的插值折扣曲線;但是,目前導出到 Python ( DiscountCurve) 的那個使用對數線性插值,而不是對數三次。如果要使用後者,則必須進行修改QuantLib-SWIG/SWIG/discountcurve.i,以便它還導出所需的曲線並重新編譯包裝器。如果您想對零利率或遠期利率使用不同的插值,也是如此;要編輯的相應文件是zerocurve.iforwardcurve.i

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