• 写在前面
  • MACD简介
  • 用到的主要Python库
  • MACD详细介绍
  • Python代码
  • 总结
  • 参考文献
  • 推荐阅读
  • 2020.8.1更新

写在前面

最近正在研究算法交易,看了几本英文原版书。本文总结自Packt出版社的《Learn Algorithmic Trading - Fundamentals of Algorithmic Trading》(图1)。现将该书的MACD技术指标部分进行总结,并对数据处理等函数做了相应改动,供有需要的读者学习研究。

图1

MACD简介

MACD(Moving average convergence divergence)平滑异同移动平均线,1979年由美国人杰拉德·阿佩尔(Gerald Appel)及福雷德·海期尔(Fred Hitschler)所发明,在股票、期货等的市场分析等方面都有着广泛的应用。

用到的主要Python库

Python绘图库Matplotlib 3.2.1
Python金融数据处理库Pandas 1.0.2

MACD详细介绍

  • MACD指标[1]基于快速、慢速两个长度不同的移动均线
    (FastMA是短期均线,SlowMA是长期均线),即:
    MACD = FastMA - SlowMA
    第二条线,称为信号线,为移动MACD的平均值,即:
    SignalLine = MovAvg (MACD)
    第三条线,称为MACD直方图,为MACD和信号线之间的差异,即:
    MACD Histogram = MACD - SignalLine
  • 公式MACD=EMAFast−EMASlowMACDSignal=EMAMACDMACDHistogram=MACD−MACDSignal\begin{array}{c} MACD=E M A_{\text {Fast}}-E M A_{\text {Slow}} \\ MACD_{\text {Signal}}=E M A_{M A C D} \\ MACD_{\text {Histogram}}=M A C D-M A C D_{\text {Signal}} \end{array}MACD=EMAFast​−EMASlow​MACDSignal​=EMAMACD​MACDHistogram​=MACD−MACDSignal​​

Python代码

