一起学量化之macd指标

macd指标

1. macd指标定义

MACD的组成要素MACD称为异同移动平均线,是从双指数移动平均线发展而来的。MACD由一根快线、一根慢线、一根0轴线和无数根红绿柱状线组成。

如下图所示,粉色的是快线,也称DIFF线蓝色的是慢线,也称DEA线。快线波动较大,慢线相对平稳一些。分割上下红绿柱的横轴就是0轴。

请添加图片描述

2. macd使用

2.1 快线DIF与慢线DEA的数值以及它们所在的位置

  • 当DIF和DEA均大于0(处于0轴之上)并且向上移动时,表示市场处于多头行情中,可以买人或持股
  • 当DIF和DEA均小于0(处于0轴之下)并且向下移动时,表示市场处于空头行情中,可以卖出股票或观望
  • 当DIF和DEA均大于0(处于0轴之上)但都向下移动时,表示市场行情处于退潮阶段,股票将下跌,可以卖出股票和观望
  • 当DIF和DEA均小于0(处于0轴之下)但都向上移动时,表示行情即将启动,股票将上涨,可以买进股票或持股待涨

2.2 快线DIF与慢线DEA的交叉情况

  • 当DIF与DEA都在0轴之上,而DIF向上突破DEA时,表明市场处于一种强势之中,股价将再次上涨,可以加码买进股票或持股待涨,这就是MACD指标黄金交叉的一种形式
  • 当DIF和DEA都在0轴之下,而DIF向上突破DEA时,表明市场即将转强,股价将止跌反弹,可以开始买进股票或持股,这是MACD指标黄金交叉的另一种形式
  • 当DIF与DEA都在0轴之上,而DIF却向下突破DEA时,表明市场即将由强势转为弱势,股价将下跌,这时应卖出大部分股票而不能买进股票,这就是MACD指标死亡交叉的一种形式
  • 当DIF和DEA都在0轴之下,而DIF向下突破DEA时,表明市场将再次进入极度弱市中,股价还将下跌,可以再卖出股票或观望,这是MACD指标死亡交叉的另一种形式。

参考:https://www.sohu.com/a/663842634_120762329

在这里插入图片描述

在这里插入图片描述

2.3 MACD指标与价格的背离

如果MACD在运行的过程中和商品价格的运行节奏出现了不完全同步的情况,那么这有可能是比较重要的转向提示信号。

  • 顶背离:经常出现在上涨趋势中,当商品价格高点不断变高,而同时MACD指标的高点却有所降低,那就表示多头力量有所减弱,价格可能会发生回调。

请添加图片描述

  • 底背离:在价格下跌的过程中,当商品价格的低点比前一次低点要低,而同时MACD指标的低点比前一次的低点要高,说明空头力量减弱,那么价格可能会出现反弹或反转。

在这里插入图片描述

3. backtrader 代码与分析

import backtrader as bt
import os, sys
file_path = os.path.dirname(os.path.realpath(__file__)) 
sys.path.append(file_path + '/../')

