14. 统计套利进阶:卡尔曼滤波动态估计基差,适应市场结构变化
各位同学,欢迎来到第十四讲。
前面我们讲了很多关于基差交易的基础逻辑,比如用历史均值、滚动窗口来估计基差的合理区间。但说实话,这些方法在真实交易中,我吃过不少亏。为什么?因为市场结构是会变的。
举个例子,2015年股灾前后,股指期货的基差结构发生了根本性变化。如果你还用过去半年的均值去套,那结果就是——反复止损,反复被打脸。
所以这一讲,我们来聊一个更高级的工具:卡尔曼滤波。它能动态估计基差,实时适应市场的变化。
为什么需要动态估计?
传统的统计套利,通常假设基差是平稳的,均值回归的。但现实是,基差的均值和波动率都会随时间变化。
我遇到过这样的情况:一个品种的基差,上半年均值是20个点,下半年变成了-10个点。如果你用固定阈值去开仓,上半年赚钱的策略,下半年全亏回去。
卡尔曼滤波解决的就是这个问题。它像一个“自适应滤波器”,不断根据新数据修正对基差状态的估计。
核心思想:卡尔曼滤波把基差看作一个“隐藏状态”,我们观测到的价格差是带噪声的测量值。通过预测-更新两步走,实时追踪基差的真实水平。
卡尔曼滤波的数学直觉
我不打算堆公式,咱们用大白话讲清楚。
卡尔曼滤波就两个步骤:
- 预测:根据上一时刻的状态,预测当前时刻的状态。比如,基差昨天是10,我猜今天大概还是10左右,但不确定性会变大。
- 更新:拿到今天的实际观测值后,结合预测值和观测值,算出一个最优估计。说白了,就是“信预测多一点,还是信观测多一点”。
这个“信多少”由卡尔曼增益决定。当观测噪声大时,我更相信预测;当预测不准时,我更相信观测。
嗯,这里要注意:卡尔曼增益是动态计算的,所以它能自适应市场的变化。
Python实现:卡尔曼滤波估计基差
下面我给出一个完整的实现。这个代码我在实盘里用过,效果还不错。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
class KalmanFilterBasis:
"""卡尔曼滤波基差估计器"""
def __init__(self, delta=0.001, R=0.01, Q=0.001):
"""
delta: 状态转移矩阵的缩放因子
R: 观测噪声协方差
Q: 过程噪声协方差
"""
self.delta = delta
self.R = R
self.Q = Q
# 初始状态
self.x = 0.0 # 基差估计值
self.P = 1.0 # 估计误差协方差
def update(self, observation):
"""
卡尔曼滤波更新步骤
observation: 当前观测到的基差值
"""
# 预测步骤
self.x = self.delta * self.x
self.P = self.delta * self.P * self.delta + self.Q
# 更新步骤
K = self.P / (self.P + self.R) # 卡尔曼增益
self.x = self.x + K * (observation - self.x)
self.P = (1 - K) * self.P
return self.x
# 模拟基差数据:前一半均值10,后一半均值-5
np.random.seed(42)
n = 200
basis = np.concatenate([
10 + np.random.randn(100) * 2,
-5 + np.random.randn(100) * 2
])
# 应用卡尔曼滤波
kf = KalmanFilterBasis(delta=0.999, R=0.5, Q=0.01)
estimates = []
for obs in basis:
est = kf.update(obs)
estimates.append(est)
# 可视化
plt.figure(figsize=(12, 6))
plt.plot(basis, label='观测基差', alpha=0.6)
plt.plot(estimates, label='卡尔曼滤波估计', linewidth=2)
plt.axvline(x=100, color='red', linestyle='--', label='市场结构变化点')
plt.legend()
plt.title('卡尔曼滤波动态估计基差')
plt.show()
参数调优建议:
R(观测噪声):设得越大,滤波结果越平滑,但反应越慢Q(过程噪声):设得越大,滤波结果越灵敏,但容易受噪声干扰- 我个人习惯先用历史数据做网格搜索,找到最优参数组合
卡尔曼滤波 vs 滚动窗口均值
咱们做个对比,你就知道为什么卡尔曼滤波更好了。
| 方法 | 优点 | 缺点 |
|---|---|---|
| 滚动窗口均值 | 简单直观,计算快 | 窗口大小难选,对突变反应迟钝 |
| 卡尔曼滤波 | 自适应,实时更新,对结构变化敏感 | 需要调参,理解门槛稍高 |
我曾经用滚动窗口做回测,看起来曲线很漂亮。结果一上实盘,市场风格一变,直接回撤20%。后来换成卡尔曼滤波,虽然参数调了一周,但实盘表现稳定多了。
实战中的避坑指南
我曾经踩过的坑:
- 参数过拟合:用历史数据调出的最优参数,在未来可能失效。建议定期重新校准。
- 初始值敏感:卡尔曼滤波对初始状态和初始协方差敏感。我一般用前50个观测值的均值和方差做初始化。
- 高频数据慎用:如果你做tick级别的基差交易,卡尔曼滤波的计算延迟可能成为问题。建议用1分钟或5分钟数据。
知识体系总览
下面这张图,帮你理清卡尔曼滤波在基差交易中的位置。
总结一下
卡尔曼滤波不是银弹,但它确实比固定窗口的方法更适应市场变化。你想想看,市场每天都在变,凭什么你的模型参数可以一成不变?
我个人建议,把卡尔曼滤波作为基差估计的“默认选项”。先用它跑一段时间,积累足够的数据后,再考虑加入更复杂的模型,比如粒子滤波或者深度学习。
好了,这一讲就到这里。记住:动态适应,才是统计套利的进阶之道。