12 votos

¿Utiliza Chan un modelo de transición de estado erróneo en su código de filtro de Kalman?

En su libro, Trading Algorítmico: Estrategias ganadoras y su justificación Ernie Chan muestra cómo utilizar un filtro de Kalman para mejorar la rentabilidad de una cartera cointegrada. Recordemos que la ecuación de estado es: $$\beta_t=\alpha\cdot\beta_{t-1}+\omega_{t-1}$$ Aquí, $\alpha$ es la matriz de transición de estados, $\beta_t$ es el vector de estado, y $\omega_t$ es el vector de ruido del proceso.

En su código del filtro Kalman, Chan establece la matriz de transición de estados, $\alpha$ a la matriz de identidad. Sin embargo, yo diría que esto es erróneo. Recordemos que el vector de estado se utiliza en la ecuación de medición: $$y_t=\beta_t\cdot x_t + \epsilon_t$$

Para k series temporales cointegradas, el vector de observación, $x_t$ el vector de estado, $\beta_t$ y lo observable, $y_t$ son: $$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}$$

El vector de estado está relacionado con los pesos estáticos ( $w_1,w_2,...,w_k$ ) obtenida a partir del procedimiento de Johansen porque estas ponderaciones dan una serie temporal estacionaria, $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$$ Resolver para $y=x_1$ obtenemos: $$x_1=(y_{\text{port}}\:-\:w_2\cdot x_2\:-\:w_3\cdot x_3\:-\:...\:-\:w_k\cdot x_k)\,/\,w_1$$ Por lo tanto, a partir de la ecuación de medición, el vector de estado inicial en el momento $t$ debe ser: $$\beta_t=(y_{\text{port},t}/w_1,\;-w_2/w_1,\;-w_3/w_1,\;...\;,\;-w_k/w_1)$$ La primera columna de la matriz $\beta$ es $y_{\text{port}}/w_1$ que es estacionario porque $y_{\text{port}}$ es estacionario. Por lo tanto, la estimación del estado de este componente de $\beta$ en el momento $t$ es: $$\beta_{1,t}=\alpha_{11}\cdot\beta_{1,t-1}$$ donde $\alpha_{11}$ debe ser inferior a 1 para el caso estacionario. Este análisis indica que la matriz de transición de estado correcta no es la matriz de identidad, sino: $$\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]$$ En otras palabras, la matriz de transición de estado es la matriz de identidad, excepto el elemento (1,1) que debe ser menor que 1 (para la estacionariedad).

¿Cómo calculamos $\alpha_{11}$ ? Derecho-multiplicar ambos lados de la ecuación de estado por $\beta_{t-1}^T$ , tomar el valor de la expectativa, y resolver para $\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}$$

Actualmente estoy operando con un triplete cointegrado de ETFs que dan una cartera estacionaria, $y_{\text{port}}$ . Cuando aplico una prueba de root unitaria (que mide la estacionariedad) a $y_{\text{port}}$ Obtengo los siguientes valores p utilizando una matriz de transición de estado en el filtro de Kalman con diferentes valores para el elemento (1,1) de la matriz de transición de estado, $\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}

Los valores más pequeños de p sugieren una mayor probabilidad de estacionariedad. Todos estos valores p indican estacionariedad, pero la matriz de transición modificada ( $\alpha_{11}=0.93$ ) da mejores resultados que la matriz de identidad ( $\alpha_{11}=1$ ). En el último ejemplo ( $\alpha_{11}=0.007$ ), he iterado el cálculo del filtro de Kalman 1000 veces, recalculando cada vez $\alpha_{11}$ así como la matriz de covarianza del ruido del proceso, la varianza del ruido de observación, el vector de estado inicial y la matriz de covarianza del estado inicial, con cada iteración (un procedimiento conocido como " ajuste adaptativo "del filtro Kalman). De este modo se obtuvo una estacionariedad muy alta para el $y_{\text{port}}$ de la matriz. (Esto también se refleja en una mayor rentabilidad en el backtesting del algoritmo de negociación).

No he visto este análisis en la literatura sobre el filtro de Kalman en series temporales financieras. ¿Alguien puede encontrar algún fallo en él?

0 votos

Le envié al Sr. Chan un enlace a este post. su respuesta: "El análisis de Amanda asume que el sistema es cointegrador. Pero, en realidad, la implementación del filtro de Kalman que he descrito no lo supone. De hecho, el sistema que tiene una relación de cobertura variable no puede considerarse estacionario y, por tanto, alfa no siempre es <1". Ernest Chan.

0 votos

