如何让Pandas EWMA计算结果匹配在线EWMA计算器?
指数移动平均(EMA)计算结果差异问题
问题描述
我的Python代码如下:
import pandas as pd df = pd.DataFrame({'values': [345,373,373,359,376,376,413,383,467,464,540,628,545,631,617,607,590,576,565,617]}) ewm = df['values'].ewm(span=7, adjust=False).mean() ewm
运行结果:
0 345.000000 1 352.000000 2 357.250000 3 357.687500 4 362.265625 5 365.699219 6 377.524414 7 378.893311 8 400.919983 9 416.689987 10 447.517490 11 492.638118 12 505.728588 13 537.046441 14 557.034831 15 569.526123 16 574.644592 17 574.983444 18 572.487583 19 583.615687
但使用相同输入值和周期(span=7)的在线计算器给出结果:
363.667,366,367.75,365.563,368.172,370.129,380.847,381.385,402.789,418.092,448.569,493.427,506.32,537.49,557.367,569.776,574.832,575.124
请问为何结果存在差异?如何修改代码使其结果与在线计算器匹配?
解答
差异原因
Pandas的ewm方法与在线计算器的结果差异,核心源于两点:
- 初始值计算逻辑不同:
- Pandas默认将第一个原始数据作为EMA的初始值,从第二个数据开始按递推公式计算。
- 多数在线计算器会先计算前
span个数据的**简单移动平均(SMA)**作为EMA的初始值,再从第span+1个数据开始计算后续EMA。
- 平滑系数α的定义差异:
- Pandas中
span=N对应的平滑系数为α=2/(N+1),这是EMA的标准递推系数。 - 部分在线工具可能使用
α=1/N作为平滑系数,或者对系数的计算逻辑有特殊定义。
- Pandas中
匹配在线计算器的代码修改
假设在线计算器采用「前span个数据的SMA作为初始值,使用α=2/(span+1)递推」的逻辑,可按以下代码修改:
import pandas as pd import numpy as np df = pd.DataFrame({'values': [345,373,373,359,376,376,413,383,467,464,540,628,545,631,617,607,590,576,565,617]}) span = 7 alpha = 2 / (span + 1) # 计算初始EMA:前span个值的简单移动平均 initial_ema = df['values'].iloc[:span].mean() # 初始化EMA序列,前span-1个位置为NaN,第span个位置设为初始值 ema_series = pd.Series([np.nan] * len(df)) ema_series.iloc[span-1] = initial_ema # 从第span+1个数据开始递推计算EMA for i in range(span, len(df)): ema_series.iloc[i] = alpha * df['values'].iloc[i] + (1 - alpha) * ema_series.iloc[i-1] # 输出保留三位小数的结果,与在线计算器格式对齐 print(ema_series.dropna().round(3))
如果上述代码仍不匹配,可尝试调整初始值的计算范围(比如前3个数据的SMA)或修改α的取值(如alpha=1/span),直到结果与在线计算器一致。
内容的提问来源于stack exchange,提问作者Ray Zhang
相关产品推荐
相关产品推荐

