Python

在 Quantlib Python 中計算交換的期限 DV01,即 Key-rate Duration

  • January 17, 2020

有沒有辦法我可以在 Quantlib-Python 中跨不同交易期限獲得 DV01 的互換。這裡提出的問題,遵循通過將曲線移動 1-bips 並總結正面和負面影響來重新評估掉期的基本方法。

通過上述方法,我們可以獲得衍生工具每條腿(固定/浮動)的淨 DV01。但如果我們深入研究,我們可以看到一條腿的淨 DV01 是在現金流發生的期限點產生的差異 DV01 的聚合(每個現金流期限點可能沒有 DV 貢獻)。簡而言之,我們一般計算 Modified Duration,但我正在尋找 Key-rate Duration。

我必須創建一個對沖籃子,在其中獲得每個高音點的差異 DV01。這樣我就可以購買/出售工具來淨現單個期限的 PV 影響。

例如,這就是我的 Pricer 提供男高音 DV01 的方式。 男高音 DV01 樣本

是否有執行此操作的功能/模組,或者必須從頭開始創建。我已經完成了這篇文章中解釋的步驟,但它說明了一個平坦的利率曲線。我需要評估浮動利率的掉期。我不確定它將如何處理浮動利率的插值。

您將不得不“從頭開始創建它”,儘管它並不太複雜。你要做的是用你的市場曲線來評估你的掉期,然後在改變每個期限後重新評估它。市場價值與您在觸及特定期限後獲得的價值之間的差異將是該期限的主要風險。

有不同的方法可以做到這一點。您可以提高零利率、面值利率或遠期利率。

在這個例子中,我正在提高票面利率。

import QuantLib as ql

today = ql.Date().todaysDate()
tenors = (1,2,3,4,5,6,7)
quotes = [ql.SimpleQuote(0.01) for n in tenors]
handles = [ql.QuoteHandle(quote) for quote in quotes]
dates = [today + ql.Period(y, ql.Years) for y in tenors]

helpers = []
yts = ql.RelinkableYieldTermStructureHandle()
euribor6m = ql.Euribor6M(yts)
for quote, tenor in zip(handles, tenors):
   helpers.append( ql.SwapRateHelper(quote,
                       ql.Period(tenor, ql.Years), ql.TARGET(),
                       ql.Annual, ql.Unadjusted,
                       ql.Thirty360(ql.Thirty360.BondBasis),
                       euribor6m)
                 )
curve = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), helpers, ql.Actual365Fixed())
yts.linkTo(curve)
engine = ql.DiscountingSwapEngine(yts)

swap = ql.MakeVanillaSwap(ql.Period('5y'), euribor6m, 0.01, ql.Period('0d'), Nominal=5e6)
swap.setPricingEngine(engine)

npv = swap.NPV()
key_risk = []
for quote in quotes:
   value = quote.value()
   quote.setValue(value + 0.0001)
   key_risk.append( npv - swap.NPV() )
   quote.setValue(value)

for tenor, risk in zip(tenors, key_risk):
   print("{}y: {:>12,.2f}".format(tenor, risk))

輸出將是:

1y:         -0.00
2y:          0.00
3y:         -0.08
4y:          0.05
5y:     -2,426.15
6y:         -0.00
7y:         -0.00

引用自:https://quant.stackexchange.com/questions/41020