在这里借鉴了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))