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

相关文章
|
8月前
|
数据采集 Web App开发 数据可视化
Python零基础爬取东方财富网股票行情数据指南
东方财富网数据稳定、反爬宽松,适合爬虫入门。本文详解使用Python抓取股票行情数据,涵盖请求发送、HTML解析、动态加载处理、代理IP切换及数据可视化,助你快速掌握金融数据爬取技能。
6447 1
|
9月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
数据可视化 数据挖掘 数据安全/隐私保护
Python实现时间序列动量策略:波动率标准化让量化交易收益更平稳
时间序列动量策略(TSMOM)是一种基于资产价格趋势的量化交易方法,通过建立多头或空头头寸捕捉市场惯性。然而,传统TSMOM策略因风险敞口不稳定而面临收益波动问题。波动率调整技术通过动态调节头寸规模,维持恒定风险水平,优化了策略表现。本文系统分析了波动率调整TSMOM的原理、实施步骤及优势,强调其在现代量化投资中的重要地位,并探讨关键参数设定与实际应用考量,为投资者提供更平稳的风险管理体验。
720 4
Python实现时间序列动量策略:波动率标准化让量化交易收益更平稳
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
821 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
356 11
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
365 1
|
存储 数据采集 数据库
Python爬虫实战:股票分时数据抓取与存储
Python爬虫实战:股票分时数据抓取与存储
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
数据采集 人工智能 自然语言处理
AI Agent 金融助理0-1 Tutorial 利用Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股) AI Finance Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
304 2

推荐镜像

更多