2017-02-16 19 views
1

Я столкнулся с проблемой, генерирующей денежные потоки от облигаций с полом.Использование QuantLib для расчета денежных потоков для плавающих FloatingRateBonds

У меня изначально возникла проблема, потому что я пренебрегал назначением ценника. С тех пор я установил ценник, как показано ниже.

ql_bond = QuantLib.FloatingRateBond(settlement_days, #settlementDays 
           face_amount, # faceAmount 
           ql_schedule, 
           ql_index, 
           QuantLib.Thirty360(), 
           gearings = [], 
           spreads = [libor_spread], 
           caps = [], 
           floors = [libor_floor] 
    ) 

    volatility = 0 
    vol = QuantLib.ConstantOptionletVolatility(settlement_days, 
              QuantLib.UnitedKingdom(), 
              QuantLib.Unadjusted, 
              volatility, 
              QuantLib.Thirty360()) 

    pricer = QuantLib.BlackIborCouponPricer(QuantLib.OptionletVolatilityStructureHandle(vol)) 
    QuantLib.setCouponPricer(ql_bond.cashflows(), pricer) 

По некоторым денежным потокам я могу генерировать разумную сумму для денежного потока. Однако в то же время я сталкиваюсь с ошибкой. Значение, указанное для удара (-.0225), равно libor_floor - libor_spread. Я почти уверен, что совершу здесь явную ошибку, но не знаю, с чего начать. Если кто-либо, более знакомый с QuantLib, имеет какие-либо предложения, они были бы весьма признательны.

Traceback (most recent call last): 
    File "C:\Users\Ryan\git\optimizer\src\calcs\cashflow_calcs.py", line 161, in generate_cashflow 
    cashflows.append(utils.cashflow.InterestCashflow(cf_date, cf.amount(), cf_fixing_date, c.indexFixing(), c.accrualDays())) 
    File "C:\Users\Ryan\Anaconda3\lib\site-packages\QuantLib\QuantLib.py", line 8844, in amount 
    return _QuantLib.CashFlow_amount(self) 
RuntimeError: strike + displacement (-0.0225 + 0) must be non-negative 

Это связано с более ранней почте я сделал Using QuantLib to compute cash flows for FloatingRateBond with Floor

ответ

0

Проблема не QuantLib по себе. Черная модель является логнормальной и не работает для отрицательных значений (поскольку вы не можете взять их логарифм). Как вы можете догадаться, это оказалось проблемой, когда ставки начали идти отрицательно. Его можно решить двумя разными способами: сначала нужно изменить модель и использовать нормальный, а второй - ввести фиксированное смещение D и модель log(R+D) вместо log(R), чтобы аргумент логарифма был положительным.

В обоих случаях волатильность должна измениться (и фактически цитируемые волатильности также расскажут вам, какая модель и перемещение были использованы). В QuantLib это означает, что вам нужно будет передать соответствующую информацию, когда вы построите структуру сроков волатильности —, и здесь вы находитесь в затруднении. Библиотека C++ предоставляет функциональность некоторое время, но модуль Python не экспортирует соответствующий ConstantOptionletVolatility, так что вы получаете значения по умолчанию, то есть логарифмическую модель и нулевое перемещение.

Если вы несколько комфортно с SWIG, вы можете изменить соответствующий файл интерфейс QuantLib-SWIG/SWIG/volatilities.i (вы должны добавить пару аргументов в ConstantOptionletVolatility конструкторы, так же, как это делается для ConstantSwaptionVolatility класса в том же файл), регенерируйте обертки и скомпилируйте их. В противном случае откройте вопрос по адресу https://github.com/lballabio/QuantLib-SWIG/issues, и мы попытаемся добавить эту функцию в следующую версию.

 Смежные вопросы

  • Нет связанных вопросов^_^