考虑到最新的EMA,我一直在尝试扭转一系列EMA。这应该能够通过对指数移动平均方程的简单算术操作来完成:
Multiplier= (2 / (Time periods + 1) )
EMA = {Close - EMA(previous day)} x multiplier + EMA(previous day)
这给了我:
EMA(previous day) = (EMA(Today) - Close * multiplier)/(1 - multiplier)
因此,我定义的以下函数如下:
def ema(df, last_ma ,period):
ema = [last_ma]
k = 2/(period+1)
for i in range(len(df)-1,0,-1):
prev_ema = (last_ma - df['Close'][i] * k)/(1-k)
print(last_ma, df['Close'][i], prev_ema)
last_ma = prev_ema
ema.append(prev_ema)
ema.reverse()
return ema
问题在于,附加到列表
EMA
的值越来越大,最终达到无穷大。数据集没有错,所以我猜代码的逻辑出了点问题,但是我不知道为什么。任何帮助将不胜感激。谢谢。下面的链接是我要处理的数据,我使用的最后一个已知EMA编号是-23628.2,它是200周期的指数移动平均线。
https://drive.google.com/open?id=0Byc-aSwZI5OFd1ZWVEgxNUI5Xzg
经过研究后,我猜测这可能是由于对大量数据点进行此类计算时的浮点精度误差所致。
最佳答案
根本的问题是您的数学不稳定。
前进时,每个步骤都将前一个EMA
乘以multiplier
和0
之间的1
。这意味着任何给定Close
的影响都将以指数形式消失(因此名称为指数移动平均线)。
但是,向后移动时,每个步骤都将以下EMA
除以multiplier
。这意味着任何给定数据点的影响都呈指数增长,而不是消亡。
如果您的数学很完美,并且所有数字都正确,那就没关系了。但是,所有浮点误差也会以指数方式放大,因此反复放大的噪声将迅速超出信号范围。
没有简单的方法可以解决此问题。要尝试的最明显的方法是尝试前进而不是后退,但是尚不清楚这是否与您的目标兼容。