Chan 在他的卡爾曼濾波器程式碼中是否使用了錯誤的狀態轉換模型?
在他的著作《算法交易:制勝策略及其基本原理》中,Ernie Chan 展示瞭如何使用卡爾曼濾波器來提高協整投資組合的回報。回想一下,狀態方程是:
$$ \beta_t=\alpha\cdot\beta_{t-1}+\omega_{t-1} $$ 這裡, $ \alpha $ 是狀態轉移矩陣, $ \beta_t $ 是狀態向量,並且 $ \omega_t $ 是過程雜訊向量。 在他的卡爾曼濾波器程式碼中,Chan 設置了狀態轉移矩陣, $ \alpha $ , 到單位矩陣。但是,我認為這是錯誤的。回想一下,在測量方程中使用了狀態向量:
$$ y_t=\beta_t\cdot x_t + \epsilon_t $$ 對於 k 協整時間序列,觀察向量, $ x_t $ ,狀態向量, $ \beta_t $ , 和可觀察的, $ y_t $ , 是:
$$ x_t=(1,;x_{2,t},;x_{3,t},;…;,;x_{k,t}) $$ $$ \beta_t=(\beta_{1,t},;\beta_{2,t},;\beta_{3,t},;…;,;\beta_{k,t}) $$ $$ y_t = x_{1,t} $$ 狀態向量與靜態權重( $ w_1,w_2,…,w_k $ ) 從 Johansen 過程中獲得,因為這些權重給出了一個平穩的時間序列, $ y_{\text{port}} $ :
$$ y_{\text{port}}=w_1\cdot x_1:+:w_2\cdot x_2:+:w_3\cdot x_3:+:…:+:w_k\cdot x_k $$ 解決 $ y=x_1 $ ,我們得到: $$ x_1=(y_{\text{port}}:-:w_2\cdot x_2:-:w_3\cdot x_3:-:…:-:w_k\cdot x_k),/,w_1 $$ 因此,從測量方程,初始狀態向量在時間 $ t $ 一定是: $$ \beta_t=(y_{\text{port},t}/w_1,;-w_2/w_1,;-w_3/w_1,;…;,;-w_k/w_1) $$ 矩陣的第一列 $ \beta $ 是 $ y_{\text{port}}/w_1 $ ,它是靜止的,因為 $ y_{\text{port}} $ 是靜止的。因此,該組件的狀態估計 $ \beta $ 有時 $ t $ 是: $$ \beta_{1,t}=\alpha_{11}\cdot\beta_{1,t-1} $$ 在哪裡 $ \alpha_{11} $ 對於靜止的情況,它***必須小於 1 。***該分析表明正確的狀態轉移矩陣不是單位矩陣,而是: $$ \alpha=\left[ \begin{array}{cccc} \alpha_{11} & 0 & 0 & … & 0\ 0 & 1 & 0 & … & 0\ 0 & 0 & 1 & … & 0\ \vdots & \vdots & \vdots & \ddots & \vdots\ 0 & 0 & 0 & … & 1 \end{array} \right] $$ 換句話說,狀態轉移矩陣是單位矩陣,除了 (1,1) 元素,它必須小於 1(用於平穩性)。 我們如何計算 $ \alpha_{11} $ ? 將狀態方程兩邊右乘 $ \beta_{t-1}^T $ ,取期望值,求解 $ \alpha_{11} $ :
$$ \alpha_{11}=\frac{\sum_{t=2}^n\beta_{1,t}\cdot\beta_{1,t-1}^T}{\sum_{t=2}^n \beta_{1,t-1}\cdot\beta_{1,t-1}^T} $$ 我目前正在與提供固定投資組合的 ETF 的協整三元組進行交易, $ y_{\text{port}} $ . 當我應用單位根檢驗(測量平穩性)時 $ y_{\text{port}} $ ,我使用卡爾曼濾波器中的狀態轉移矩陣得到以下 p 值,狀態轉移矩陣的 (1,1) 元素具有不同的值, $ \alpha $ :
$$ \begin{array}{|c|c|} \hline \alpha_{11} & p\ \hline 1 & 0.00086\ \hline 0.93 & 0.00058\ \hline 0.007 & 3\times10^{-13}\ \hline \end{array} $$ p 值越小表明平穩的可能性越大。所有這些 p 值都表示平穩性,但修改後的轉移矩陣 ( $ \alpha_{11}=0.93 $ ) 比單位矩陣 ( $ \alpha_{11}=1 $ )。在最後一個例子中( $ \alpha_{11}=0.007 $ ),我迭代卡爾曼濾波器計算1000次,每次重新計算 $ \alpha_{11} $ ,以及每次迭代的過程雜訊共變異數矩陣、觀測雜訊變異數、初始狀態向量和初始狀態共變異數矩陣(稱為卡爾曼濾波器的“自適應調整”的過程)。這給了非常高的平穩性 $ y_{\text{port}} $ 大批。(這也反映在交易算法回測的更高回報上。)
我在金融時間序列中關於卡爾曼濾波器的文獻中沒有看到這種分析。誰能挑剔它?
除了為卡爾曼濾波器獲得正確的轉換模型外,優化濾波器性能的主要障礙是實現最優初始化。我使用迭代方法來初始化或“調整”卡爾曼濾波器,稱為自適應調整。我這樣做是因為我找到了初始化卡爾曼濾波器的替代方法(例如Chan 提到的自共變異數最小二乘法)以給出平庸的結果。以我的經驗,自適應調整可以產生適合均值回歸交易的高度穩定的投資組合。
有四個必須初始化的量:
- 初始狀態向量, $ \beta(0) $
- 這 $ k\times k $ 初始狀態共變異數矩陣, $ \text{cov}(\beta(0)) $
- 測量雜訊變異數, $ \nu_e $
- 這 $ k\times k $ 狀態雜訊共變異數矩陣, $ \nu_\omega $
此外,必須在第一次通過過濾器時對這些量做出合理的初始選擇。隨後通過過濾器可能會使用不同的計算(出於我希望將變得清楚的原因)。
雜訊(協)變異數初始化
對於測量雜訊變異數的初始值, $ \nu_e(0) $ ,我使用第一個分量的變異數 $ \beta_1 $ (其他成分不變):
$$ \nu_e(0)=\text{var}(\beta_{1,1})=\text{var}(y_\text{port}/w_1) $$
但是,如果您使用自適應調整方法,任何合理的初始值都可能會起作用。
對於隨後通過卡爾曼濾波器,我求解測量雜訊的測量方程, $ \epsilon_t $ ,並取其平方的期望值得到測量雜訊變異數, $ \nu_e $ :
$$ \epsilon_t=y_t-\beta_t\cdot x_t $$ $$ \nu_e=E\left[\epsilon_t \cdot \epsilon_t^T\right]=\frac{\sum_{t=1}^{n}\epsilon_t\cdot\epsilon_t^T}{n} $$
對於狀態雜訊共變異數的初始值,我首先計算狀態轉移矩陣, $ \alpha $ ,使用我原來的文章中顯示的公式,計算 $ \alpha_{1,1} $ . 然後我將狀態方程乘以其轉置(外積),並取期望值:
$$ E\left[\beta_t\otimes\beta_t^T\right]=E\left[(\alpha\cdot\beta_{t-1}+\omega_{t-1})\otimes(\alpha\cdot\beta_{t-1}+\omega_{t-1})^T\right] $$
這可以求解初始狀態雜訊共變異數矩陣, $ \nu_\omega(0) $ :
$$ \nu_\omega(0)=E\left[\omega_t\otimes\omega_t^T\right]=\Gamma-\alpha\cdot\Gamma\cdot\alpha^T $$
在哪裡 $ \Gamma $ 是:
$$ \Gamma=\frac{\sum_{t=1}^n\beta_t\otimes\beta_t^T}{n} $$
$ \nu_\omega(0) $ 應該對角化(非對角元素設置為零)。那麼只有 (1,1) 分量 $ \nu_\omega(0) $ 將非零。
對於卡爾曼濾波器的後續通過,我求解過程雜訊向量的狀態方程, $ \omega_t $ ,並取過程雜訊向量的外積與自身的期望值,得到狀態雜訊共變異數矩陣, $ \nu_\omega $ :
$$ \omega_t=\beta_{t+1}-\alpha\cdot\beta_t $$ $$ \nu_\omega=E\left[\omega_t\otimes\omega_t^T\right]=\frac{\sum_{t=1}^{n-1}(\beta_{t+1}-\alpha\cdot\beta_t)\otimes(\beta_{t+1}-\alpha\cdot\beta_t)^T}{n-1} $$
但是,我還沒有完成。 $ \beta_1 $ 是靜止的,所以我必須替換的 (1,1) 組件 $ \nu_\omega $ 使用我在原始文章中使用的固定解決方案:
$$ \nu_{\omega,1,1}=(1-\alpha_{1,1}^2)\Gamma_{1,1} $$
最後, $ \nu_\omega $ 應該對角化。
狀態和狀態共變異數初始化
要獲得初始狀態,請從我在原始文章中計算的初始狀態向量開始:
$$ \beta_t=(y_{\text{port},t}/w_1,;-w_2/w_1,;-w_3/w_1,;…;,;-w_k/w_1) $$
這 $ \beta_{t,1} $ 分量是平穩的,因此該分量的期望值為零。(參見Kalman Filter Initialization - The Stationary Case中的推導。)因此,初始狀態向量, $ \beta(0) $ , 是:
$$ \beta(0)=(0,;-w_2/w_1,;-w_3/w_1,;…;,;-w_k/w_1) $$
這個初始化為 $ \beta_1 $ 應該在卡爾曼濾波器的每次迭代開始時使用。
狀態共變異數初始化要復雜得多。對於第一次通過卡爾曼濾波器,我計算初始狀態共變異數矩陣, $ \text{cov}(\beta(0)) $ ,使用Gemson 的逆資訊矩陣計算(方程 3.4,第 3.8.2 節):
$$ \text{cov}(\beta(0))=\nu_e\left[\frac{\sum_{t=1}^n(\alpha^T\cdot x_t^T)\otimes(x_t\cdot\alpha)}{n}\right]^{-1} $$
然而,任何合理的 $ k\times k $ 矩陣可能會起作用,前提是它是對角化的,並且所有對角元素都是 $ >0 $ . (任何零對角元素都會導致相應的卡爾曼濾波器增益元素為零,從而阻止狀態和狀態共變異數更新。)
對於卡爾曼濾波器的後續通過,我們可以計算初始狀態共變異數, $ \text{cov}(\beta(0)) $ ,從狀態矩陣, $ \beta $ ,使用共變異數的傳統定義 $ ^* $ :
$$ \text{cov}(\beta(0))=E\left[(\beta-E[\beta])(\beta-E[\beta])\right]=\frac{\sum_{t=1}^n(\beta_t-\beta_m)\otimes(\beta_t-\beta_m)^T}{n-1} $$ $$ \beta_m=(\text{mean}(\beta_1),;\text{mean}(\beta_2),;…;,;\text{mean}(\beta_k)) $$
$ ^* $ 2018 年 8 月 18 日編輯: $ n $ 在分母 $ \text{cov}\beta(0) $ 變成 $ n-1 $ 用於無偏共變異數計算。
這很好用,但我發現我可以得到一個更穩定的投資組合(因此,在我的回測中,平均年回報率/最大回撤率更高), $ y_\text{port} $ , 通過使用不同的表達式 $ \beta_m $ 在我的 $ \text{cov}(\beta(0)) $ 計算:
$$ \beta_m=\left(\text{mean}(y_{\text{port},t}/w_1),;-w_2/w_1,;-w_3/w_1,;…;,;-w_k/w_1\right) $$
換句話說,對於期望值 $ E(\beta) $ ,我使用初始狀態向量的平均值, $ \beta_t $ ,這是我在原始文章中計算的。為什麼這似乎效果更好?我認為這是因為初始狀態向量是根據 Johansen 權重計算的,這是最優協整權重(對於靜態權重),“真實”期望值也是如此。無論如何,我會選擇最有效的方法。在這方面使用你自己的判斷。
實施說明
如果使用狀態轉移矩陣, $ \alpha $ ,在我的開篇文章中得出,您需要在卡爾曼濾波器中使用正確的狀態預測和狀態共變異數預測方程。狀態預測方程應為: $$ \beta_t=\alpha\cdot\beta_{t-1} $$ 狀態共變異數預測方程應為: $$ \text{cov}(\beta_t)=\alpha\cdot \text{cov}(\beta_{t-1})\cdot \alpha^T;+;\nu_\omega $$ 在哪裡 $ \nu_\omega $ 是個 $ k \times k $ 狀態雜訊共變異數矩陣。
此外,所有的 $ k\times k $ 矩陣, $ \alpha $ , $ \text{cov}(\beta(0)) $ , $ \nu_\omega $ , $ \Gamma $ , 應該是對角化的——所有非對角元素都設置為零。
目前,我為我的三重 ETF 投資組合使用了大約 2000 次卡爾曼濾波器迭代,以將所有數量都設置為固定值。這大約需要 1 分鐘,但我每週只做一次,並使用我從這個過程中獲得的動態權重在一周內進行交易。優點是我獲得了一個高度穩定的投資組合, $ y_{\text{port}} $ .
為了顯示卡爾曼濾波器的效果,這裡是使用靜態約翰森權重的加權投資組合(在卡爾曼濾波器之前):
這是相同的投資組合,除了使用卡爾曼濾波器中的動態投資組合權重:
那更靜止!
我將繼續每天至少檢查一次,一段時間,並嘗試回答可能出現的任何問題。我很感激任何回饋。