2017-02-16 4 views
1

Ich stoße auf ein Problem, das Cash Flows aus Anleihen mit einem Floor generiert.Verwenden von QuantLib zum Berechnen von Cashflows für floored FloatingRateBonds

Ich hatte zunächst ein Problem, weil ich es versäumte, einen Pricer einzustellen. Ich habe seitdem einen Pricer wie folgt festgelegt.

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) 

Auf bestimmten Cash Flows, ich bin in der Lage, eine angemessene Menge für den Cash-Flow zu generieren. In anderen Fällen stoße ich jedoch auf einen Fehler. Der angegebene Wert für den strike (-.0225) entspricht libor_floor - libor_spread. Ich bin mir ziemlich sicher, dass ich hier einen offensichtlichen Fehler mache, bin mir aber nicht sicher, wo ich anfangen soll. Wenn jemand, der mit QuantLib vertrauter ist, irgendwelche Vorschläge hat, würden sie sehr geschätzt werden. Diese

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 

bezieht sich auf einen früheren Beitrag habe ich gemacht Using QuantLib to compute cash flows for FloatingRateBond with Floor

Antwort

0

Das Problem ist nicht QuantLib per se. Das Black-Modell ist logarithmisch und funktioniert nicht für negative Werte (da Sie ihren Logarithmus nicht verwenden können). Wie Sie sich denken können, stellte sich heraus, dass dies ein Problem war, als die Raten negativ wurden. Es kann auf zwei verschiedene Weisen gelöst werden: Das erste ist das Modell zu ändern, und eine normale zu verwenden, und die zweite ist eine feste Verschiebung und D Modell log(R+D) anstelle von log(R) so daß das Argument des Logarithmus einzuführen positiv ist.

In beiden Fällen hat die Volatilität zu ändern (und in der Tat, Volatilitäten zitiert werden Ihnen auch sagen, welches Modell und Verschiebung verwendet wurde). In QuantLib bedeutet dies, dass Sie die relevanten Informationen weitergeben müssen, wenn Sie die Struktur der Volatilitätsausdrücke erstellen — und das ist, wo Sie derzeit in Schwierigkeiten sind. Die C++ - Bibliothek stellt seit einiger Zeit die Funktionalität bereit, aber das Python-Modul exportiert die entsprechende ConstantOptionletVolatility noch nicht, so dass Sie die Standardwerte erhalten, d. H. Lognormales Modell und Nullverschiebung.

Wenn Sie mit SWIG etwas vertraut sind, können Sie die entsprechende Schnittstellendatei ändern QuantLib-SWIG/SWIG/volatilities.i (Sie werden ein paar Argumente zu dem ConstantOptionletVolatility Bauer, in der gleichen Art und Weise hinzufügen, um es für die ConstantSwaptionVolatility Klasse in den gleichen getan Datei), generiere die Wrapper neu und kompiliere sie. Andernfalls öffnen Sie ein Problem unter https://github.com/lballabio/QuantLib-SWIG/issues und wir werden versuchen, das Feature in der nächsten Version hinzuzufügen.

Verwandte Themen