Da Sie bereits die Bindung und den Rabatt Kurve gebaut, und Sie haben sie in irgendeiner Weise ähnlich wie verbunden:
discount_handle = YieldTermStructureRelinkableHandle(discount_curve)
bond.setPricingEngine(DiscountingBondEngine(discount_handle))
können Sie zunächst eine Ausbreitung über die bestehenden Rabatt Kurve hinzufügen und verwenden Sie dann die modifizierte Kurve, um die Anleihe zu bewerten. Etwas wie:
nodes = [ 1, 2, 5, 7, 10 ] # the durations
dates = [ today + Period(n, Years) for n in nodes ]
spreads = [ SimpleQuote(0.0) for n in nodes ] # null spreads to begin
new_curve = SpreadedLinearZeroInterpolatedTermStructure(
discount_curve,
[ QuoteHandle(q) for q in spreads ],
dates)
geben Ihnen eine neue Kurve mit anfänglichen Spreads alle auf 0 gesetzt (und eine schreckliche Klassenname), die Sie anstelle der ursprünglichen Rabatt Kurve verwenden:
discount_handle.linkTo(new_curve)
Nach oben , sollte die Anleihe immer noch den gleichen Preis zurückgeben (da die Spreads alle null sind).
Wenn Sie einen bestimmten Schlüssel-Rate Dauer berechnen möchten, können Sie das entsprechende Zitat bewegen: zum Beispiel, wenn Sie die 5-Jahre Zitat (die dritte in der Liste oben) stoßen wollen, führen
spreads[2].setValue(0.001) # 10 bps
wird die Kurve entsprechend aktualisieren, und der Anleihekurs ändern sollte.
Ein Hinweis: die obigen interpolieren zwischen Spreads, wenn Sie also die 5-Jahres-Punkte um 10 bps verschieben und den 2-Jahres-Punkt unverändert lassen, würde sich eine Rate um 3 Jahre um etwa 3 bps bewegen. Um dies zu verringern (falls Sie das nicht möchten), können Sie der Kurve weitere Punkte hinzufügen und den Bereich einschränken, der variiert. Wenn Sie beispielsweise einen Punkt zu 5 Jahren minus einem Monat und einen weiteren zu 5 Jahren plus 1 Monat hinzufügen, wirkt sich das Verschieben des 5-Jahres-Punkts nur auf die beiden folgenden Monate aus. so viel
Vielen Dank für Ihre Antwort Luigi. Unnötig zu sagen, Ihr Paket und Tipps sind sehr hilfreich. Entschuldigungen für meine Ignoranz mit diesem, während ich immer noch versuche, die Struktur zu lernen, aber gibt es eine Möglichkeit, die Spreads [2] .setValue (0.001) die Kurve an Ort und Stelle zu aktualisieren? Aus Ihrer Antwort oben, sobald ich führen Sie den folgenden discount_handle.linkTo (new_curve) Spreads [2] .setValue (0,001) fixed_rate_bond.setPricingEngine (new_curve) print (fixed_rate_bond.NPV()) Ich bin immer noch den gleichen NPV wie vor dem setValue(). Ist das zu erwarten? – user6142489
Es sollte aktualisiert werden. Bitte posten Sie Ihren Code in der QuantLib-Mailingliste, wir werden versuchen, es herauszufinden. –
Nicht sicher, wie auf Sourceforge zu posten, wenn Sie darauf verweisen. Gibt es eine E-Mail-Distribution, an die ich sie senden kann? Vielen Dank. – user6142489