深入理解EMA和SMA

    科技2023-11-03  133

    一直对EMA的理解都比较模糊,总是不能完全把握,因此,凡是牵涉到EMA的公式都搞不清其内在的数学模型是什么。刚好看到个文章,觉得写的很好。 参考内容:https://www.codeleading.com/article/9441142281/

    1 EMA

    公式:EMAtoday=α * Pricetoday + ( 1 - α ) * EMAyesterday; 其中,α为平滑指数,一般取作2/(N+1) 推导公式:EMA(X,N)=[2X+(N-1)Y’]/(N+1)

    下面是对于公式的拆解,分别解出当N=1,2,3,4,5时,各自计算出的值

    EMA(X,1)=[2*X1+(1-1)*Y’]/(1+1) = X1

    EMA(X,2)=[2X2+(2-1)Y’]/(2+1) = X2(2/3) +X1(1/3)

    EMA(X,3)=[2X3+(3-1)Y’]/(3+1) = [2X3 + 2Y’ ]/4 = [2X3 + 2 ( X2*(2/3)+X1*(1/3) )]/4 = X3*(3/6) + X2*(2/6) + X1*(1/6)

    EMA(X,4)=[2X4+(4-1)Y’]/(4+1) = [2X4 + 3Y’ ]/5 = [2X4 + 3 (X3*(1/2) + X2*(1/3) + X1*(1/6))]/5 = X4*(4/10) + X3*(3/10) + X2*(2/10) + X1*(1/10)

    EMA(X,5)=[2X5+(5-1)Y’]/(5+1) = [2X5 + 4Y’]/6 = [2X5 + 4 ( X4*(4/10) + X3*(3/10) + X2*(2/10) + X1*(1/10) )]/6 = X5*(5/15) + X4*(4/15) + X3*(3/15) + X2*(2/15) + X1+(1/15) 至此,程序也就好编写了,即假设要求EMA(X,N)的值,那么就依次请求N值为1,2,3值到N的值即可 代码:

    def EMA(c, N): Y = 0 n = 1 for ci in c[-N:]: Y = (2 * ci + (n - 1) * Y) / (n + 1) n += 1 return Y if __name__ == '__main__': c = [1, 2, 3, 4, 5, 6, 7] print(EMA(c, 5))

    在EMA指标中,每天价格的权重系数以指数等比形式缩小。时间越靠近当今时刻,它的权重越大,说明EMA函数对近期的价格加强了权重比,更能及时反映近期价格波动情况。所以EMA比MA更具参考价值,而EMA也不容易出现死叉和金叉,所以一旦出现要立即作出反映!对周线处理,EMA就更加稳定了。

    2 SMA

    理解了EMA的含义和用途后,后面SMA函数就好理解了;因为EMA的平滑系数是定的,=2/(周期+1);如果要改变平滑系数咋办?这就用到了 SMA,与EMA的区别就是增加了权重参数M,也就是用M代替EMA平滑系数中的2,这样我们可以根据需要调整当日数值在均价中的权重=M/N。(要求N>M) 推导公式:SMA(X,N,M)=[MX+(N+1-M)Y’]/(N+1)

    假设M为3,则举例说明SMA(X,5,3)

    SMA(X,1,3)=[3*X1+(1+1-3)*Y’]/(1+1) = X1

    SMA(X,2,3)=[3*X2+(2+1-3)*Y’]/(2+1) = X2

    SMA(X,3,3)=[3X3+(3+1-3)Y’]/(3+1) = [3X3 + 1Y’ ]/4 = [3X3 + X2]/4 = X3(3/4) + X2*(1/4)

    SMA(X,4, 3)=[3X4+(4+1-3)Y’]/(4+1) = [3X4 + 2Y’ ]/5 = [3X4 + 2 ( X3*(3/4) + X2*(1/4) )]/5 = X4*(6/10) + X3*(3/10) + X2*(1/10)

    SMA(X,5,3)=[3X5+(5+1-3)Y’]/(5+1) = [3X5 + 3Y’]/6 = [3X5 + 3 ( X4*(6/10) + X3*(3/10) + X2*(1/10) )]/6 = X5*(10/20) + X4*(6/20) + X3*(3/20) + X2*(1/20) 代码:

    def SMA(c, N, M): Y = 0 n = 1 for ci in c[-N:]: Y = (M * ci + (n+1-M) * Y) / (n+1) n += 1 return Y if __name__ == '__main__': c = [1, 2, 3, 4, 5, 6, 7] print(SMA(c, 5, 3))
    Processed: 0.027, SQL: 8