量化交易入门(二十二)MACD指标实现,能挣到钱吗?

news2024/11/18 9:42:27

学习了MACD指标以后,我们通过量化回测来验证一下,这个指标能否帮我们挣到钱。我们还是使用Backtrader框架,实现MACD的交易策略,然后用苹果股票历史数据完成这个示例。

示例代码如下:

import backtrader as bt
import yfinance as yf

# 定义MACD策略
class MACDStrategy(bt.Strategy):
    params = (
        ('macd1', 12),
        ('macd2', 26),
        ('macdsig', 9),
    )

    def __init__(self):
        self.macd = bt.indicators.MACD(self.data, period_me1=self.params.macd1, 
                                       period_me2=self.params.macd2, period_signal=self.params.macdsig)
        self.crossover = bt.indicators.CrossOver(self.macd.macd, self.macd.signal)

    def next(self):
        if not self.position:
            if self.crossover > 0:
                commission_info = self.broker.getcommissioninfo(self.data)
                cash = self.broker.get_cash() - commission_info.getsize(1, self.data.close[0])
                size = cash // self.data.close[0]
                self.buy(size=size)
                print(f'BUY: {size} shares')
        elif self.crossover < 0:
            size = self.position.size
            self.close(size=size)
            print(f'SELL: {size} shares')

    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            return

        if order.status in [order.Completed]:
            if order.isbuy():
                print(f'BUY executed at {self.data.num2date(order.executed.dt).date()}, Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f}, Comm: {order.executed.comm:.2f}')
            elif order.issell():
                cost = order.executed.value
                profit = order.executed.value - order.created.size * order.created.price
                profit_percent = (profit / cost) * 100
                print(f'SELL executed at {self.data.num2date(order.executed.dt).date()}, Price: {order.executed.price:.2f}, Cost: {cost:.2f}, Profit: {profit:.2f}, Profit %: {profit_percent:.2f}%')

        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            print('Order Canceled/Margin/Rejected')

# 创建Cerebro引擎
cerebro = bt.Cerebro()

# 设置初始资金
cerebro.broker.setcash(100000.0)

# 下载苹果股票数据
data = yf.download('AAPL', '2020-01-01', '2023-12-30')
data = data.dropna()

# 将数据添加到Cerebro引擎中
data = bt.feeds.PandasData(dataname=data)
cerebro.adddata(data)

# 添加MACD策略
cerebro.addstrategy(MACDStrategy)

# 设置佣金为0.1%
cerebro.broker.setcommission(commission=0.001)

# 添加分析指标
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')

# 运行回测
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

# 获取回测结果
strat = results[0]
returns = strat.analyzers.returns.get_analysis()
sharpe = strat.analyzers.sharpe.get_analysis()
drawdown = strat.analyzers.drawdown.get_analysis()

# 打印回测指标
print('Annualized Return: %.2f%%' % (returns['rnorm100']))
print('Sharpe Ratio: %.2f' % (sharpe['sharperatio']))
print('Max Drawdown: %.2f%%' % (drawdown['max']['drawdown']))
print('Max Drawdown Period: %s' % (drawdown['max']['len']))


# 绘制回测结果
cerebro.plot()

这个示例代码的主要步骤如下:

  1. 导入必要的库:backtrader和yfinance。

  2. 定义MACD策略类MACDStrategy,继承自bt.Strategy。在策略类中:

    • 定义MACD指标的参数(快线、慢线和信号线的周期)。
    • __init__方法中创建MACD指标和交叉信号指标。
    • next方法中编写交易逻辑:当MACD线与信号线向上交叉时买入,向下交叉时卖出。
  3. 创建Cerebro引擎的实例cerebro

  4. 使用yfinance库获取苹果股票的历史数据,并将其转换为Backtrader可接受的数据格式。

  5. 将数据添加到Cerebro引擎中。

  6. 将MACD策略添加到Cerebro引擎中。

  7. 设置初始资金和交易佣金。

  8. 运行回测并绘制结果图表。

运行该代码后,将对苹果股票在2020年1月1日至2023年12月30日期间进行回测,使用MACD指标作为买卖信号,并绘制回测结果图表。图表将显示股票价格、MACD指标以及策略的买卖点。

运行的结果如下:

执行的结果:
Starting Portfolio Value: 10000.00 
Final Portfolio Value: 150972.73
Annualized Return: 10.87%
Sharpe Ratio: 0.50
Max Drawdown: 20.45%
Max Drawdown Period: 441

