Python EMA计算

在这里借鉴了http://blog.sina.com.cn/s/blog_5f75a83f0101af5l.html

先说一下EMA的计算公式:(这里全抄的上面的博客,但下面的代码是我的写的*___<)

计算:有一组数据(收盘价为):1,2,3,4,5,6,7,求其EMA(c,5)

解答:对应上面数据,X1,X2,X3,X4,X5分别对应3、4、5、6、7

则EMA(c,5)=5/15*X5+4/15*X4+3/15*X3+2/15*X2+1/15*X1=(5*X5+4*X4+3*X3+2*X2+1*X1)/15
=5.67
而,MA(c,5)=(3+4+5+6+7)/5=5

理解公式算法-EMA与MA(理解了公式算法,才能更好的应用公式)

MA和EMA的数学表达式:

1、MA(X,N),求X的N日移动均匀值。算法是:
(X1+X2+X3+…..+Xn)/N
例如:MA(C,20)表示20日的均匀收盘价。C表示CLOSE。

2、EMA(X,N)求X的N日指数平滑移动均匀。算法是:
若Y=EMA(X,N),则Y=[2*X+(N-1)*Y’]/(N+1),其中Y’表示上一周期的Y值。
EMA引用函数在计算机上使用递回算法很轻易实现,但不轻易理解。例举分析说明EMA函数。
X是变量,天天的X值都不同,从远到近地标记,它们分别记为X1,X2,X3,….,Xn
假如N=1,则EMA(X,1)=[2*X1+(1-1)*Y’]/(1+1)=X1
假如N=2,则EMA(X,2)=[2*X2+(2-1)*Y’]/(2+1)=(2/3)*X2+(1/3)X1
假如N=3,则EMA(X,3)=[2*X3+(3-1)*Y’]/(3+1)=[2*X3+2*((2/3)*X2+(1/3)*X1)]/4=(1/2)*X3+(1/3)*X2+(1/6)*X1=3/6*X3+2/6*X2+1/6*X1
假如N=4,则EMA(X,4)=[2*X4+(4-1)*Y’]/(4+1)=2/5*X4+3/5*((1/2)*X3+(1/3)*X2+(1/6)*X1)=4/10*X4+3/10*X3+2/10*X2+1/10*X1
=2/5*X4+3/10*X3+3/15*X2+3/30*X1
假如N=5,则EMA(X,5)=2/(5+1)*X5+(5-1)/(5+1)(2/5*X4+3/10*X3+3/15*X2+3/30*X1)
=(1/3)*X5+(4/15)*X4+(3/15)*X3+(2/15)*X2+(1/15)*X1=5/15*X5+4/15*X4+3/15*X3+2/15*X2+1/15*X1
…………循环下往吧:)

EMA(X,6)=6/21*X6+5/21*X5+4/21*X4+3/21*X3+2/21*1/21X1
留意到上,但系数该如何确定呢?这个你还是自己观察一下吧(提示,系数的分母是各个系数分子之和,而系数的个数就是EMA(X,N)中的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


def EMA2(c, N, denominator=1):
    if N >= 1:
        if denominator == 1:
            denominator = sum(range(N + 1))
        return N / denominator * c[-1] + EMA2(c[len(c) - N:len(c) - 1], N - 1, denominator)
    else:
        return 0


if __name__ == '__main__':
    c = [1, 2, 3, 4, 5, 6, 7]
    print(EMA(c, 7))
    # print((2 * 3) / 2)  # n = 1
    # print((2 * 4 + 3) / 3)  # n = 2
    # print((2 * 5 + 2 * 3.6666666666666665) / 4)  # n = 3
    # print((2 * 6 + 3 * 4.333333333333333) / 5)  # n = 4
    # print((2 * 7 + 4 * 5.0) / 6)  # n = 5

    print(EMA2(c, 7))

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值