Me parece que el objetivo del procedimiento de Johansen es obtener una cartera ponderada que sea, al menos parcialmente, estacionaria. Mi observación con el filtro Kalman es que la variación del ratio de cobertura hace que la serie temporal de la cartera ponderada tenga un valor p menor para la prueba de root unitaria, y por tanto, más estacionaria. Esto no tiene por qué ser siempre el caso, pero lo es para la cartera que estoy negociando.

0 votos

@AmandaG.: ¿Te importaría enviar tu comentario a Ernie Chan e informar de su reacción? Me gustaría mucho estar al tanto de la discusión. Gracias.

12voto

Tom Eastham Puntos 6

Además de conseguir el modelo de transición adecuado para el filtro de Kalman, el principal obstáculo para optimizar el rendimiento del filtro es implementar una inicialización óptima. Utilizo un enfoque iterativo para inicializar o "afinar" el filtro de Kalman, conocido como ajuste adaptativo . Lo hago porque he encontrado métodos alternativos para inicializar el filtro Kalman (como el mínimos cuadrados de autocovarianza método mencionado por Chan) para dar resultados mediocres. Según mi experiencia, el ajuste adaptativo puede producir una cartera altamente estacionaria adecuada para la negociación de reversión de la media.

Hay cuatro cantidades que hay que inicializar:

  1. El vector de estado inicial, $\beta(0)$
  2. El $k\times k$ matriz de covarianza del estado inicial, $\text{cov}(\beta(0))$
  3. La varianza del ruido de la medición, $\nu_e$
  4. el $k\times k$ matriz de covarianza del ruido de estado, $\nu_\omega$

Además, hay que hacer una elección inicial razonable de estas cantidades en la primera pasada por el filtro. Las siguientes pasadas por el filtro pueden utilizar un cálculo diferente (por razones que espero queden claras).

Inicialización de la (co)varianza del ruido

Para el valor inicial de la varianza del ruido de medición, $\nu_e(0)$ Utilizo la varianza del primer componente de $\beta_1$ (los demás componentes son constantes):

$$\nu_e(0)=\text{var}(\beta_{1,1})=\text{var}(y_\text{port}/w_1)$$

Sin embargo, cualquier valor inicial razonable probablemente funcionará, si está utilizando el enfoque de ajuste adaptativo.

Para las siguientes pasadas por el filtro de Kalman, resuelvo la ecuación de medición para el ruido de medición, $\epsilon_t$ y tomar el valor de la expectativa de su cuadrado para obtener la varianza del ruido de medición, $\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}$$

Para el valor inicial de la covarianza del ruido de estado, primero calculo la matriz de transición de estado, $\alpha$ Utilizando la fórmula mostrada en mi post original, para calcular $\alpha_{1,1}$ . A continuación, posmultiplico la ecuación de estado por su transposición (producto exterior), y tomo las expectativas:

$$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]$$

Esto puede resolverse para la matriz de covarianza del ruido de estado inicial, $\nu_\omega(0)$ :

$$\nu_\omega(0)=E\left[\omega_t\otimes\omega_t^T\right]=\Gamma-\alpha\cdot\Gamma\cdot\alpha^T$$

donde $\Gamma$ es:

$$\Gamma=\frac{\sum_{t=1}^n\beta_t\otimes\beta_t^T}{n}$$

$\nu_\omega(0)$ debe ser diagonalizado (los elementos no diagonales se ponen a cero). Entonces, sólo el componente (1,1) de $\nu_\omega(0)$ será distinto de cero.

Para las siguientes pasadas del filtro Kalman, resuelvo la ecuación de estado para el vector de ruido del proceso, $\omega_t$ y tomar la expectativa del producto exterior del vector de ruido del proceso consigo mismo para obtener la matriz de covarianza del ruido de estado, $\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}$$

Sin embargo, no he terminado del todo. $\beta_1$ es estacionario, por lo que tengo que sustituir el componente (1,1) de $\nu_\omega$ con el solución estacionaria que utilicé en mi post original:

$$\nu_{\omega,1,1}=(1-\alpha_{1,1}^2)\Gamma_{1,1}$$

Finalmente, $\nu_\omega$ debe ser diagonalizado.

Inicialización del estado y de la covarianza del estado

Para obtener el estado inicial, empieza con el vector de estado inicial que calculé en mi post original:

$$\beta_t=(y_{\text{port},t}/w_1,\;-w_2/w_1,\;-w_3/w_1,\;...\;,\;-w_k/w_1)$$

El $\beta_{t,1}$ es estacionaria, por lo que el valor de la expectativa de esta componente es cero. (Véase la derivación en Inicialización del filtro Kalman - El caso estacionario .) Por lo tanto, el vector de estado inicial, $\beta(0)$ es:

