追踪看不见的东西
状态空间模型把真实的东西和测量到的东西分开。隐藏状态 μt(例如真实的波动率水平)自己演变,观测到的是该状态加噪声。局部水平模型为 yt=μt+εt,εt∼N(0,r),μt=μt−1+ηt,ηt∼N(0,q)。观测方差 r 表示读数有多嘈杂,水平方差 q 表示真实值漂移得多快。statsmodels 里的 UnobservedComponents(y, 'llevel') 拟合该模型,并用极大似然估计 q 和 r,无需自己猜。
卡尔曼滤波把每个新读数变成更新后的信念,分两步。预测:均值不变,不确定性增大,P−=P+q。更新:增益 K=P−/(P−+r) 决定相信多少“意外” y−a,新均值为 a+K(y−a),新不确定性为 (1−K)P−。读数缺失时只做预测步。滤波只用到今天为止的数据,平滑则利用整个样本回看,给出每个过去状态的最佳估计。
P−=P+q,K=P−+rP−,a′=a+K(y−a),P′=(1−K)P−(1) 三个月的手算从信念
a=10、
P=4 开始,取
q=1、
r=5。第一个月:
P−=5,
K=5/10=0.5,读数
12 得
a=10+0.5⋅2=11,
P=0.5⋅5=2.5。第二个月:
P−=3.5,
K=3.5/8.5=0.4118,读数
9 的意外为
−2,所以
a=11−0.4118⋅2=10.18,
P=0.5882⋅3.5=2.06。第三个月没有读数:只做预测步,
a 保持
10.18,
P 增至
2.06+1=3.06。看真实数据:取 2005 年 2 月以来
259 个月 SPY 年化已实现波动率的对数。极大似然得
r^=0.0889、
q^=0.0449,所以
q/r=0.50,稳态增益为
K=0.50:每个新月份把波动率估计向最新读数移动一半。这恰好是一个 ARIMA(0,1,1),移动平均系数为
−0.498=−(1−K),对数似然同为
−151.09。样本末尾,滤波后的水平为年化
12.4%,最后读数为
11.7%,对数标准误为
0.21,因此 95% 区间约为
8% 到
19%。
滤波还是平滑凡是当时可能已知的用途(如交易规则或回测)都应使用滤波估计。平滑估计用到了未来数据,只能用来描述过去。
实验:评分内容
- 预测方差10 分
- 卡尔曼增益15 分
- 更新后的均值15 分
- 更新后的方差10 分
- 下个月的增益15 分
- 缺失的读数10 分
- 信噪比25 分