让我们逐一解读这个运行的结果:

  1. Starting Portfolio Value(初始投资组合价值): 10000.00

    这表示在回测开始时,投资组合的初始资金为10000.00。
  2. Final Portfolio Value(最终投资组合价值): 150972.73

    这表示在回测结束时,投资组合的最终价值为150972.73。与初始投资组合价值相比,投资组合的价值显著增加。
  3. Annualized Return(年化收益率): 10.87%

    年化收益率表示投资组合在一年内的平均收益率,考虑了复利效应。10.87%的年化收益率表示该策略在回测期间平均每年获得10.87%的回报。
  4. Sharpe Ratio(夏普比率): 0.50

    夏普比率衡量投资组合的风险调整后收益。它表示每单位风险(以标准差衡量)所获得的超额收益。0.50的夏普比率表示该策略在考虑风险的情况下获得了适度的回报。
  5. Max Drawdown(最大回撤): 20.45%

    最大回撤表示从峰值到谷值的最大百分比下跌。20.45%的最大回撤意味着在回测期间,投资组合从最高点下跌了20.45%。
  6. Max Drawdown Period(最大回撤周期): 441

    最大回撤周期表示从峰值到谷值,再到恢复到前期高点所经历的交易日数。441个交易日的最大回撤周期表示投资组合经历了较长时间的下跌和恢复过程。

综合来看,该MACD策略在回测期间取得了积极的结果:

  • 投资组合价值从10000增长到了150972.73,实现了显著的绝对收益。
  • 年化收益率为10.87%,表明策略在长期内提供了可观的回报。
  • 夏普比率为0.50,说明策略在风险调整后的基础上获得了适度的回报。
  • 最大回撤为20.45%,表明策略经历了一定程度的下跌,但仍然在可接受的范围内。

哈哈,通过个策略,我们回测的结果是好的,相当于4年挣了50%左右的回报,先开心一下。需要注意的是,回测结果并不能保证未来的表现,市场状况可能发生变化。在实际应用中,还需要考虑交易成本、滑点等因素,并对策略进行进一步的优化和调整。此外,还应该对策略进行更长时间段的回测,以评估其在不同市场环境下的稳健性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

server端

一、创建项目 expess server 1.1 安装nodemon npm i nodemon 1.2 设置连接数据库mongodb 安装mongoose npm i mongoose 在根目录新建config文件夹/db.config.js // 引入mongodb数据库操作模块 const mongoose require("mongoose") // 连接数据库mongoose.con…

【Git】日志功能

1. git日志显示 # 显示前3条日志 git log -3# 单行显示 git log --oneline# 图表日志 git log --graph# 显示更改摘要 git log --stat# 显示更改位置 git log --patch 或 git log -p# 查看指定文件的提交历史记录 git log {filename}例子1&#xff1a;单行显示 例子2&#xff…

自学编程的六种方法,你必须知道

随着互联网日趋迅猛&#xff0c;编程已经在我们生活当中无处不在了。众所周知&#xff0c;程序员的工资都很不错&#xff0c;于是越来越多的人&#xff0c;都想加入到编程的行业中来。那么如何加入到程序员的行业当中&#xff1f; PHP从入门到放弃&#xff0c;C语言从入门到放…

3款免费甘特图制作工具的比较和选择指南

GanntProject GanttProject https://www.ganttproject.biz/ 是一款项目管理和调度应用&#xff0c;适用于 Windows、macOS 和 Linux。它易于使用&#xff0c;无需任何设置&#xff0c;适用于个人用户和小型团队。该应用提供任务层次结构和依存关系、里程碑、基准行、Gantt 图表…

【深度学习】最强算法模型之:潜在狄利克雷分配(LDA)

潜在狄利克雷分配 1、引言2、潜在狄利克雷分配2.1 定义2.2 原理2.3 算法公式2.4 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 给我讲一讲LDA 小鱼&#xff1a;LDA&#xff1f; 你指的是&#xff1f; 小屌丝&#xff1a;就是算法模型的LDA啊&#xff0c; 你…

基于XGBoost和数据预处理的电动汽车车型预测

基于XGBoost和数据预处理的电动汽车车型预测 文章目录 基于XGBoost和数据预处理的电动汽车车型预测1、前言2、导入数据3、各县电动汽车采用情况条形图4、电动车类型饼图5、前5最欢迎的电动车制造商6、XGBoost模型6.1 字符串列的标识6.2 删除不相关的列6.3 编码分类变量6.4 电动…

【机器学习之---数学】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派&#xff08;传统学派&#xff09;认为样本信息来自总体&#xff0c;通过对样本信息的研究可以合理地推断和估计总体信息…

探究 HTTPS 的工作过程

目录 1. HTTPS 协议原理 1.1. 为什么要有HTTPS协议 1.2. 如何理解安全 1.3. HTTPS 协议是什么 2. HTTPS 的前置概念 2.1. 什么是加密 && 解密 2.2. 为什么要加密 2.3. 常见的加密方式 2.3.1. 对称加密 2.3.2. 非对称加密 2.4. 数据摘要 && 数据指纹…

Linux系统------------MySQL备份与恢复