$$\beta(0)=(0,\;-w_2/w_1,\;-w_3/w_1,\;...\;,\;-w_k/w_1)$$

Esta inicialización para $\beta_1$ debe utilizarse al comienzo de cada iteración del filtro Kalman.

La inicialización de la covarianza del estado es mucho más complicada. Para la primera pasada por el filtro de Kalman, calculo la matriz de covarianza de estado inicial, $\text{cov}(\beta(0))$ utilizando el Cálculo de la matriz de información inversa de Gemson (ecuación 3.4, sección 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}$$

Sin embargo, cualquier $k\times k$ probablemente funcionará, siempre que esté diagonalizada, y todos los elementos diagonales sean $>0$ . (Cualquier elemento diagonal cero hará que el elemento de ganancia del filtro Kalman correspondiente sea cero, impidiendo que se actualicen las actualizaciones de estado y covarianza de estado).

Para las siguientes pasadas del filtro Kalman, podemos calcular la covarianza de estado inicial, $\text{cov}(\beta(0))$ de la matriz de estado, $\beta$ utilizando la definición tradicional de covarianza $^*$ :

$$\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))$$

$^*$ Editar 8/18/18: $n$ en el denominador de $\text{cov}\beta(0)$ cambió a $n-1$ para imparcialidad cálculo de la covarianza.

Esto funciona bien, pero lo que he comprobado es que puedo conseguir una cartera más estacionaria (y por tanto, una mayor relación rentabilidad media anual/retirada máxima en mi backtesting), $y_\text{port}$ utilizando una expresión diferente para $\beta_m$ en mi $\text{cov}(\beta(0))$ cálculo:

$$\beta_m=\left(\text{mean}(y_{\text{port},t}/w_1),\;-w_2/w_1,\;-w_3/w_1,\;...\;,\;-w_k/w_1\right)$$

En otras palabras, para el valor esperado de $E(\beta)$ Utilizo la media del vector de estado inicial, $\beta_t$ que calculé en mi post original. ¿Por qué parece que esto funciona mejor? Creo que es porque el vector de estado inicial se calcula a partir de las ponderaciones de Johansen, que es la ponderación óptima de cointegración (para las ponderaciones estáticas), y también lo es el "verdadero" valor de la expectativa. En cualquier caso, voy con lo que funciona mejor. Utilice su propio juicio en esto.

Notas de aplicación

Si se utiliza la matriz de transición de estados, $\alpha$ En el caso de la predicción de estado, derivada de mi primer post, necesitas utilizar las ecuaciones correctas de predicción de estado y de covarianza de estado en tu filtro de Kalman. La ecuación de predicción de estado debe ser: $$\beta_t=\alpha\cdot\beta_{t-1}$$ y la ecuación de predicción de la covarianza del estado debe ser: $$\text{cov}(\beta_t)=\alpha\cdot \text{cov}(\beta_{t-1})\cdot \alpha^T\;+\;\nu_\omega$$ donde $\nu_\omega$ es el $k \times k$ matriz de covarianza del ruido de estado.

Además, todos los $k\times k$ matrices, $\alpha$ , $\text{cov}(\beta(0))$ , $\nu_\omega$ , $\Gamma$ debe ser diagonalizado, es decir, todos los elementos fuera de la diagonal deben ser puestos a cero.

Actualmente, estoy utilizando unas 2000 iteraciones del filtro de Kalman para mi cartera de ETFs de trillizos para establecer valores fijos para todas las cantidades. Esto lleva aproximadamente 1 minuto, pero sólo lo hago una vez a la semana, y utilizo las ponderaciones dinámicas que he obtenido de este procedimiento para operar durante la semana. La ventaja es que obtengo una cartera altamente estacionaria, $y_{\text{port}}$ .

Para mostrar el efecto del filtro de Kalman, he aquí la cartera ponderada utilizando las ponderaciones estáticas de Johansen (antes del filtro de Kalman):

Static Johansen Weights

Aquí está la misma cartera, pero utilizando las ponderaciones dinámicas de la cartera del filtro de Kalman:

enter image description here

Eso es mucho ¡más papelería!

Seguiré revisando al menos una vez al día, durante un tiempo, e intentaré responder a las preguntas que puedan surgir. Agradezco cualquier comentario.

0 votos

Agradezco la descripción detallada de su sintonía para el filtro Kalman. Me gustaría mucho ver cómo inicializas el vector de estado y la matriz de covarianza del estado.

0 votos

¿Podría fusionar esto en una sola respuesta?

0 votos

@Bob Jansen: Las respuestas son algo largas. No sería más fácil para el lector leerlas por separado?

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X