程式

python中使用卡爾曼濾波器和MLE進行油價模型校準

  • October 26, 2020

我正在嘗試在 python 3 中校準一個單因素均值恢復過程。該過程定義為:

$$ \begin{equation} dX = k(\alpha - X)dt + \sigma dW , \end{equation} $$

在哪裡 $ \alpha = \mu - \frac{\sigma^2}{2k} $ 是長期平均對數價格和 $ k $ 是調整的速度。在風險中性機率下 $ Q $ 我們把前面的方程寫成

$$ \begin{equation} dX = k(\alpha^* - X)dt + \sigma dW^*. \end{equation} $$

這裡 $ \alpha^= \alpha - \lambda $ , 在哪裡 $ \lambda $ 是風險的市場價格。基於吉爾薩諾夫定理 $ dW^ $ 是鞅測度下的布朗運動 $ Q $ .

我的測量和轉換方程是:

  • 測量方程將可觀察變數的時間序列(在我的例子中為不同期限的期貨價格)與不可觀察的狀態變數(即現貨價格)聯繫起來:

$$ \begin{equation} y_{t} = Z_{t}X_{t} + d_{t} + \epsilon_{t}, \qquad t = 1, …, NT \end{equation} $$

在哪裡

$ y_{t}=\left[\ln F\left(T_{i}\right)\right] $ , $ i=1,…,N $ , $ N\times 1 $ 可觀察的向量,

$ d_{t}=\left[\left(1-e^{-\kappa T_{1}}\right) \alpha^{*}+\frac{\sigma^{2}}{4 \kappa}\left(1-e^{-2 k T_{1}}\right)\right], \quad i=1, \ldots, N, \quad N \times 1 $ 向量,

$ Z_{t}=\left[e^{-\kappa T_{i}}\right], \quad i=1, \ldots, N, \quad N \times 1 $ 向量,

$ \epsilon_{t}, \quad N\times 1 $ 序列不相關擾動的向量 $ \mathbb{E}(\epsilon_{t}) = 0 $ 和 $ Var(\epsilon_{t}) = H $ .

  • 轉移方程是 OU 油價隨機過程的離散時間版本:

$$ \begin{equation} X_{t}=c_{t}+Q_{t} X_{t-1}+\eta_{t}, \quad t=1, \ldots, N T \label{eq:38}, \end{equation} $$

在哪裡

$ c_{t}=\kappa \alpha \Delta t $

$ Q_{t}=1-\kappa \Delta t $

$ \eta_{t} $ , 序列不相關的擾動與 $ \mathbb{E}(\eta_{t}) = 0 $ 和 $ Var(\eta_{t}) = \sigma^2 \Delta t $ .

目的是通過 MLE 使用不同期限期貨價格的時間序列來校準模型參數。任何有關編碼部分(在 python 3 中)的幫助將不勝感激!

擴展@ir7 的答案,這裡有一些pykalman程式碼/虛擬碼可以幫助您入門。這可以通過多種方式進行調整,但我留下了一些參數給你一個想法。我也在底部留下了一個文件連結。這些函式將設置應用於您的數據的卡爾曼濾波器,然後將該數據饋送到隨後在回測函式中呼叫的回歸:

import pandas as pd
import numpy as np
from pykalman import KalmanFilter

def your_function_name(x):
   your_filter_name = KalmanFilter(transition_matrices = [1],
                                   observation_matrices = [1],
                                   observation_covariance=1,
                                   transition_covariance=.01,
                                   initial_state_mean = 0,
                                   initial_state_covariance = 1)

   state_means, _ = kf.filter(x.values)
   state_means = pd.Series(state_means.flatten(), index=x.index)
   return state_means


def your_regression_filter(x, y):
   delta = 1e-3
   trans_cov = delta / (1 - delta) * np.eye(2)  #random walk wiggle
   obs_mat = np.expand_dims(np.vstack([[x], [np.ones(len(x))]]).T, axis=1)
   kf = KalmanFilter(n_dim_obs=1,
                     n_dim_state=2,
                     initial_state_mean=[0,0],
                     initial_state_covariance=np.ones((2, 2)),
                     transition_matrices=np.eye(2),
                     observation_matrices=obs_mat,
                     observation_covariance=2,
                     transition_covariance=trans_cov)

   # Use the observations y to get running estimates and errors for the state parameters
   state_means, state_covs = kf.filter(y.values)
   return state_means

使用這兩個函式,您將定義一個回測函式,您可以在其中state_means呼叫:

state_means = your_regression_filter(your_function_name(x), your_function_name(y))

從這裡如何使用state_means取決於您。

欲了解更多資訊:pykalman 文件

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