Quantlib - 给出一个奇怪的错误



我正在使用Quantlib来引导曲线,然后获得折扣率。

通常,通常的步骤工作正常。

但是,对于下面给出的数据,它会抛出一个奇怪的错误。

法典:

def create_ois_swaps(self, ois_swap_rates, helpers=None):
''' Creates a OIS rate helper from incoming OIS rates
Input:
ois_swap_rates: list of tuples comprising of (start_date, end_date, rate, label)
'''
if self.helpers is None:
self.helpers = [
DatedOISRateHelper(start_date, end_date, QuoteHandle(SimpleQuote(rate / 100)), self.ff_local)
for start_date, end_date, rate in [tuple((fixed_bond.pydate_to_qldate(sd),
fixed_bond.pydate_to_qldate(ed),
rate)) for sd, ed, rate, label
in ois_swap_rates if label not in ['ONTN', 'TN']]]
else:
self.helpers += [DatedOISRateHelper(start_date,
end_date,
QuoteHandle(SimpleQuote(rate / 100)), self.ff_local)
for start_date, end_date, rate in [tuple((fixed_bond.pydate_to_qldate(sd),
fixed_bond.pydate_to_qldate(ed),
rate)) for sd, ed, rate, label
in ois_swap_rates if label not in ['ONTN', 'TN']]]
# for start_date, end_date, rate in ois_swap_rates]
self.ois_curve_c = PiecewiseLogCubicDiscount(0, self.calendar, self.helpers, Actual365Fixed())
self.ois_curve_c.enableExtrapolation()
def bootstrap_usd_ois_3M_curve(self,
usd_3M_swap_rates,
discountCurve,
bootStrapMethod=BootStrapMethod.PiecewiseLogCubicDiscount):
discount_curve = RelinkableYieldTermStructureHandle()
discount_curve.linkTo(discountCurve)
self.helpers += [SwapRateHelper(QuoteHandle(SimpleQuote(rate / 100)),
Period(int(label[:-1]), Years),
TARGET(),
Semiannual,
Unadjusted,
Thirty360(Thirty360.BondBasis),
Euribor3M(),
QuoteHandle(),
Period(0, Days),
discount_curve)
for sd, ed, rate, label in usd_3M_swap_rates if label not in ['ONTN', 'TN']]
# for rate, tenor in usd_3M_swap_rates]
if bootStrapMethod == BootStrapMethod.PiecewiseLogCubicDiscount:
self.usd_3M_c = PiecewiseLogCubicDiscount(0, TARGET(), self.helpers, Actual365Fixed())
elif bootStrapMethod == BootStrapMethod.PiecewiseFlatForward:
self.usd_3M_c = PiecewiseFlatForward(0, TARGET(), self.helpers, Actual365Fixed())
# Also, we enable extrapolation beyond the maturity of the last helper; that is mostly
# for convenience as we retrieve rates to plot the curve near its far end.
self.usd_3M_c.enableExtrapolation()

在我的主代码中,我将上述 2 个函数称为:-

创建 OIS 曲线

usd_ois.create_ois_swaps(ois_rate_ql)

引导曲线

usd_ois.bootstrap_usd_ois_3M_curve(usd_3M_swap_rates=libor_rate_ql, discountCurve=usd_ois.ois_curve_c, bootStrapMethod=BootStrapMethod.PiecewiseFlatForward)

日期:

曲线估值日期:2017.01.02

对于discounting_Rate:-

start_date: 2017.01.02 end_date: 2018.01.01 日计数: ACT/360

错误信息:

return _QuantLib.YieldTermStructure_forwardRate(self, *args) 运行时错误:给定负时间 (-0.00273973)

曲线对象

曲线对象使用的数据:用于自举的LIBOR和OIS利率

曲线对象的状态

曲线对象的状态

注意我有一个 1) 贴现 OIS 曲线和 2)正向3M曲线

估值日期为2017年1月2日

我正在拨打的电话在贴现曲线上,如下所示:-ois_curve.ois_curve_c.forwardRate(pydate_to_qldate(start_date), pydate_to_qldate(end_date), daycount, Simple).rate() * 100

其中start_Date = 2017年1月2日 end_date = 2018年1月2

日我在一系列日期上运行相同的代码。大多数日期 - 它成功,但很少的日期 - 它奇怪地抛出这个错误

作为参考,我在这里总结上面的评论。 评估日期(2017 年 1 月 2 日)是曲线使用的日历的假日;因此,曲线将其参考日期移至下一个工作日。在这一点上,就曲线而言,1 月 2 日已经过去了,要求该日期的汇率会导致错误。

我同意,至少,应该使错误更具可读性。 我不确定将评估日期设置为假期是否一定会使曲线无效。 抛出错误可能不可行;我们可能使用不同的日历有不同的曲线,只要我们只使用有效的曲线,将其中一个的评估日期设置为假期应该是可以的。

相关内容

最新更新