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
相关产品推荐
相关产品推荐

