You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas计算EMA(指数移动平均)结果偏差原因及正确实现方法问询

偏差原因

核心差异是初始EMA的计算规则不同:

  • 你手动计算时,取前3个收盘价的算术平均作为第3期的初始EMA值,之后按EMA公式递推
  • pandas的ewm默认从第一个有效观测值开始递推,初始EMA等于第一个收盘价,因此前几期计算结果和手动结果存在偏差,后续递推会放大初始差异

EMA公式参数确认:span=3时,平滑系数alpha=2/(span+1)=0.5,你选择的adjust=False参数是正确的,对应常规的EMA递推公式EMA_t = alpha * close_t + (1-alpha) * EMA_{t-1}。

正确实现代码

要和手动计算结果对齐,需手动指定初始值后递推,示例如下:

import pandas as pd
import numpy as np

# 输入数据
close = [1332.45, 1330.95, 1332.25, 1331.1, 1336.3, 1330.0, 1330.8, 1333.0, 1332.35, 1335.55, 1333.1, 1334.0, 1333.15, 1334.8, 1333.2, 1334.0, 1334.0, 1333.0, 1334.85, 1336.0, 1334.7, 1333.25, 1332.0, 1333.4, 1333.15, 1334.5, 1336.95, 1340.0, 1344.7, 1344.5, 1348.15, 1345.15, 1346.85, 1346.0, 1343.1, 1341.0, 1340.0, 1341.0, 1343.8, 1343.4, 1343.0, 1342.1, 1340.5, 1342.4, 1341.7, 1340.25, 1340.3, 1341.0, 1340.5, 1340.5]
df = pd.DataFrame({'close': close})

span = 3
min_periods = 3
alpha = 2 / (span + 1)

# 初始化EMA序列
ema = pd.Series(np.nan, index=df.index)
# 设置初始EMA:前min_periods个值的算术平均
ema.iloc[min_periods-1] = df['close'].iloc[:min_periods].mean()

# 递推计算后续EMA
for i in range(min_periods, len(df)):
    ema.iloc[i] = alpha * df['close'].iloc[i] + (1 - alpha) * ema.iloc[i-1]

# 输出结果和你手动计算的actual_ema完全一致

内容的提问来源于stack exchange,提问作者Dr.PB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 10:27:02