目录 一、数据备份的重要性 二、数据库备份的分类 2.1从物理与逻辑的角度&#xff0c;备份可分为物理备份与逻辑备份 2.2从数据库的备份策略角度&#xff1a;备份可分为完全备份、差异备份、 增量备份 2.2.1完全备份 2.2.2差异备份 2.2.3增量备份 2.2.4备份方式比较 三…

白酒:生产过程的能耗分析与节能减排措施

在当今的绿色环保时代&#xff0c;节能减排已经成为各行各业关注的焦点。作为传统的白酒生产企业&#xff0c;云仓酒庄深知环境保护的重要性&#xff0c;并积极采取措施降低生产过程中的能耗&#xff0c;为可持续发展贡献力量。 在豪迈白酒的生产过程中&#xff0c;能耗主要来自…

【剑指offr--C/C++】JZ23 链表中环的入口结点 与哈希表

一、哈希表&#xff08;unordered_set&#xff09;知识点 unordered_set是一种无序的数据集合容器&#xff0c;元素和键同时存在&#xff0c;元素没有按任何特定的顺序排序&#xff0c;而是根据它们的散列&#xff08;hash&#xff09;值组织成桶&#xff0c;以允许直接通过值…

不花一分钱,10分钟搭建自己的网站

不花一分钱,10分钟搭建自己的网站 文章目录 不花一分钱,10分钟搭建自己的网站效果展示第1步 账号注册与登录第2步 新建仓库第3步 新建文件夹及文件第4步 网站发布部署大功告成 效果展示 课程效果展示 进阶效果展示 第1步 账号注册与登录 点击这里 https://gitee.com/&…

韶音、南卡、Oladance开放式耳机值得买吗?多维度测评实力最强品牌

​近期&#xff0c;不少朋友向我咨询关于开放式耳机的选购建议&#xff0c;他们反映市面上的开放式耳机在音质和佩戴舒适度方面表现参差不齐。面对众多品牌&#xff0c;消费者往往感到无从选择。针对这一问题&#xff0c;我将对市面上热门的韶音、南卡和Oladance三款开放式耳机…

linux将未分配空间分配到指定挂载点

lsblk命令查看硬盘&#xff0c;空间有200G&#xff0c;子分区加起来才100个G&#xff0c;有100个G未使用 lsblk给硬盘分配盘符 fidisk /dev/vda n 回车 回车 w将所有未分配的空间分区&#xff0c;这里有100个GB 查看分配的分区 /dev/vda4 fidisk -lpvcreate /dev/vda4查看…

武汉星起航:亚马逊跨境电商市场蓬勃发展,竞争日趋激烈

近年来&#xff0c;跨境电商行业如日中天&#xff0c;成为国际贸易的新宠。作为全球电商的领头羊&#xff0c;亚马逊凭借其卓越的物流、支付和售后服务体系&#xff0c;稳坐跨境电商领域的头把交椅。然而&#xff0c;在激烈的市场竞争与不断变化的消费者需求面前&#xff0c;亚…

Deepin中定义 ll 文件查看命令

Deepin中定义 ll 文件查看命令 一、概述1. 在终端中使用2. 配置本用户使用 一、概述 在Ubuntu中习惯使用 ll 命令作为查看文件系统数据&#xff0c;在Deepin中无法使用此命令。我们可以用ls命令去组装一个ll命令。 1. 在终端中使用 我们如果只使用一次&#xff0c;我们可以用…

Halcon与C#联合开发——1.读取图片、图像二值化

在vs中引入halcon控件 修改目标平台为 x64 拖出三个控件 代码展示 using System; using System.Windows.Forms; //引用支持halcon的命名空间 using HalconDotNet;namespace _1.HalconDisplay {public partial class Form1 : Form {// HObject 是Halcon库中表示图像和其他图形…

Mac系统微信小程序的保存位置和缓存清除

Mac系统微信小程序的保存位置和缓存清除 1.小程序的保存位置2.小程序的缓存清除 1.小程序的保存位置 /Users/<UserName>/Library/Containers/com.tencent.xinWeChat/Data/.wxapplet/packages进入该目录后可以看到有很多以AppID命名的文件夹 最后再使用手机查看该小程序的…

白酒:新型包装材料的选择与应用对产品形象的提升

随着消费者对产品包装的关注度不断提高&#xff0c;包装在提升产品形象和品牌价值方面发挥着越来越重要的作用。云仓酒庄深知包装的重要性&#xff0c;并积极探索和应用新型包装材料&#xff0c;以提升豪迈白酒的产品形象。 新型包装材料的选择与应用对于产品形象的提升具有显著…

springboot swagger 接口文档分组展示

例如将 controller 分成四类&#xff0c;分别放到四个包下&#xff1a; xxx.xxx.xxx.controller.manage xxx.xxx.xxx.controller.client xxx.xxx.xxx.controller.authority xxx.xxx.xxx.controller.common SwaggerConfig.java&#xff1a; import io.swagger.annotations.Api…