什么是MACD
MACD全称为Moving Average Convergence and Divergence,也就是股市中常说的平滑异同移动平均线。最早由Geral Appel于1979年提出,它属于一个趋势类指标,由快速线DIF,慢速线DEA以及红绿柱状图组成。
其中,DIF与DEA是以X轴为中心轴,上下交叉移动的两条线,而柱状图由DIF减去DEA获得,我们常常在股市中,将MACD的红绿柱收缩作为研判行情的辅助指标。所以,我们可以得出结论,MACD的绘制最重要的就是获取到DIF与DEA。
其中,DIF是由收盘价的短期指数移动平均线EMA1与长期指数移动平均线EMA2相减得到。至于DEA,只是对DIF值进行的二次移动平滑,主要用于辅助观察变化。
理论上来说,在股票持续上涨的行情中,短期EMA1线在长期EMA2线之上,其间的正离差值(+DIF)会越来越大,DIF距离DEA也会变大,柱状图也会扩展;反之,在加速跌势中,负离插值(-DIF)会越来越小。当行情反转时,DIF与DEA距离也会逐渐减小,也就是常说的指标出现背离的情形,对应于股价可体现为第二轮上涨/下跌虽然超越了第一轮股价的高点/低点,但第二轮运行的动能比第一轮降低了,预示着趋势已经时强弩之末的态势了。
MACD指标的计算
MACD指标计算分为4个步骤:
(1)如前文所说,MACD由DIF、DEA以及柱状图组成,其中DIF由EMA1与EMA2相减得到。所以,我们首先需要计算EMA1与EMA2的值。需要注意的是,EMA不同于普通的均线,它是指数加权的移动平均线,也就是EMA1的窗口周期为12日,EMA2的窗口周期为26日。计算公式如下:
EMA1(12日收盘价移动平均线)=前一日EM1(12)11/13+今日收盘价2/13
EMA2(26日收盘价移动平均线)=前一日EMA2(26)25/27+今日收盘价2/27
现在我们直接通过代码计算这2个值,具体步骤如下:
EMA1=df["close"].ewm(span=12, adjust=False).mean() EMA2=df["close"].ewm(span=26, adjust=False).mean()
(2)得到EMA1与EMA2之后,我们就可以计算出DIF与DEA的值。通常DEA的窗口周期为9日,具体公式如下:
DIF(差离值)=EMA1-EMA2
DEA(差离平均值)=前一日DEA8/10+今日DIF2/10
替换成python代码之后,如下所示:
DIF=EMA1-EMA2 DEA=DIF.ewm(9,adjust=False).mean()
(3)最后,通过DIF与DEA得到柱状图,具体公式如下:
BAR(柱状值)=2*(DIF-DEA)
替换成代码后,如下所示:
BAR=2*(DIF-DEA)
但是我们看到过其他股票软件上柱状图并不是一层不变的,而是红绿相间,所以,这里我们还需要将BAR的值进行分类,以显示红绿柱状图。代码如下:
red_bar=np.where(BAR>0,BAR,0) blue_bar=np.where(BAR<0,BAR,0)
绘制MACD图
既然我们已经得到了绘制MACD的所有值,那么现在我们就可以直接绘制MACD指标图,完整代码如下所示:
import numpy as np import matplotlib.pyplot as plt from datetime import datetime fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111) df = pd.read_excel("歌尔股份k.xlsx") df['date'] = pd.to_datetime(df['date']) df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d')) EMA1=df["close"].ewm(span=12, adjust=False).mean() EMA2=df["close"].ewm(span=26, adjust=False).mean() DIF = EMA1 - EMA2 DEA = DIF.ewm(span=9, adjust=False).mean() BAR = 2 * (DIF - DEA) red_bar = np.where(BAR > 0, BAR, 0) blue_bar = np.where(BAR < 0, BAR, 0) ax.plot(np.arange(0, len(df)), DIF) ax.plot(np.arange(0, len(df)), DEA) ax.bar(np.arange(0, len(df)), red_bar, color="red") ax.bar(np.arange(0, len(df)), blue_bar, color="blue") ax.xaxis.set_major_locator(ticker.MaxNLocator(20)) def format_date(x, pos=None): if x < 0 or x > len(df['date']) - 1: return '' return df['date'][int(x)] ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date)) plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') plt.title("MACD") plt.show()
运行之后,得到的效果如下图所示:
MACD到这里就讲解完成,下一篇将介绍金叉与死叉。