程式

單調三次樣條插值QuantLib python

  • May 8, 2020

我是 QuantLib-Python 的新手,我正在嘗試使用 QuantLib-Python 複製雙曲線引導程序的實現。我已按照 QuantLib Python Cookbook 第 9 章中的步驟進行操作。也就是說,我已經初始化了 Deposits+OIS 的助手來建構 Eonia 曲線,然後將其傳遞給 Tenor Curve (Euribor 6M) 的助手。

我的理解是,在 QuantLib 中,插值方法的選擇由稱為 PiecewiseLogCubicDiscount 的對像給出。在這種情況下,三次插值是在對數折扣因子上執行的。

我想在對數折扣因子上使用單調三次樣條進行插值。我看到在這個文件中導出了一些插值。我在 interpolation.i 文件中看到其他插值方法可用。我只是不知道如何訪問這些。謝謝你。

你是對的。在 QuantLib python 中,您應該選擇適當的類來獲得所需的插值方法和變數。

以下是一些方法的範例:

import QuantLib as ql

market_data = [
   ('DEPOSIT', '6M', -0.114),
   ('FRA', '6M', -0.252),
   ('FRA', '12M', -0.306),
   ('SWAP', '2Y', -0.325),
   ('SWAP', '3Y', -0.347)
]

helpers = ql.RateHelperVector()
index = ql.Euribor6M()
for instrument, tenor, rate in market_data:
   rate /= 100
   if instrument == 'DEPOSIT':
       helpers.append(ql.DepositRateHelper(rate, index))
   if instrument == 'FRA':
       monthsToStart = ql.Period(tenor).length()    
       helpers.append(ql.FraRateHelper(rate, monthsToStart, index))
   if instrument == 'SWAP':
       helpers.append(
           ql.SwapRateHelper(
               rate, ql.Period(tenor), ql.TARGET(), ql.Annual,
               ql.Following, ql.Thirty360(), index
           )
       )

params = [2, ql.TARGET(), helpers, ql.ActualActual()]
curves = {
   "PiecewiseFlatForward": ql.PiecewiseFlatForward(*params),
   "LogLinearDiscount": ql.PiecewiseLogLinearDiscount(*params),
   "LogCubicDiscount": ql.PiecewiseLogCubicDiscount(*params),
   "LinearZero": ql.PiecewiseLinearZero(*params),
   "CubicZero": ql.PiecewiseCubicZero(*params),
   "LinearForward": ql.PiecewiseLinearForward(*params),
   "SplineCubicDiscount": ql.PiecewiseSplineCubicDiscount(*params)
}

如果您檢查曲線節點的折扣因子,它們將是相同的:

import pandas as pd

df = pd.DataFrame(index=[row[0] for row in curves['LogLinearDiscount'].nodes()])
for curve in curves:
   dfs = [curves[curve].discount(idx) for idx in df.index]
   df[curve] = dfs

在此處輸入圖像描述

但是,如果您從用於建構曲線的工具未給出的日期中獲得折扣因子,您將獲得不同的值,因為您對不同的變數使用不同的插值方法:

new_df = pd.DataFrame(index=[idx + ql.Period('15d') for idx in df.index])
for curve in curves:
   curves[curve].enableExtrapolation()
   dfs = [curves[curve].discount(idx) for idx in new_df.index]
   new_df[curve] = dfs

在此處輸入圖像描述

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