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

使用Pandas计算EMA(ewma)结果与预期不符的技术问询

解决Pandas EMA与Stockcharts示例结果不符的问题

我之前切换到Pandas实现EMA时也踩过这个坑!问题出在Pandas默认的EWM计算逻辑和Stockcharts使用的标准EMA公式不完全一致,尤其是初始值的处理和加权方式。

核心差异点

Stockcharts的10日EMA遵循标准递归公式:

  1. 第一个EMA值为前10天收盘价的简单移动平均(SMA)
  2. 后续每日EMA = (当日收盘价 × 权重系数) + (前一日EMA × (1 - 权重系数)),其中权重系数 = 2/(周期数+1) = 2/11 ≈ 0.1818

而Pandas的ewm()方法默认行为:

  • 当adjust=True(默认)时,使用的是加权平均公式(不是递归式)
  • 当adjust=False时,虽然用递归式,但初始值直接取第一个数据点,而非周期内的SMA

修正后的Pandas实现代码

假设你的DataFrame是df,收盘价列名为Close,以下代码可以完全匹配Stockcharts的10日EMA结果:

import pandas as pd

# 定义周期
ema_period = 10
alpha = 2 / (ema_period + 1)

# 步骤1:计算前10天的SMA作为EMA初始值
df['SMA_10'] = df['Close'].rolling(window=ema_period).mean()

# 步骤2:用递归式计算EMA(adjust=False)
df['EMA_10'] = df['Close'].ewm(alpha=alpha, adjust=False).mean()

# 步骤3:替换第一个EMA值为对应周期的SMA
# 找到第一个非空的SMA行索引(即第9行,索引从0开始)
first_ema_idx = df['SMA_10'].first_valid_index()
df.loc[first_ema_idx, 'EMA_10'] = df.loc[first_ema_idx, 'SMA_10']

# 可选:把初始周期前的EMA值设为NaN(和Stockcharts展示一致)
df['EMA_10'] = df['EMA_10'].mask(df.index < first_ema_idx)

验证方法

你可以拿Stockcharts示例里的具体数据(比如他们用的IBM收盘价序列)代入测试:

  1. 取前10天的收盘价计算SMA,作为第一个EMA值
  2. 用递归公式手动计算下一日的EMA,和Pandas输出对比
  3. 两者结果应该完全一致(误差在浮点精度范围内)

如果还是有差异,检查一下是否处理了缺失值,或者是否在计算时包含了非交易日的数据——Stockcharts通常只用交易日的收盘价计算,确保你的数据集和网站示例的时间范围、数据点完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:30:22