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

相关文章
|
4天前
|
Python
Python-类视图和蓝图
Python-类视图和蓝图
11 2
|
4天前
|
存储 Java 数据安全/隐私保护
Python----类对象和实例对象
Python----类对象和实例对象
9 2
|
4天前
|
C++ Python
Python中的类与对象
Python中的类与对象
8 1
|
4天前
|
Python
在Python中,类的属性可以分为公有属性和私有属性
【5月更文挑战第7天】Python类包含公有和私有属性。公有属性可直接外部访问,如`person.name`,而私有属性如`_name`需通过getter/setter方法访问,如`person.getName()`和`person.setName()`。私有属性用于封装数据、隐藏实现细节,增强代码可维护性和安全性。封装能灵活修改内部实现,不影响外部;安全性防止外部非法修改数据;一致性确保所有数据操作在类内完成,简化代码并减少错误。
28 10
|
4天前
|
Python
【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
【5月更文挑战第6天】【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
|
4天前
|
存储 程序员 Python
Python中自定义类实例化数组的艺术
Python中自定义类实例化数组的艺术
11 1
|
4天前
|
程序员 Linux C++
Python中的WinForms类桌面应用程序开发
Python中的WinForms类桌面应用程序开发
25 4
|
4天前
|
Java 开发者 索引
Python基础语法:类笔记
本篇博文是把自己在学习python类的过程中自己理解和笔记,一点一点总结的写出出来,做一个总结,加深对面向对象编程的理解。
|
4天前
|
机器学习/深度学习 数据采集 算法
【Python机器学习专栏】使用机器学习预测股票价格
【4月更文挑战第30天】本文探讨了使用Python和机器学习预测股票价格的方法,包括数据收集(如开盘价、收盘价等)、预处理(缺失值填充、异常值处理、标准化)、特征选择(技术指标、基本面指标、市场情绪)和工程、模型选择(线性回归、SVM、神经网络等)、训练与调优。模型评估涉及准确率、召回率等指标,并强调实际应用中需考虑多种因素,未来研究可探索深度学习的应用及数据质量与安全。
|
4天前
|
数据可视化 索引 Python
数据分享|Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据
数据分享|Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据