具体计算公式及例子如下:
EMA(12)= 前一日EMA(12)×11/13+今日收盘价×2/13 #12条记录,快线
EMA(26)= 前一日EMA(26)×25/27+今日收盘价×2/27 #26条记录,慢线
DIFF=今日EMA(12)- 今日EMA(26)
DEA = 前一日DEA×8/10+今日DIF×2/10
MACD=BAR=2×(DIFF-DEA)
注:EMA从股票上市第一天的收盘价(ema = close)就开始累积了,如果从中途取值的话,理论上应该能得到前一天的EMA值,不然
计算的结果会和真实的结果有出入。
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import pandas as pd 5 6 df = pd.DataFrame(getKline('1day','30','0')) 7 df.columns = ['date', 'open', 'high', 'low', 'close', 'amount'] 8 9 def calc_EMA(df, N): 10 for i in range(len(df)): 11 if i==0: 12 df.ix[i,'ema']=df.ix[i,'close'] 13 if i>0: 14 df.ix[i,'ema']=((N-1)*df.ix[i-1,'ema']+2*df.ix[i,'close'])/(N+1) 15 ema=list(df['ema']) 16 return ema 17 18 def calc_MACD(df, short=12, long=26, M=9): 19 emas = calc_EMA(df, short) 20 emaq = calc_EMA(df, long) 21 df['diff'] = pd.Series(emas) - pd.Series(emaq) 22 for i in range(len(df)): 23 if i==0: 24 df.ix[i,'dea'] = df.ix[i,'diff'] 25 if i>0: 26 df.ix[i,'dea'] = ((M-1)*df.ix[i-1,'dea'] + 2*df.ix[i,'diff'])/(M+1) 27 df['macd'] = 2*(df['diff'] - df['dea']) 28 return df 29 30 calc_MACD(df, 12, 26, 9)
参考文章: http://blog.csdn.net/daodan988/article/details/51258676