EWMA 协方差 RiskMetrics:用指数衰减权重让风险估计跟上市场
等权滚动窗口把 252 天前的旧数据和昨天的数据一视同仁:相关性 regime 从 0.3 跳到 0.8(危机来临)后,252 天滚动相关要 234 天才收敛到位,EWMA λ=0.94 只要 18 天。RiskMetrics(1996)的全部秘密是一行递推:σ²_t = λσ²_{t-1} + (1−λ)r²_{t-1},λ=0.94 对应 11 天半衰期、约 32 天有效样本。GARCH 市场实测 1% VaR 击穿率:EWMA 1.40% vs 滚动窗口 1.67%,且滚动窗口的击穿集中在波动率抬升年份——最需要它的时候它最迟钝。但诚实的另一面:20 资产最小方差组合 OOS 波动率,EWMA λ=0.94(16.0%)反而输给滚动 252 天(12.9%)——有效样本 32 天喂 20 维协方差矩阵是灾难,EWMA 解决的是时效性不是维度诅咒,高维要么升 λ 要么叠加收缩(中阶)。
前几篇我们讲了协方差怎么收缩、噪声特征值怎么剪,都是在解决采样误差——数据不够、维度太高。但协方差还有另一个完全独立的敌人:时变性。市场波动率不是常数,相关性会在危机里齐刷刷跳升,而教科书默认的等权滚动窗口对此的反应速度,用一个词形容就是:迟钝。
先上本文实验里最扎眼的数字。两资产市场、相关系数从 0.3 跳到 0.8(模拟危机传染),估计器收敛到新相关值 90% 所需的天数:
| 估计器 | 收敛天数 |
|---|---|
| EWMA λ=0.94 | 18 天 |
| 252 天滚动窗口 | 234 天 |
滚动窗口需要把窗口里的旧数据几乎全部换血才能承认世界变了——将近一年。这一年里你的风险模型报告的相关性、VaR、组合波动率全是过时的。EWMA(指数加权移动平均)用一个参数 λ 解决这个问题,这就是 J.P. Morgan RiskMetrics(1996)留给行业最持久的遗产。
![]()
一行递推公式#
EWMA 方差估计只有一行:
协方差同理,把 换成两资产收益的乘积。展开递推式可以看到它本质是对历史平方收益做指数衰减加权:滞后 天的观测拿到权重 。滚动窗口是”窗口内等权、窗口外清零”的阶梯函数;EWMA 是平滑衰减,昨天的信息永远比前天重要。
import numpy as np
def ewma_cov(x, y, lam=0.94):
"""EWMA 协方差递推。x, y 为日收益序列(去均值可省略,日频均值≈0)"""
n = len(x)
cov = np.zeros(n)
cov[0] = x[0] * y[0]
for t in range(1, n):
cov[t] = lam * cov[t-1] + (1 - lam) * x[t] * y[t]
return cov
# N 资产协方差矩阵版本:S_t = λ S_{t-1} + (1-λ) r_{t-1} r_{t-1}^T
def ewma_cov_matrix(R, lam=0.94):
T, N = R.shape
S = np.cov(R[:60].T) # 用一小段样本协方差初始化
for t in range(60, T):
x = R[t][:, None]
S = lam * S + (1 - lam) * (x @ x.T)
return Spython注意矩阵版本的一个好性质:每天的更新 是秩 1 半正定矩阵,λ 加权和保持半正定——EWMA 协方差矩阵天然不会出现负特征值,这比很多修补样本协方差的方法省心。
λ 是唯一的旋钮:半衰期与有效样本量#
λ 控制记忆长度,两个换算公式值得记住:
- 半衰期:。λ=0.94 → 11.2 天;λ=0.97 → 22.8 天
- 有效样本量:。λ=0.94 → 约 32 天;λ=0.97 → 66 天