# 处理时间标签
from datetime import datetime
# 图形参数控制
import pylab as pl
# 导入及处理数据
import pandas as pd
# 绘图
import matplotlib.pyplot as plt
import matplotlib as mpl
# 解决一些编辑器(VSCode)或IDE(PyCharm)等存在的图片显示问题,
# 应用Tkinter绘图,以便对图形进行放缩操作
mpl.use('TkAgg')# 导入数据并做处理
def import_csv(stock_code):df = pd.read_csv(stock_code + '.csv')df.rename(columns={'date': 'Date','open': 'Open','high': 'High','low': 'Low','close': 'Close','volume': 'Volume'},inplace=True)df['Date'] = pd.to_datetime(df['Date'], format='%Y/%m/%d')df.set_index(['Date'], inplace=True)return dfstock_code = 'sh600519'
# 绘制数据的规模scale
scale = 100
df = import_csv(stock_code)[-scale:]# EMA(Exponential Moving Average), 指数移动平均线
num_periods_fast = 10  # 快速EMA的时间周期,10
# K:平滑常数,常取2/(n+1)
K_fast = 2 / (num_periods_fast + 1)  # 快速EMA平滑常数
ema_fast = 0
num_periods_slow = 40  # 慢速EMA的时间周期,40
K_slow = 2 / (num_periods_slow + 1)  # 慢速EMA平滑常数
ema_slow = 0
num_periods_macd = 20  # MACD EMA的时间周期,20
K_macd = 2 / (num_periods_macd + 1)  # MACD EMA平滑常数
ema_macd = 0ema_fast_values = []
ema_slow_values = []
macd_values = []
macd_signal_values = []
# MACD - MACD-EMA
MACD_hist_values = []
for close_price in df['Close']:if ema_fast == 0:  # 第一个值ema_fast = close_priceema_slow = close_priceelse:ema_fast = (close_price - ema_fast) * K_fast + ema_fastema_slow = (close_price - ema_slow) * K_slow + ema_slowema_fast_values.append(ema_fast)ema_slow_values.append(ema_slow)# MACD is fast_MA - slow_EMAmacd = ema_fast - ema_slow  if ema_macd == 0:ema_macd = macdelse:# signal is EMA of MACD valuesema_macd = (macd - ema_macd) * K_macd + ema_macd  macd_values.append(macd)macd_signal_values.append(ema_macd)MACD_hist_values.append(macd - ema_macd)df = df.assign(ClosePrice=pd.Series(df['Close'], index=df.index))
df = df.assign(FastEMA10d=pd.Series(ema_fast_values, index=df.index))
df = df.assign(SlowEMA40d=pd.Series(ema_slow_values, index=df.index))
df = df.assign(MACD=pd.Series(macd_values, index=df.index))
df = df.assign(EMA_MACD20d=pd.Series(macd_signal_values, index=df.index))
df = df.assign(MACD_hist=pd.Series(MACD_hist_values, index=df.index))close_price = df['ClosePrice']
ema_f = df['FastEMA10d']
ema_s = df['SlowEMA40d']
macd = df['MACD']
ema_macd = df['EMA_MACD20d']
macd_hist = df['MACD_hist']# 设置画布,纵向排列的三个子图
fig, ax = plt.subplots(3, 1)# 设置标签显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 调整子图的间距,hspace表示高(height)方向的间距
plt.subplots_adjust(hspace=.1)# 设置第一子图的y轴信息及标题
ax[0].set_ylabel('Close price in ¥')
ax[0].set_title('A_Stock %s MACD Indicator' % stock_code)
close_price.plot(ax=ax[0], color='g', lw=1., legend=True, use_index=False)
ema_f.plot(ax=ax[0], color='b', lw=1., legend=True, use_index=False)
ema_s.plot(ax=ax[0], color='r', lw=1., legend=True, use_index=False)# 应用同步缩放
ax[1] = plt.subplot(312, sharex=ax[0])
macd.plot(ax=ax[1], color='k', lw=1., legend=True, sharex=ax[0], use_index=False)
ema_macd.plot(ax=ax[1], color='g', lw=1., legend=True, use_index=False)# 应用同步缩放
ax[2] = plt.subplot(313, sharex=ax[0])
df['MACD_hist'].plot(ax=ax[2], color='r', kind='bar', legend=True, sharex=ax[0])# 设置间隔,以便图形横坐标可以正常显示(否则数据多了x轴会重叠)
interval = scale // 20
# 设置x轴参数,应用间隔设置
# 时间序列转换,(否则日期默认会显示时分秒数据00:00:00)
# x轴标签旋转便于显示
pl.xticks([i for i in range(1, scale + 1, interval)],[datetime.strftime(i, format='%Y-%m-%d') for i in \pd.date_range(df.index[0], df.index[-1], freq='%dd' % (interval))],rotation=45)
plt.show()

所得图像如下:

总结

本文以PythonMatplotlib绘图库为工具,实现了金融领域常用的MACD技术指标,便于大家更好地理解和应用量化交易,日后还会更新其他技术指标的Python实现,欢迎学习交流!
本文用到的数据及有关书籍资源有需要者可私信我。

参考文献

[1] Sebastien Donadio,Sourav Ghosh.Learn Algorithmic Trading - Fundamentals of Algorithmic Trading.Birmingham:Packt Press,2019.P55-59.

推荐阅读

用mplfinance库绘制股票K线、均线图

Python绘制BOLL布林线指标图

Python绘制RSI相对强弱指标图

2020.8.1更新

指出了文中的一个错误,已在文中修改。代码第71行应该为K_macd,为macd的EMA的平滑常数,在此感谢细心的读者@ertewu.

