QuantLib: построение дисконтной кривой из спотов - PullRequest
1 голос
/ 30 января 2020

Я только начал использовать QuantLib и разбирался с различными функциями. Вопрос в том, что у меня есть гипотетическая кривая пятна, показанная ниже

spot_tenors = [0,0, 0,5, 1,0, 1,5, 2,0, 2,5, 3,0, 3,5, 4,0, 4,5, 5,0, 5,5, 6,0, 6,5, 7,0, 7,5, 8,0, 8,5, 9,0, 9,5, 10,0]

пятна = [0,0, 5,25, 5,43, 5,76, 6,02, 6,28, 6,55, 6,82, 6,87, 7,1, 7,21, 7,26, 7,31, 7,43, 7,48 , 7.54, 7.67, 7.8, 7.79, 7.93, 8.07]

, когда я пытаюсь создать discount_curve и discount_handle Я получаю ошибки, так как многие из моих теноров являются числами с плавающей запятой 1.5,2.5 и так далее

import matplotlib
matplotlib.use('macosx')
import matplotlib.pyplot as plt
import QuantLib as ql

#create a bond
issueDate = ql.Date(15, 1, 2015)
maturityDate = ql.Date(15, 1, 2025)
tenor = ql.Period(ql.Semiannual)
calendar = ql.UnitedStates()
bussinessConvention = ql.Unadjusted
dateGeneration = ql.DateGeneration.Backward
monthEnd = False
schedule = ql.Schedule (issueDate, maturityDate, tenor, calendar, bussinessConvention,bussinessConvention , dateGeneration, monthEnd)

# Now lets build the coupon
dayCount = ql.Thirty360()
couponRate = .06
coupons = [couponRate]

settlementDays = 0
faceValue = 100
bond = ql.FixedRateBond(settlementDays, faceValue, schedule, coupons, dayCount)

today = ql.Date(30, ql.January, 2020)
nodes = [today + Period(n, Years) for n in spot_tenors] #this is where I get the error

discount_curve = ql.ZeroCurve(nodes, spots, ql.Actual360())
discount_handle = ql.YieldTermStructureHandle(discount_curve)
bond.setPricingEngine(ql.DiscountingBondEngine(discount_handle))

ошибка, которую я получаю

Traceback (most recent call last):
  File "/Users/prasadkamath/anaconda2/envs/Pk/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-301-cc1508b12a56>", line 1, in <module>
    [today + Period(n, Years) for n in tenors]
  File "<ipython-input-301-cc1508b12a56>", line 1, in <listcomp>
    [today + Period(n, Years) for n in tenors]
  File "/Users/prasadkamath/anaconda2/envs/Pk/lib/python3.6/site-packages/QuantLib/QuantLib.py", line 183, in __init__
    _QuantLib.Period_swiginit(self, _QuantLib.new_Period(*args))
TypeError: Wrong number or type of arguments for overloaded function 'new_Period'.
  Possible C/C++ prototypes are:
    Period::Period()
    Period::Period(Integer,TimeUnit)
    Period::Period(Frequency)
    Period::Period(std::string const &)

есть идеи, как решить проблему или я что-то упустил?

1 Ответ

2 голосов
/ 31 января 2020

В коде, который вы опубликовали, должно быть что-то не так, потому что это не приведет к этой ошибке. Ваша ошибка связана с созданием объекта Period, который должен быть либо:

  • ql.Period('6M') для строки в качестве ввода
  • ql.Period(6, ql.Months) для целого числа как число периодов и объекта TimeUnit

В любом случае, способ построения ZeroCurve будет:

dates = [ql.Date(31,12,2019),  ql.Date(31,12,2020),  ql.Date(31,12,2021)]
zeros = [0.01, 0.02, 0.03]
curve = ql.ZeroCurve(dates, zeros, ql.ActualActual(), ql.TARGET())

Тогда вы можете получить коэффициенты дисконтирования, используя либо год или дата:

curve.discount(1.5)
curve.discount(ql.Date(15,6,2021))
...