python股票量化交易(3)---趋势类指标MACD

虚心屈己,受福之基。彼气盈者,必非远器,纵发亦无受用。

什么是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图
MACD到这里就讲解完成,下一篇将介绍金叉与死叉。

猜你喜欢

转载自blog.csdn.net/liyuanjinglyj/article/details/112755758
今日推荐