python中使用卡爾曼濾波器和MLE進行油價模型校準
我正在嘗試在 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 文件