如何在给定最后一个已知 ema 的情况下对指数移动平均线进行逆向工程

How to reverse engineer exponential moving average given the last known ema

我一直在尝试根据最后已知的 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中的值越来越大,最终达到无穷大。数据集没有问题,所以我猜测代码的逻辑有问题,但我不明白为什么。任何帮助将不胜感激。谢谢。

下面的 link 是我希望处理的数据,我使用的最后一个已知 EMA 数字是 -23628.2,它是一个 200 周期指数移动平均线。

https://drive.google.com/open?id=0Byc-aSwZI5OFd1ZWVEgxNUI5Xzg

经过一些研究,我的猜测是,在对大量数据点执行此类计算时可能会出现浮点精度错误。

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

前进时,每一步都将前面的 EMA 乘以 01 之间的 multiplier。这意味着任何给定 Close 的影响都会呈指数级消失(因此得名 指数 移动平均线)。

但是,当向后走时,每一步 后面的 EMA 除以 multiplier。这意味着任何给定数据点的影响 呈指数增长 ,而不是消失。

如果您的数学很完美,并且所有数字都恰到好处,那也没关系。但是,所有浮点误差 呈指数级放大,因此重复放大的噪声会很快超过信号。

没有简单的方法可以解决这个问题。最明显的尝试是尝试前进而不是后退,但不清楚这是否符合您的目标。