固定收益

Quantlib ZeroCurve 插值

  • January 10, 2022

如果我使用 ZeroCurve 建構子,我想檢查 QuantLib 如何對速率進行插值。正如這裡提到的,通過使用,curve.nodes()您可以獲得用於插值的費率列表。

因此,如果我使用以下程式碼建構一條即期匯率曲線

import QuantLib as ql
todays_date = ql.Date(12, 3, 2020)
spot_dates = [todays_date + ql.Period(i, ql.Years) for i in [0, 1, 2, 3, 4, 5]]
spot_rates = [0.01, 0.02, 0.03, 0.04, 0.05, 0.06]
spot_curve = ql.ZeroCurve(
   spot_dates, spot_rates, 
   ql.SimpleDayCounter(),
   ql.NullCalendar(),
   ql.Linear(),
   ql.Compounded,
   ql.Annual
)

我回來了

spot_curve.nodes()
((Date(12,3,2020), 0.009950330853148023),
(Date(12,3,2021), 0.01980262729617973),
(Date(12,3,2022), 0.02955880224154438),
(Date(12,3,2023), 0.03922071315328132),
(Date(12,3,2024), 0.04879016416943205),
(Date(12,3,2025), 0.05826890812397582))

我意識到問題在於復合。通過指示輸入速率是連續複合的,nodes()與輸入相匹配。

spot_curve = ql.ZeroCurve(
   spot_dates, spot_rates, 
   ql.SimpleDayCounter(),
   ql.NullCalendar(),
   ql.Linear(), ql.Continuous, ql.Annual
)
spot_curve.nodes()
((Date(12,3,2020), 0.01),
(Date(12,3,2021), 0.02),
(Date(12,3,2022), 0.03),
(Date(12,3,2023), 0.04),
(Date(12,3,2024), 0.05),
(Date(12,3,2025), 0.06))

基於這一發現,問題是:QuantLib 是否總是插入連續利率(使用零利率建構子)?這是一個約定嗎?

對像中儲存的數據經過調整,使得複利為Continuous,頻率為NoFrequency。C++ 原始碼可在此處獲得:zerocurve.hpp。我認為這樣做的原因是對ZeroCurve像不必儲存compoundingand frequency

我們可以使用等式驗證新的費率 $$ e^{r_{cont}t}=(1+r_{comp})^t $$

下面的計算給出了零,這驗證了從 Compounded 到 Continuous 的速率的 QuantLib 轉換:

import math
math.exp(0.009950330853148023*1.0)-pow(1.0+0.01,1.0)
math.exp(0.01980262729617973*2.0)-pow(1.0+0.02,2.0)

要獲得具有所需複利和頻率的零利率,您可以使用類似的東西

for x in spot_dates:
   print(spot_curve.zeroRate(x,
                  ql.SimpleDayCounter(),
                  ql.Compounded,
                  ql.Annual).rate())

我遇到了同樣的問題。此外,當我在曲線的參考日期呼叫 ZeroRate 方法時,我得到的比率與我用它創建曲線對象的比率不同。

例如:

ql.Settings.instance().evaluationDate = ql.Date(8, 12, 2021)

rates = [0.015677430225945563, 0.015677430225945563, 0.011840632376029895]
date = [Date(8,12,2021), Date(3,1,2022), Date(1,2,2022)]
curve = ql.ZeroCurve(dates, rates, ql.Actual360(), ql.NullCalendar(), ql.Linear(), ql.Simple, ql.Annual)
curve.zeroRate(ql.Date(8, 12, 2021), ql.Actual360(), ql.Simple).rate()

我預計匯率為 0.015677430225945563,但我得到了 0.015677094022947813

對於其他日期,我得到了正確的價格。

但我也和上面的主題創建者有同樣的問題。當我呼叫曲線節點時,我得到所有日期的不同費率:

curve.nodes()
((Date(8,12,2021), 0.015677093548145716),
(Date(3,1,2022), 0.01566856146524625),
(Date(1,2,2022), 0.011829935508255464))

有沒有人回答為什麼會這樣?謝謝。

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