咨询pandas中EWMA计算结果与手动推导不符的原因
Pandas EWM计算结果与手动公式的差异分析
核心差异来源
你手动使用的是递归式未调整EWMA公式,但Pandas的ewm().mean()默认启用了调整式EWMA(adjust=True),两者的计算逻辑完全不同。
1. Pandas默认的调整式EWMA逻辑
当adjust=True(默认值)时,EWMA的计算是对所有历史数据做加权求和后归一化:
y[t] = (x[t] + (1-α)*x[t-1] + (1-α)²*x[t-2] + ... + (1-α)^t*x[0]) / (1 + (1-α) + (1-α)² + ... + (1-α)^t)
其中α = 2/(span+1),这里span=2,所以α=2/3,1-α=1/3。
2. 手动验证Pandas的计算结果
用调整式公式重新计算,完全匹配Pandas输出:
- t=0:
y[0] = x[0] = 17.39 - t=1:
(8.7 + (1/3)*17.39) / (1 + 1/3) = (8.7 + 5.7967) / 1.3333 ≈ 10.87 - t=2:
(2.9 + (1/3)*8.7 + (1/3)²*17.39) / (1 + 1/3 + (1/3)²) ≈ (2.9+2.9+1.932) / 1.4444 ≈5.35 - t=3:
(1.45 + (1/3)*2.9 + (1/3)²*8.7 + (1/3)³*17.39) / (1 + 1/3 + 1/9 +1/27) ≈4.0274/1.4815≈2.71 - t=4:
(1.45 + (1/3)*1.45 + (1/3)²*2.9 + (1/3)³*8.7 + (1/3)^4*17.39) / (1+1/3+1/9+1/27+1/81)≈2.7924/1.4938≈1.86
3. 你的错误点
你使用的是递归式未调整EWMA的公式:y[t] = (1-α)*y[t-1] + α*x[t],这对应Pandas中adjust=False的设置。如果想要让Pandas输出和你的手动计算一致,只需显式关闭调整:
x.ewm(span=2, adjust=False).mean()
此时结果为:17.39, 11.59, 5.55, 2.75, 1.95,和你的手动计算完全匹配。
总结
- Pandas默认
adjust=True:对所有历史数据的加权和做归一化,保证权重总和为1 - 你的手动公式对应
adjust=False:递归计算,权重随时间指数衰减,不做归一化 - 两者的核心区别在于是否对历史权重做归一化处理
内容的提问来源于stack exchange,提问作者Telis
相关产品推荐
相关产品推荐