class TestStrategy(bt.Strategy):
    params = (('macd1', 12), ('macd2', 26), ('macdsig', 9), ('lookback_period', 30))

    def __init__(self):
        self.macd = bt.indicators.MACD(self.data.close, 
                                       period_me1=self.p.macd1, 
                                       period_me2=self.p.macd2, 
                                       period_signal=self.p.macdsig)
        self.crossup = bt.indicators.CrossUp(self.macd.macd, self.macd.signal)
        self.crossdown = bt.indicators.CrossDown(self.macd.macd, self.macd.signal)
        self.lookback_period = self.p.lookback_period # 回溯周期
        # 保存历史峰值和谷值
        self.peak_price_list = []
        self.peak_macd_list = []
    def find_largest_and_second(self,price,macd,reverse=True):
        if len(price) < self.lookback_period:
            return None, None, None, None  # 当列表中的元素不足两个时返回None

        # 复制并排序
        sorted_list = sorted(price, reverse=reverse)
        # 找到第一大的数
        largest_price = sorted_list[0]
        # 在原始列表中找到该数的索引
        largest_macd = macd[price.index(largest_price)]

        # 找到第二大的数
        second_largest_price = sorted_list[1]

        # 在原始列表中找到该数的索引
        second_largest_macd = macd[price.index(second_largest_price)]

        return largest_price, largest_macd,second_largest_price,second_largest_macd

    def next(self):
        has_position = self.position.size > 0.01
        has_cash = self.broker.get_cash()/self.data[0] > 0.01
        dif = self.macd.macd[0]
        dea = self.macd.signal[0]
        dif_prev = self.macd.macd[-1]
        dea_prev = self.macd.signal[-1]
        ###################### 2.1 章节 多头空头信号######################
        # 多头行情判断
        if dif > 0 and dea > 0 and dif > dif_prev and dea > dea_prev:
            if has_cash:
                self.buy(size=0.01)

        # 空头行情判断
        elif dif < 0 and dea < 0 and dif < dif_prev and dea < dea_prev:
            if has_position:
                self.sell(size=0.01)

        # 退潮阶段判断
        elif dif > 0 and dea > 0 and dif < dif_prev and dea < dea_prev:
            if has_position:
                self.sell(size=0.01)

        # 行情即将启动判断
        elif dif < 0 and dea < 0 and dif > dif_prev and dea > dea_prev:
            if has_cash:
                self.buy(size=0.01)

        ###################### 2.2 章节 黄金交叉和死亡交叉######################
        # 黄金交叉
        if self.crossup[0]:
            if dif > 0 and dea > 0:
                # 都在0轴之上时,市场处于强势
                if has_cash:
                    self.buy(size=0.01)
            elif dif < 0 and dea < 0:
                # 都在0轴之下时,市场即将转强
                if has_cash:
                    self.buy(size=0.03)
        # 死亡交叉
        elif self.crossdown[0]:
            if dif > 0 and dea > 0:
                # 都在0轴之上时,市场即将由强势转为弱势
                if has_position:
                    self.sell(size=0.01)
            elif dif < 0 and dea < 0:
                # 都在0轴之下时,市场将再次进入极度弱市
                if has_position:
                    self.sell(size=0.03)

        ###################### 2.3 章节 顶背离和底背离######################
        current_price = self.data.close[0]
        self.peak_price_list.append(current_price)
        if len(self.peak_price_list) > self.lookback_period:
            self.peak_price_list.pop(0)
        
        self.peak_macd_list.append(dif)
        if len(self.peak_macd_list) > self.lookback_period:
            self.peak_macd_list.pop(0)
            
        # 更新峰值
        peak_price,peak_macd,pre_peak_price,pre_peak_macd = self.find_largest_and_second(self.peak_price_list,self.peak_macd_list,True)

        # 更新谷值
        valley_price,valley_macd,pre_valley_price,pre_valley_macd = self.find_largest_and_second(self.peak_price_list,self.peak_macd_list,False)
        if valley_price is None or valley_macd is None:
            return
        if peak_price is None or peak_macd is None:
            return
        # 顶背离判断
        if current_price > pre_peak_price and dif < pre_peak_macd and current_price ==peak_price:
            # 执行交易逻辑
            if has_position:
                self.sell(size=0.01)

        # 底背离判断
        if current_price < pre_valley_price and dif > pre_valley_macd and current_price == valley_price:
            # 执行交易逻辑
            if has_cash:
                self.buy(size=0.01)

3.1 多头空头信号

Final Portfolio Value: 26810.11
Sharpe Ratio: OrderedDict([(‘sharperatio’, 0.7067442967214198)])

在这里插入图片描述

在这里插入图片描述

从上图来看该算法没有跑赢大盘,这种情况有比较明显的追涨卖跌,如果macd的参数不理想会导致大量且频繁的买入卖出。这种只能作为一种辅助的评价指标

  • 信号数量:频繁
  • 信号质量:底下
  • 需要信息:对零线比较敏感,不太适合长期持有操作。快线和慢线不太适合过长,否则有滞后性,例如将参数改为(‘macd1’, 30), (‘macd2’, 60), (‘macdsig’, 16),则结果只有12872.18

3.2 金叉死叉操作

Final Portfolio Value: 18197.17
Sharpe Ratio: OrderedDict([(‘sharperatio’, 0.5990693129804268)])

在这里插入图片描述

从上图来看该算法没有跑赢大盘,这类型号交易频率还是比较慢的,有比较明显的高点卖出,但是如果持续下跌,也需要注意快线和慢线参数信息,会出现骗信号的情况。

  • 信号数量:中等
  • 信号质量:较优
  • 需要信息:适合长期持有操作。快线和慢线需要适中,太长有滞后性,太短会过多交易。将参数改为(‘macd1’, 30), (‘macd2’, 60), (‘macdsig’, 16),则结果只有14011.33

在这里插入图片描述

在这里插入图片描述

3.3 背离信号

