Quantlib-Python:使用零利率獲得最初的自舉曲線
假設我正在嘗試使用 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.i
和forwardcurve.i
。