Python绘制MACD指标图相关推荐

  1. 用matplotlib和pandas绘制股票MACD指标图,并验证化交易策略

    我的新书<基于股票大数据分析的Python入门实战>于近日上架,在这篇博文向大家介绍我的新书:<基于股票大数据分析的Python入门实战>里,介绍了这本书的内容.这里将摘录出部 ...

  2. Python绘制双坐标图

    转自:https://blog.csdn.net/Asher117/article/details/104545838 使用Python绘制双坐标图,代码及结果显示如下. import matplot ...

  3. 用Python绘制MACD、KDJ、布林线技术指标图

    背景介绍: 搭建程序化交易平台的过程需要研究技术指标. 环境: OS:mac PYTHON: 3.8 IDE: pycharm 步骤: 第一步:加载库 import pandas as pd impo ...

  4. Python绘制RSI相对强弱指标图

    写在前面 相对强弱指标(RSI)简介 RSI公式详解 参数设置&公式 用到的主要Python库 Python代码&详解 参考文献 推荐阅读 写在前面 本文代码部分总结自Packt出版社 ...

  5. Python绘制BOLL布林线指标图

    写在前面 布林线(BOLL)技术指标简介 BOLL公式详解 参数设置 用到的主要Python库 Python代码&详解 参考文献 推荐阅读 写在前面 本文代码部分总结自Packt出版社的< ...

  6. 【Python画图】绘制双坐标图

    使用Python绘制双坐标图,代码及结果显示如下. import matplotlib.pyplot as plt fig = plt.figure(figsize=(10,6)) #显示中文 plt ...

  7. python怎么绘制macd

    首先,你需要准备数据.这通常包括股票的收盘价格数据.然后,你可以使用 Python 的 talib 库来计算 MACD 指标.这个库提供了一个名为 MACD 的函数,可以计算移动平均指数平滑异同平均值 ...

  8. Python+pandas绘制平行坐标图

    技术要点: 平行坐标图适合展示具有多个属性的数据,每个坐标轴表示一个属性,每条曲线表示一个样本. 参考代码: 运行效果: ----------相关阅读---------- 教学课件 1900页Pyth ...

  9. 怎么用python找论文_如何利用Python绘制学术论文图表方法

    论文中图表形式多样,常用的处理工具有excel.MATLAB以及Python等,excel自处理的方法有两个缺陷: 1.当数据较多时,容易出现excel"翻白眼"的现象: 2.需要 ...

最新文章

  1. 小学计算机课型有哪几种,小学信息技术课上常用几种教学方法.doc
  2. 使用奇异值谱分析鉴定振荡成份
  3. serverless搭建html,基于ServerLess的极简网页计数器:源码分析与实践
  4. java键盘事件键值表_Java的20年:重大事件的时间表
  5. 实现自己的BeanFactory、AOP以及声明式事务
  6. Meidapipe 3D手势姿态跟踪算法,手机端实时检测 ,多个手势同时捕捉
  7. LB-createLB整理架构图-loadbalancer-openstack F版
  8. PAT乙级(1030 完美数列)
  9. c语言二叉树_linux学习第20节,二叉树的特性和插入、查询、删除等基本操作
  10. 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)
  11. 某直装外挂卡密校验逆向分析
  12. linux相关rpm包下载地址
  13. java vo 什么意思_在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
  14. Ubuntu20.04成功安装google浏览器,并正常使用Bing等其他搜索引擎
  15. ios动态效果实现翻页_iOS动画--翻页动画
  16. Zabbix设置微信报警
  17. 微信“商家转账到零钱“功能接入以及如何获得转账结果?
  18. 2.2   字 母 表 和 符 号 串 的 基 本 概 念
  19. 1124. Raffle for Weibo Followers
  20. c语言编程余弦,C语言实例编程绘制余弦曲线

热门文章

  1. 程序员职场生涯最重要的三个阶段!
  2. 2021-04-03 java学习
  3. Shell脚本语法3.21
  4. mysql数据库集群版_MySql数据库集群
  5. 物联网技术概论:第3章
  6. springboot网络微小说毕业设计源码031758
  7. IOS开发之蘑菇街框架
  8. 【MQTT】.Net Core 操作
  9. 维基解密网站总编辑身世被解密
  10. OA协同办公系统初始化设置