卡尔曼滤波是在噪声观测中边预测边修正的估计算法。它假定背后有一个看不见的真实状态在按某个规律演化,而你每期只能拿到一个带噪声的观测;算法先用模型预测状态该在哪里,再拿新观测把预测拉回来一点,如此循环。
在量化里它有两个常见用法。一是当自适应的移动平均:不用挑窗口长度,估计值会自动调整响应速度。二是估时变参数,比如动态 Beta、配对交易里随时间漂移的对冲比率——传统做法要人为定一个滚动窗口,卡尔曼滤波则让参数本身成为被估计的状态。
预测阶段先推状态和它的不确定性:
x^k∣k−1=Fkx^k−1,Pk∣k−1=FkPk−1FkT+Qk
更新阶段算出增益,再用观测修正:
Kk=Pk∣k−1HkT(HkPk∣k−1HkT+Rk)−1
x^k=x^k∣k−1+Kk(zk−Hkx^k∣k−1),Pk=(I−KkHk)Pk∣k−1
其中 F 是状态转移矩阵(状态怎么随时间变),H 是观测矩阵(状态怎么映射成观测),Q 是过程噪声协方差(模型本身有多不靠谱),R 是观测噪声协方差(测量有多脏),P 是估计误差协方差(当前估计有多可信),zk 是这一期的观测。Kk 就是卡尔曼增益,决定新观测占多大权重。
算一笔账#
用最简单的一维情形:状态是某个价格的「真实水平」,F=1(认为它不怎么变),H=1。设过程噪声 Q=0.01,观测噪声 R=1。
第 k 期开始前,估计值 x^=100,误差协方差 P=0.09。预测阶段:x^k∣k−1=100,Pk∣k−1=0.09+0.01=0.10。
增益 K=0.10/(0.10+1)=0.10/1.10≈0.0909。
这时来了一个观测 zk=103。修正后 x^k=100+0.0909×(103−100)=100+0.273=100.27——观测跳了 3 块,估计只往那边挪了 0.27,因为 R=1 远大于 Pk∣k−1=0.10,模型比这次测量可信得多。误差协方差更新为 Pk=(1−0.0909)×0.10≈0.0909。
如果把观测噪声调成 R=0.01(相信测量),增益变成 0.10/0.11≈0.909,估计会直接跳到 100+0.909×3≈102.7。同一组数据,Q 与 R 的比值决定了滤波器是钝还是灵敏。
常见问题#
Q 和 R 该怎么设?#
关键不是各自的绝对值,而是 Q/R 这个比值。Q 相对大,说明你认为状态本身在快速变化,滤波器就更追随观测、更灵敏也更抖;R 相对大则更平滑、更滞后。物理系统里 R 可以从测量设备的精度来,金融数据里通常只能靠历史统计估,或者用 EM 算法迭代拟合。
它和移动平均比好在哪?#
移动平均要你先定死一个窗口长度,市场变了窗口也不会自己变。卡尔曼滤波按不确定性动态分配权重:估计越不确定,新观测的话语权越大。而且它是逐点递推的,只需要上一期的估计,不用存整段历史。
它能直接用在非线性关系上吗?#
标准卡尔曼滤波假定状态转移和观测都是线性的、噪声是高斯的。遇到非线性可以换扩展卡尔曼滤波(EKF,靠泰勒展开做局部线性化)或无迹卡尔曼滤波(UKF,用 sigma 点传播分布)。代价是不再有最优性保证,调参也更麻烦。