固定收益
Quantlib ZeroCurve 插值
如果我使用 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
像不必儲存compounding
andfrequency
。我們可以使用等式驗證新的費率 $$ 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))
有沒有人回答為什麼會這樣?謝謝。