Python

QuantLib-Python:如何在引導期限結構時設置固定參考日期?

  • August 21, 2018

我借用“Quantlib Python Cookbook”第 7 節中的一個例子來問我的問題。為了盡可能清楚地說明這一點,我稍微簡化了程式碼。目的是從 OIS 報價中去除 EONIA 曲線。

初始化不要質疑:

%%capture
%pylab inline --no-import-all
import math
import numpy
import utils
import matplotlib.pyplot as plt

from QuantLib import *
today = Date(11, December, 2012)
Settings.instance().evaluationDate = today

建立了一個 s 列表,OISRateHelper從該列表中刪除期限結構。“2”告訴助手對象,報價對應於從現在開始 +2 天的合約。

helpers = [ OISRateHelper(2, Period(*tenor),      
        QuoteHandle(SimpleQuote(rate/100)), eonia)
        for rate, tenor in [(0.002, (15,Months)), (0.008, (18,Months)),
                            (0.021, (21,Months)), (0.036, (2,Years)),
                            (0.127, (3,Years)), (0.274, (4,Years)),
                            (0.456, (5,Years)), (0.647, (6,Years)),
                            (0.827, (7,Years)), (0.996, (8,Years)),
                            (1.147, (9,Years)), (1.280, (10,Years)),
                            (1.404, (11,Years)), (1.516, (12,Years)),
                            (1.764, (15,Years)), (1.939, (20,Years)),
                            (2.003, (25,Years)), (2.038, (30,Years))] ]

然後通過以下方式執行自舉

eonia_curve = PiecewiseLogCubicDiscount(0, TARGET(), helpers, Actual365Fixed() ) 

上面的初始“0”告訴引導算法,期限結構的參考日期應該在之前定義的evaluationDate.

我不希望我的期限結構對象稍後在我更改評估日期時更改其參考日期。所以我試著打電話

eonia_curve = PiecewiseLogCubicDiscount(today, TARGET(), helpers, Actual365Fixed() ) 

我發現這很自然。但它導致:NotImplementedError:重載函式“new_PiecewiseLogCubicDiscount”的參數數量或類型錯誤。

問題:如何更正上述程式碼行以使用固定參考日期進行引導?

旁注:在上述書的第 5 節中,作者討論了固定參考日期與非固定參考日期的區別。然而,他們使用的程式碼並沒有真正幫助我,因為日期沒有明確指定,而是取自早期剝離的期限結構。

# curve1 is an allready stripped term structure object
dates, rates = zip(*curve1.nodes())

# first date is taken as reference date
curve2 = ForwardCurve(dates, rates, Actual360())

但是,我不想呼叫引導算法兩次:一次以評估日期為參考日期,第二次以today參考日期為參考日期。

非常感謝,伯恩德

要構造PiecewiseLogCubicDiscount具有固定引用日期的對象,請使用以下建構子:

PiecewiseLogCubicDiscount(reference_date, helpers, day_counter, ...)

以你為例:

eonia_curve = PiecewiseLogCubicDiscount(Date(15, December, 2012), helpers, Actual365Fixed())
eonia_curve.referenceDate()
# result: Date(15,12,2012)

您如何自己獲得此結果:

如果您使用不存在的建構子,或者不是 SWIGed,那麼您將獲得NotImplementedError,它通常會列出可用的實現,並且在您的情況下,您可以在此列表中看到您正在尋找的那個。例如:

PiecewiseLogCubicDiscount()
#NotImplementedError: Wrong number or type of arguments for overloaded function 'new_PiecewiseLogCubicDiscount'.
# Possible C/C++ prototypes are:
# ...
# PiecewiseLogCubicDiscountPtr::PiecewiseLogCubicDiscountPtr(Date const &,std::vector< boost::shared_ptr< RateHelper >,std::allocator< boost::shared_ptr< RateHelper > > > const &,DayCounter const &)

您還可以檢查 SWIG 介面文件中可用或不可用的內容:

  1. 檢查QuantLib-SWIG 項目中的piecewiseyieldcurve.i文件。特別是第 46 和 110 行。
46: %define export_piecewise_curve(Name,Base,Interpolator)
110: export_piecewise_curve(PiecewiseLogCubicDiscount,Discount,MonotonicLogCubic);

這些表明PiecewiseLogCubicDiscount是一個PiecewiseYieldCurvewithBase = DiscountInterpolator = MonotonicLogCubic。 2. 看看 SWIGed 建構子。在第 56 到 69 行中,您可以找到您正在尋找的那個。它採用以下參數:

  • 參考日期:const Date& referenceDate
  • 評價助手:const std::vector<boost::shared_ptr<RateHelper> >& instruments
  • 日計數器:const DayCounter& dayCounter
  • 可選參數 jumps、jumpDates、accuracy 和 interpolator。

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