考虑到最后一次已知的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
在做了一些研究后,我猜测可能是由于在大量数据点上执行此类计算时出现浮点精度错误。
答案 0 :(得分:2)
根本问题是你的数学不稳定。
今后,每个步骤将EMA
与multiplier
之间的0
相乘1
。这意味着任何给定的Close
的影响会以指数方式消失(因此名称指数移动平均线)。
但是,当向后移动时,每个步骤将EMA
除以multiplier
。params.require(:rss).map do |p|
p.permit(:rss, :type)
end
。这意味着任何给定数据点的影响都会以指数方式增加,而不是消失。
如果你的数学是完美的,并且你得到了所有数字,那就不重要了。但是,所有浮点误差也以指数方式放大,因此重复放大的噪声将很快超出您的信号。
没有简单的方法来解决这个问题。最明显的尝试是尝试向前而不是向后,但是不清楚这是否与你的目标相符。