Final Portfolio Value: 12537.66
Sharpe Ratio: OrderedDict([(‘sharperatio’, 0.3212700568278445)])

在这里插入图片描述

从上图来看该算法没有跑赢大盘,这类交易信号一般来说还是比较尴尬的,周期越长越难触发,这类算法感觉比较吃周期的,这类算法延续性感觉会更强一点,因为大币种会更符合规律,比如选取100*24天作为一个周期

  • 信号数量:少
  • 信号质量:较优
  • 需要信息:周期,周期越长越难背离

在这里插入图片描述

目前改综合测试,macd的情况跑赢大盘,这个指标还是非常值得关注的

在这里插入图片描述

MACD指标,由快线、慢线、0轴线和红绿柱状线组成,是股票交易中的重要工具。它的使用包括观察快线DIF与慢线DEA的数值和位置,以及它们的交叉情况。MACD指标与价格的背离也是重要的转向提示信号。在Python中,可以通过backtrader库编写策略来利用MACD指标进行交易。测试结果显示,MACD指标在多头空头信号、金叉死叉操作和背离信号等方面都有一定的效果,但也存在一定的局限性,如信号数量、信号质量和需要的信息等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/266424.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线程池构造方法的认识

线程池中构造方法的认识 文章目录 线程池中构造方法的认识corePoolSize (核心线程数)maximumPoolSize&#xff08;最大线程数&#xff09;keepAliveTime(非核心线程的空闲超时时间)TimeUnitworkQueuethreadFactoryRejectedExecutionHandler拒绝策略 标准库中提供了一个ThreadPo…

C语言 enum类型

enum,枚举,是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。 语法&#xff1a; enum 枚举名 {枚举元素1,枚举元素2,……}; 直接上例子 #include<stdio.h> enum DAY { MON1, TUE, WED, TH…

华为鸿蒙应用--封装数据持久化工具:首选项Preferences(鸿蒙工具)-ArkTs

一、使用方法&#xff1a; 0、初始化实例&#xff1a;一般在EntryAbility.ts的onWindowStageCreate中初始化&#xff1b;&#xff08;可忽略&#xff09; 1、将数据写入Preferences实例 function() {let arrayNum: number[] [1, 2, 3];let arrayStr: string[] ["5&quo…

2023美团机器人研究院学术年会成功举办

2023年12月19日&#xff0c;深圳市美团机器人研究院学术年会在清华大学深圳国际研究生院成功落下帷幕。会议回顾了研究院成立一年来的进展和成果&#xff0c;并邀请了各界专家共同讨论机器人技术的未来发展趋势。此外&#xff0c;年会期间还举办了首届低空经济智能飞行管理挑战…

Web前端复习

一、随堂练习 1.小题 margin vanish&#xff1a;border和inline-block都可以形成bfc二维数组转置&#xff1a;res[i] [];函数的不同声明定义&#xff1a; 有变量名字的函数&#xff0c;即便后面声明了同样的&#xff0c;以函数表达式为主&#xff1b;定义&#xff0c;运行。再…

VS Code实现“Ctr+save”保存代码自动格式化

一、下载Prettier - Code formatter插件 点击安装即可 二、配置 【1】打开文件——首选项——设置 或者左下角齿轮打开设置 【2】搜索设置框输入editor default formatter&#xff08;意思是默认格式化设置&#xff09;&#xff0c;接着下拉选中刚下好的插件名称Prettier - C…

网络爬虫之多任务数据采集(多线程、多进程、协程)

进程&#xff1a;是操作系统中资源分配的基本单位 线程&#xff1a;使用进程分配的资源处理具体任务 一个进程中可以有多个线程&#xff1a;进程相当于一个公司&#xff0c;线程就是公司里面的员工。 一 多线程 多线程都是关于功能的并发执行。而异步编程是关于函数之间的非…

N-136基于springboot,vue在线聊天系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;TypeScriptVue3.0ElementUI-Plus 服务端技术&#xff1a;springboo…

【常见的语法糖(详解)】

&#x1f7e9; 说几个常见的语法糖 &#x1f7e2;关于语法糖的典型解析&#x1f7e2;如何解语法糖&#xff1f;&#x1f7e2;糖块一、switch 支持 String 与枚举&#x1f4d9;糖块二、泛型&#x1f4dd;糖块三、自动装箱与拆箱&#x1f341;糖块四、方法变长参数&#x1f5a5;️…

十.MySQL数据类型精讲(一)

