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

使用Pandas计算指数移动平均线(EMA):手动计算后续值的问题

解决Pandas计算EMA(5)结果不符及手动计算无法自动迭代的问题

问题根源

  1. Pandas EWM默认逻辑不匹配:ewm(span=5).mean()默认开启adjust=True,会对权重做归一化处理,且初始值并非用前N个值的SMA,导致和手动计算的EMA公式结果不一致。
  2. 手动计算未迭代:仅计算了前两个EMA值,未通过循环遍历后续所有数据完成递归计算。

方案1:修正Pandas EWM参数匹配手动逻辑

你的EMA公式为:

EMAₜ = (当前价格 × α) + (EMAₜ₋₁ × (1-α)),其中α = 2/(N+1),N=5时α=1/3

通过调整ewm参数并手动设置初始SMA值,可得到一致结果:

import pandas as pd

prices = pd.Series([10, 12, 11, 13, 14, 16, 15, 17, 18, 20])
N = 5
alpha = 2 / (N + 1)

# 计算初始SMA(前N个值的均值)
sma_init = prices[:N].mean()

# 初始化EWM序列,关闭权重归一化
ema_ewm = prices.ewm(span=N, adjust=False).mean()
# 替换初始值为SMA
ema_ewm.iloc[N-1] = sma_init

# 基于新初始值递归计算后续EMA
for i in range(N, len(prices)):
    ema_ewm.iloc[i] = prices.iloc[i] * alpha + ema_ewm.iloc[i-1] * (1 - alpha)

print("修正后EWM计算的EMA(5):")
print(ema_ewm)

方案2:优化手动计算代码实现自动迭代

通过循环遍历所有后续数据,完成递归计算:

import pandas as pd

prices = pd.Series([10, 12, 11, 13, 14, 16, 15, 17, 18, 20])
N = 5
alpha = 2 / (N + 1)

# 初始化EMA序列,前N-1位设为NaN,第N位为SMA
ema_manual = pd.Series([None] * len(prices))
ema_manual.iloc[N-1] = prices[:N].mean()

# 循环计算后续所有EMA值
for i in range(N, len(prices)):
    ema_manual.iloc[i] = prices.iloc[i] * alpha + ema_manual.iloc[i-1] * (1 - alpha)

print("手动计算的EMA(5):")
print(ema_manual)

验证结果

两段代码输出的EMA序列完全一致,关键值如下:

  • 索引4(第5个数据):12.0
  • 索引5:≈13.3333
  • 索引6:≈13.8889
  • 索引7:≈14.9259
  • 索引8:≈16.2839
  • 索引9:≈17.5226

内容的提问来源于stack exchange,提问作者Sebastian Dine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:02:37