Talib提供了MACD函数,我在研究中实验了MACD的用法,并自己进行了编程,对比了结果,与同花顺交易软件中的指标走势一致。使用Talib中的MACD进行了策略回测。
import talib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = get_price('000001.XSHE', start_date='2015-04-01', end_date='2015-11-10', frequency='daily')
#剔除停盘数据
df[df['volume']==0]=np.nan
df= df.dropna()
计算方法:
12日EMA的计算:EMA12 = 前一日EMA12 X 11/13 + 今日收盘 X 2/13
26日EMA的计算:EMA26 = 前一日EMA26 X 25/27 + 今日收盘 X 2/27
差离值(DIF)的计算: DIF = EMA12 - EMA26,即为talib-MACD返回值macd
根据差离值计算其9日的EMA,即离差平均值,是所求的DEA值。今日DEA = (前一日DEA X 8/10 + 今日DIF X 2/10),即为talib-MACD返回值signal
DIF与它自己的移动平均之间差距的大小一般BAR=(DIF-DEA)2,即为MACD柱状图。但是talib中MACD的计算是bar = (dif-dea)1
买卖原则为:
DIF-DEA均为正,买入信号参考。
DIF-DEA均为负,卖出信号参考。
talib.MACD?
def myMACD(price, fastperiod=12, slowperiod=26, signalperiod=9):
ewma12 = pd.ewma(price,span=fastperiod)
ewma60 = pd.ewma(price,span=slowperiod)
dif = ewma12-ewma60
dea = pd.ewma(dif,span=signalperiod)
bar = (dif-dea) #有些地方的bar = (dif-dea)*2,但是talib中MACD的计算是bar = (dif-dea)*1
return dif,dea,bar
macd, signal, hist = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
mydif,mydea,mybar = myMACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
fig = plt.figure(figsize=[18,5])
plt.plot(df.index,macd,label='macd dif')
plt.plot(df.index,signal,label='signal dea')
plt.plot(df.index,hist,label='hist bar')
plt.plot(df.index,mydif,label='my dif')
plt.plot(df.index,mydea,label='my dea')
plt.plot(df.index,mybar,label='my bar')
plt.legend(loc='best')
macd