RiskMetrics 的经典取值是日频 λ=0.94、月频 λ=0.97,这不是理论推导,是当年在几百个资产上最小化方差预测误差的经验优化结果。它隐含的判断是:日频波动率的可预测结构大约只有两三周的记忆——和 GARCH(1,1) 在多数市场估出的 α+β≈0.98(对应类似衰减速度)互相印证。事实上 EWMA 就是 GARCH(1,1) 取 ω=0、α+β=1 的退化特例:不均值回复、不收敛到长期方差,永远跟着最近的市场走。
VaR 回测:迟钝的代价#
用 GARCH 生成的十年日收益(波动聚集是真实的),每天用前一天的波动率估计预测 1% VaR,统计击穿率:
| 估计器 | 1% VaR 击穿率 |
|---|---|
| 真实 σ(上帝视角) | 1.44%(采样噪声) |
| EWMA λ=0.94 | 1.40% |
| 252 天滚动窗口 | 1.67% |
整体差 0.27 个百分点看着不大,但分年度看就露馅了:滚动窗口的击穿集中在波动率抬升的年份——波动率涨了它还拿着一年前的低波动数据算 VaR,于是连环击穿;等它终于追上来,波动率又回落了,它又开始高估风险、浪费风险预算。风险估计的滞后不是均匀分布的误差,是顺周期的系统性错误:最需要风控收紧的时候它最松。

诚实的另一面:EWMA 不解决维度诅咒#
到这里 EWMA 看起来全面碾压,但把它喂给组合优化器试试。20 资产(单因子结构 + GARCH 共同波动、相关结构恒定)、月度再平衡最小方差组合、八年样本外:
| 协方差估计器 | OOS 年化波动率 |
|---|---|
| EWMA λ=0.94 | 16.0%(最差) |
| EWMA λ=0.97 | 14.2% |
| 滚动 252 天样本协方差 | 12.9% |
| 全历史样本协方差 | 12.5%(最好) |

排序完全反过来了。原因不复杂:λ=0.94 的有效样本量只有 32 天,拿 32 天的信息去估 20×20=210 个协方差参数,等效于 T/N≈1.6 的极端样本匮乏——前面讲过这正是优化器误差最大化的重灾区。而这个模拟市场的相关结构是恒定的,时效性毫无价值,等权长窗口的低方差估计完胜。
这个对照实验说清楚了 EWMA 的定位:它解决时效性,不解决维度诅咒,两者还互相冲突——λ 越小追得越快,有效样本越少、矩阵越噪。工程上的调和方案:
- 一维风险度量(单资产 VaR、波动率目标)用小 λ:只估一个参数,32 天样本足够,时效性收益全拿;
- 高维协方差用大 λ 或直接叠加收缩:先 EWMA 更新、再 Ledoit-Wolf 收缩,或者用 DCC-GARCH 把波动率(各自 GARCH,追得快)和相关性(缓慢演化)拆开建模——相关性本来就比波动率稳定得多;
- 检查 N_eff 对 N 的比值: 就该警惕,这是和滚动窗口 T/N 完全同源的判据。
实现细节与坑#
初始化:递推需要 。用前 60 天样本方差初始化,然后烧掉(burn-in)约 3 个半衰期再开始使用输出,初始化误差衰减到 以下。直接拿第一天的 初始化会让前两个月的估计随机漂移。
去均值:日频收益均值约 0.03%,平方后对方差贡献不足 1%,RiskMetrics 直接假设均值为零。周频以上建议老实减均值。
相关系数要用同一 λ:分子协方差和分母两个方差必须用相同 λ 递推,否则相关系数可能跑出 [−1, 1]。
λ 不要拿收益率数据调优:用波动率预测误差(如 QLIKE 损失)调,拿组合收益调 λ 就是把风险模型变成了另一个过拟合的 alpha 模型。
结语#
EWMA 是风险建模里性价比最高的一行代码:零参数估计(λ 是约定不是估计)、天然半正定、对波动聚集的响应速度接近 GARCH。它的边界同样清晰——有效样本量 32 天的估计器不该被塞进高维优化器。下次看到风险系统里同时存在”日频 λ=0.94 算 VaR”和”月度协方差矩阵做配置”,不要以为是不一致,那是各干各的活。
参考文献#
- J.P. Morgan/Reuters (1996). RiskMetrics — Technical Document (4th ed.).
- Engle, R. (2002). Dynamic Conditional Correlation. Journal of Business & Economic Statistics, 20(3).
- Patton, A. (2011). Volatility Forecast Comparison Using Imperfect Volatility Proxies. Journal of Econometrics, 160(1).