既然你已經建立了債券和貼現曲線,並已在某些方面類似於聯繫他們:
discount_handle = YieldTermStructureRelinkableHandle(discount_curve)
bond.setPricingEngine(DiscountingBondEngine(discount_handle))
你可以先添加一個流傳在現有折扣的曲線,然後用修改曲線來定價債券。喜歡的東西:
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)
會給你最初的價差都在0,你可以改用原來的折扣曲線的新曲線(與一個可怕的類名):
discount_handle.linkTo(new_curve)
上述後,該債券仍然應該返還相同的價格(因爲價差全部爲空)。
當你要計算一個特定的關鍵利率持續時間,您可以將相應的引用:例如,如果你想撞了5年的引號(在上面的列表中的第三個),執行
spreads[2].setValue(0.001) # 10 bps
曲線會相應更新,債券價格應該改變。
注意:上述內容將在點差之間進行插值,所以如果您將5年點移動10個基點並且您保持2年點不變,那麼3年左右的點將移動3個基點。爲了緩解這種情況(如果這不是你想要的),你可以在曲線上添加更多點並限制變化的範圍。例如,如果您在5年減去一個月後再加上一個積分,再加上5年加上1個月,那麼移動5年積分只會影響兩個月的積分。
非常感謝您的回覆Luigi。不用說,你的軟件包和提示非常有幫助。由於我仍在嘗試學習結構,所以對此表示歉意,但是有沒有辦法讓點差[2] .setValue(0.001)更新曲線?關以上你的回答,我曾經執行以下 discount_handle.linkTo(new_curve) 價差[2] .setValue(0.001) fixed_rate_bond.setPricingEngine(new_curve) 打印(fixed_rate_bond.NPV()) 我仍然接收與setValue()之前相同的NPV。這是預期的嗎? – user6142489
它應該更新到位。請將您的代碼發佈到QuantLib郵件列表中,我們將盡力弄清楚。 –
不知道如何在sourceforge上發佈,如果這是你參考的地方。有沒有可以發送給我的電子郵件分發?謝謝。 – user6142489