2017-02-16 116 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 本身。 Black模型是对数正态模型,不适用于负值(因为您无法取对数)。正如你猜测的那样,当利率开始下降时,结果是一个问题。它可以通过两种不同的方式解决:第一种是改变模型并使用正常模型,第二种是引入固定位移Dlog(R+D)而不是log(R),以便对数的参数为​​正。

在这两种情况下,波动率都必须改变(实际上,报价的波动率也会告诉您使用何种模型和位移)。在QuantLib中,这意味着您在建立波动率期限结构—时必须传递相关信息,这是您目前遇到问题的地方。 C++库已经提供了一段时间的功能,但是Python模块还没有导出相应的ConstantOptionletVolatility,所以你得到了默认值,即对数正态模型和空位移。

如果你是用SWIG几分惬意,您可以修改相应的接口文件QuantLib-SWIG/SWIG/volatilities.i(你有一对夫妇的参数添加到ConstantOptionletVolatility构造,以同样的方式它是为ConstantSwaptionVolatility类所做的相同文件),重新生成包装并编译它们。否则,请在https://github.com/lballabio/QuantLib-SWIG/issues处打开问题,我们将尝试在下一个版本中添加该功能。