MySQL数据类型精讲 1.MySQL中的数据类型2.整数类型2.1类型介绍2.2可选属性2.2.1 M 2.2UNSIGNED2.3ZEROFILL2.3使用场景2.4如何选择 3.浮点类型3.1类型介绍3.2数据精度说明3.3精度误差说明 4.定点数类型4.2开发中经验 5.位类型&#xff1a;BIT 1.MySQL中的数据类型 类型类型举例…

小白入门之安装MAVEN

重生之我在大四学JAVA 第六章 安装MAVEN 打开IDEA&#xff0c;配置MAVEN 打开Setting 找到上面设置的settings.xml文件地址 至此MAVEN也就安装成功了 附赠一个maven清理脚本&#xff0c;如果发现你的电脑maven下载不了jar&#xff0c;依赖爆红&#xff0c;可以试下下面bat脚…

limma:单通道数据和RNA-seq数据差异性分析标准方法

前言 单通道数据极为流行&#xff0c;三大公司&#xff1a;Affymetrix、Illumina和Agilent的微阵列&#xff08;microarray&#xff09;技术产生的很多都是单通道数据。现在的主力的高通量测序机所产生的也是单通道数据&#xff0c;所以只要是被voom标准化&#xff08;包括了l…

【操作系统】学习操作系统知识

文章目录 前言测量系统调用和上下文切换的成本purify 和 valgrindxx3 的执行过程 前言 ref&#xff1a;http://ges.cs.wisc.edu/~remzi/OSTEP/Chinese 零散的记录知识&#xff0c;看《操作系统引论》 测量系统调用和上下文切换的成本 上下文切换需要多长时间&#xff1f;甚…

SpringBoot+SSM项目实战 苍穹外卖(7)(Spring Cache)

继续上一节的内容&#xff0c;本节实现缓存菜品、缓存套餐、添加购物车、查看购物车和清空购物车功能。 目录 缓存菜品缓存套餐(基于Spring Cache)EnableCaching、Cacheable、CachePut和CacheEvictSpring Cache实现缓存套餐 添加购物车查看购物车清空购物车 缓存菜品 用户端小…

STANFORD斯坦福FS725铷钟

FS725在一个紧凑的半宽2U机箱中集成了一个铷原子振荡器&#xff08;SRS型号PRS10&#xff09;、一个低噪声通用交流电源和分配放大器。它提供稳定和可靠的性能&#xff0c;估计20年的老化率低于510-9&#xff0c;并证明铷原子振荡器的MTBF超过20万小时。FS725是校准和研发实验室…

@z-utils组 重构和自动化实现

highlight: monokai theme: github 包简介 z-utils组 是一个可以在vue/react/pure js 中使用的工具包&#xff0c;它包含三个子类&#xff0c;分别为 z-utils/base, z-utils/react, z-utils/vue 三个分别在不同区域使用。 他是原 zzy-javascript-devtools 的重构版本&#xf…

Java多线程技术四——定时器

1 定时器的使用 在JDK库中Timer类主要负责计划任务的功能&#xff0c;也就是在指定的时间开始执行某一个任务&#xff0c;Timer类的方法列表如下&#xff1a; Timer类的主要作用就是设置计划任务&#xff0c;封装任务的类却是TimerTask&#xff0c;该类的结构如下图 因为TimerT…

计算机网络复习-OSI TCP/IP 物理层

我膨胀了&#xff0c;挂我啊~ 作者简介&#xff1a; 每年都吐槽吉师网安奇怪的课程安排、全校正经学网络安全不超20人情景以及割韭菜企业合作的FW&#xff0c;今年是第一年。。 TCP/IP模型 先做两道题&#xff1a; TCP/IP协议模型由高层到低层分为哪几层&#xff1a; 这题…

Angular 11到升级到 Angular 16

日新月异&#xff0c;与时俱进… 随着Angular版本不断更新&#xff0c;再看所开发的项目版本仍然是Angular 11&#xff0c;于是准备升级 截止发博日最版本是 v17.1.0&#xff0c;考虑到稳定性因素决定升级到v16版本 一&#xff1a;查看 升级指南 二&#xff1a;按照指南&…

【ArduinoOTA无线(OTA)更新的EASY指南】

【ArduinoOTA无线&#xff08;OTA&#xff09;更新的EASY指南】 1. 前言2. 了解 ESP32 的 ArduinoOTA3. 无线更新案例4. ArduinoOTA入门5. 安装必备组件6. 设置硬件7. ESP32 OTA 的最低代码8. 按照我们的流程学习Arduino编程➜9. 这对OTA来说非常重要10. 通过无线方式将草图上传…