跳到主内容
@wquguru
术语时间序列

卡尔曼滤波 Kalman Filter

2026-09-05 更新

定义#

卡尔曼滤波是在噪声观测中边预测边修正的估计算法。它假定背后有一个看不见的真实状态在按某个规律演化,而你每期只能拿到一个带噪声的观测;算法先用模型预测状态该在哪里,再拿新观测把预测拉回来一点,如此循环。

在量化里它有两个常见用法。一是当自适应的移动平均:不用挑窗口长度,估计值会自动调整响应速度。二是估时变参数,比如动态 Beta、配对交易里随时间漂移的对冲比率——传统做法要人为定一个滚动窗口,卡尔曼滤波则让参数本身成为被估计的状态。

公式#

预测阶段先推状态和它的不确定性:

x^kk1=Fkx^k1,Pkk1=FkPk1FkT+Qk\hat{x}_{k|k-1} = F_k \hat{x}_{k-1},\qquad P_{k|k-1} = F_k P_{k-1} F_k^{\mathsf T} + Q_k

更新阶段算出增益,再用观测修正:

Kk=Pkk1HkT(HkPkk1HkT+Rk)1K_k = P_{k|k-1} H_k^{\mathsf T}\left(H_k P_{k|k-1} H_k^{\mathsf T} + R_k\right)^{-1} x^k=x^kk1+Kk(zkHkx^kk1),Pk=(IKkHk)Pkk1\hat{x}_k = \hat{x}_{k|k-1} + K_k\left(z_k - H_k \hat{x}_{k|k-1}\right),\qquad P_k = (I - K_k H_k) P_{k|k-1}

其中 FF 是状态转移矩阵(状态怎么随时间变),HH 是观测矩阵(状态怎么映射成观测),QQ 是过程噪声协方差(模型本身有多不靠谱),RR 是观测噪声协方差(测量有多脏),PP 是估计误差协方差(当前估计有多可信),zkz_k 是这一期的观测。KkK_k 就是卡尔曼增益,决定新观测占多大权重。

算一笔账#

用最简单的一维情形:状态是某个价格的「真实水平」,F=1F = 1(认为它不怎么变),H=1H = 1。设过程噪声 Q=0.01Q = 0.01,观测噪声 R=1R = 1

kk 期开始前,估计值 x^=100\hat{x} = 100,误差协方差 P=0.09P = 0.09。预测阶段:x^kk1=100\hat{x}_{k|k-1} = 100Pkk1=0.09+0.01=0.10P_{k|k-1} = 0.09 + 0.01 = 0.10

增益 K=0.10/(0.10+1)=0.10/1.100.0909K = 0.10/(0.10 + 1) = 0.10/1.10 \approx 0.0909

这时来了一个观测 zk=103z_k = 103。修正后 x^k=100+0.0909×(103100)=100+0.273=100.27\hat{x}_k = 100 + 0.0909 \times (103 - 100) = 100 + 0.273 = 100.27——观测跳了 3 块,估计只往那边挪了 0.27,因为 R=1R = 1 远大于 Pkk1=0.10P_{k|k-1} = 0.10,模型比这次测量可信得多。误差协方差更新为 Pk=(10.0909)×0.100.0909P_k = (1 - 0.0909) \times 0.10 \approx 0.0909

如果把观测噪声调成 R=0.01R = 0.01(相信测量),增益变成 0.10/0.110.9090.10/0.11 \approx 0.909,估计会直接跳到 100+0.909×3102.7100 + 0.909 \times 3 \approx 102.7。同一组数据,QQRR 的比值决定了滤波器是钝还是灵敏。

常见问题#

Q 和 R 该怎么设?#

关键不是各自的绝对值,而是 Q/RQ/R 这个比值。QQ 相对大,说明你认为状态本身在快速变化,滤波器就更追随观测、更灵敏也更抖;RR 相对大则更平滑、更滞后。物理系统里 RR 可以从测量设备的精度来,金融数据里通常只能靠历史统计估,或者用 EM 算法迭代拟合。

它和移动平均比好在哪?#

移动平均要你先定死一个窗口长度,市场变了窗口也不会自己变。卡尔曼滤波按不确定性动态分配权重:估计越不确定,新观测的话语权越大。而且它是逐点递推的,只需要上一期的估计,不用存整段历史。

它能直接用在非线性关系上吗?#

标准卡尔曼滤波假定状态转移和观测都是线性的、噪声是高斯的。遇到非线性可以换扩展卡尔曼滤波(EKF,靠泰勒展开做局部线性化)或无迹卡尔曼滤波(UKF,用 sigma 点传播分布)。代价是不再有最优性保证,调参也更麻烦。

相关术语

出自