Dow JonesS&P 500
6. Backtesting riguroso, filtrado y el mapa de herramientas libres · Lección 13 de 14

El filtro de Kalman: actualizar una estimación con matrices

¿Por qué y cuándo se usa esto? Se usa cuando quieres estimar algo que no puedes observar directamente (la "verdadera" tendencia o beta de un activo) a partir de datos ruidosos, y quieres que la estimación se actualice sola con cada dato nuevo, sin recalcular todo desde cero.

¿Cómo estimar la "tendencia real" de un activo cuando cada precio observado trae ruido? El filtro de Kalman (versión escalar, para intuición) combina una predicción con una nueva observación, ponderando por qué tan confiable es cada una.

Procedimiento paso a paso (a mano), un ciclo predicción-actualización:

  1. Predicción: tu mejor estimación para "ahora" es la misma que tenías antes (x^t∣t−1=x^t−1\hat x_{t\mid t-1}=\hat x_{t-1}), pero con más incertidumbre acumulada (Pt∣t−1=Pt−1+QP_{t\mid t-1}=P_{t-1}+Q).
  2. Cuando llega la observación nueva ztz_t, calcula la ganancia de Kalman: Kt=Pt∣t−1/(Pt∣t−1+R)K_t=P_{t\mid t-1}/(P_{t\mid t-1}+R) — un número entre 0 y 1.
  3. Actualiza la estimación: súmale a la predicción del paso 1 la "sorpresa" (ztz_t menos lo que predijiste), ponderada por KtK_t.
  4. Actualiza también la incertidumbre: Pt=(1−Kt)Pt∣t−1P_t=(1-K_t)P_{t\mid t-1} — siempre baja después de incorporar un dato nuevo.
  5. Repite desde el paso 1 en el siguiente período, usando x^t\hat x_t y PtP_t como el nuevo punto de partida.

Ahora, en notación formal:

Predicción:

x^t∣t−1=x^t−1Pt∣t−1=Pt−1+Q\hat x_{t\mid t-1} = \hat x_{t-1} \qquad\qquad P_{t\mid t-1} = P_{t-1} + Q

Actualización (ganancia de Kalman):

Kt=Pt∣t−1Pt∣t−1+Rx^t=x^t∣t−1+Kt(zt−x^t∣t−1)Pt=(1−Kt) Pt∣t−1K_t = \frac{P_{t\mid t-1}}{P_{t\mid t-1}+R} \qquad \hat x_t = \hat x_{t\mid t-1} + K_t\left(z_t-\hat x_{t\mid t-1}\right) \qquad P_t = (1-K_t)\,P_{t\mid t-1}

Donde QQ es cuánto "creemos que cambia" el valor real entre períodos, RR es el ruido de la observación, y KtK_t decide cuánto confiar en el dato nuevo vs. en la predicción anterior.

Problema. Estimación previa x^t−1=100\hat x_{t-1}=100, Pt−1=4P_{t-1}=4, Q=0.5Q=0.5, R=2R=2, y llega una nueva observación zt=103z_t=103. Calcula Pt∣t−1P_{t\mid t-1}, KtK_t, x^t\hat x_t y PtP_t.

Solución. Pt∣t−1=4+0.5=4.5P_{t\mid t-1}=4+0.5=4.5. Kt=4.5/(4.5+2)=4.5/6.5≈0.692K_t = 4.5/(4.5+2)=4.5/6.5\approx 0.692. x^t=100+0.692(103−100)=100+2.08=102.08\hat x_t = 100+0.692(103-100) = 100+2.08=102.08. Pt=(1−0.692)(4.5)≈1.385P_t=(1-0.692)(4.5)\approx 1.385 — la nueva estimación quedó más cerca del dato nuevo que de la vieja (porque Kt>0.5K_t>0.5), y la incertidumbre bajó de 4.54.5 a 1.3851.385 gracias a la observación.

Practica tú (resuelve antes de mirar la respuesta). x^t−1=50\hat x_{t-1}=50, Pt−1=2P_{t-1}=2, Q=0.2Q=0.2, R=1R=1, llega zt=53z_t=53. Calcula KtK_t y x^t\hat x_t. Respuesta: Pt∣t−1=2.2P_{t\mid t-1}=2.2, Kt=2.2/3.2≈0.688K_t=2.2/3.2\approx 0.688, x^t=50+0.688(3)≈52.06\hat x_t=50+0.688(3)\approx 52.06.

🔧 En código libre: PyKalman y FilterPy son las dos librerías Python estándar construidas exactamente para esto; statsmodels también incluye un módulo de modelos de espacio de estados basado en Kalman.

📌 Para repasar: Kt=Pt∣t−1Pt∣t−1+RK_t=\dfrac{P_{t\mid t-1}}{P_{t\mid t-1}+R} decide cuánto confiar en el dato nuevo vs. la predicción. KtK_t cerca de 1 = confía en el dato nuevo (poco ruido); cerca de 0 = confía en la predicción (dato muy ruidoso).