如果给出最后已知的电子邮件,如何反向设计指数移动平均线

时间:2017-08-15 02:09:23

标签: python math logic moving-average

考虑到最后一次已知的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

在做了一些研究后,我猜测可能是由于在大量数据点上执行此类计算时出现浮点精度错误。

1 个答案:

答案 0 :(得分:2)

根本问题是你的数学不稳定。

今后,每个步骤将EMAmultiplier之间的0相乘1。这意味着任何给定的Close的影响会以指数方式消失(因此名称​​指数移动平均线)。

但是,当向后移动时,每个步骤EMA除以multiplierparams.require(:rss).map do |p| p.permit(:rss, :type) end 。这意味着任何给定数据点的影响都会以指数方式增加,而不是消失。

如果你的数学是完美的,并且你得到了所有数字,那就不重要了。但是,所有浮点误差以指数方式放大,因此重复放大的噪声将很快超出您的信号。

没有简单的方法来解决这个问题。最明显的尝试是尝试向前而不是向后,但是不清楚这是否与你的目标相符。