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

相关文章
|
2月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
25 1
|
2月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
27 2
|
2月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
120 1
|
2月前
|
设计模式 开发者 Python
Python类里引用其他类
Python类里引用其他类
30 4
|
2月前
|
设计模式 开发者 Python
Python 类中引用其他类的实现详解
Python 类中引用其他类的实现详解
59 1
|
2月前
|
JSON 缓存 API
在 Python 中使用公共类处理接口请求的响应结果
在 Python 中使用公共类处理接口请求的响应结果
37 1
|
2月前
|
机器人 关系型数据库 Python
【Python篇】Python 类和对象:详细讲解(下篇)
【Python篇】Pyt hon 类和对象:详细讲解(下篇)
35 2
|
2月前
|
算法 Python
【Python篇】Python 类和对象:详细讲解(中篇)
【Python篇】Python 类和对象:详细讲解(中篇)
37 2
|
2月前
|
存储 C++ Python
【Python篇】Python 类和对象:详细讲解(上篇)
【Python篇】Python 类和对象:详细讲解(上篇)
50 2
|
3月前
|
前端开发 Python
Python编程的面向对象有哪些(二)
Python编程的面向对象(二)—类的多态
27 7