量化交易入门(二十四)MTM指标买卖逻辑和回测

MTM指标可以用来指导买卖决策,其基本逻辑如下:

  1. 买入信号:

    当MTM从负值上穿0线,并向上突破某个阈值(如20)时,表明上升动力充足,可以考虑买入。当MTM在0线上方并持续上升,创出新高时,表明上升趋势强劲,可以考虑加仓或持有。
  2. 卖出信号:

    当MTM从正值下穿0线,并向下突破某个阈值(如-20)时,表明下跌动力充足,可以考虑卖出。当MTM在0线下方并持续下降,创出新低时,表明下跌趋势强劲,可以考虑减仓或观望。
  3. 趋势追踪:

    当MTM持续在0线上方运行时,表明市场处于上升趋势,可以维持多头仓位。当MTM持续在0线下方运行时,表明市场处于下降趋势,可以维持空头仓位或者观望。
  4. 背离判断:

    当价格创新高,但MTM未能创新高,形成顶背离时,表明上升动力减弱,可以考虑卖出。当价格创新低,但MTM未能创新低,形成底背离时,表明下跌动力减弱,可以考虑买入。
  5. 均线系统:

    当MTM上穿其均线时,可以考虑买入;下穿均线时,可以考虑卖出。均线的选择可以根据自己的喜好,常用的有5日、10日、20日等。

 下面我们和前面两个指标一样,使用苹果的历史数据来回测一下,看看MTM指标能不能给我们带来收益。

回测的示例代码:

import backtrader as bt
import yfinance as yf

class MTMStrategy(bt.Strategy):
    params = (
        ('mtm_period', 10),
        ('buy_threshold', 0),
        ('sell_threshold', 0),
    )

    def __init__(self):
        self.mtm = bt.indicators.Momentum(self.data.close, period=self.params.mtm_period)

    def next(self):
        if not self.position:
            if self.mtm[0] > self.params.buy_threshold:
                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.mtm[0] < self.params.sell_threshold:
            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(MTMStrategy)

# 设置佣金为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()

示例代码使用Backtrader框架对苹果股票从2020年到2023年的数据进行回测。下面是对代码的详细解读:

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

  2. 定义MTMStrategy类,继承自bt.Strategy:

    • 定义策略参数:mtm_period(MTM指标周期)、buy_threshold(买入阈值)、sell_threshold(卖出阈值)。
    • 在__init__方法中,创建MTM指标(bt.indicators.Momentum)。
    • 在next方法中,编写交易逻辑:
      • 如果当前无持仓,且MTM指标大于买入阈值,则计算可用资金,并用全部资金买入股票。
      • 如果已有持仓,且MTM指标小于卖出阈值,则卖出全部持仓。
    • 在notify_order方法中,处理订单状态:
      • 如果订单状态为Completed,打印买入/卖出的执行信息,包括日期、价格、成本、佣金等。
      • 如果订单状态为Canceled/Margin/Rejected,打印相应信息。
  3. 创建Cerebro引擎,设置初始资金为100,000美元。

  4. 使用yfinance下载苹果股票2020年到2023年的数据,并将其添加到Cerebro引擎中。

  5. 将MTMStrategy添加到Cerebro引擎中。

  6. 设置佣金为0.1%。

  7. 添加分析指标:Returns(收益率)、SharpeRatio(夏普比率)、DrawDown(回撤)。

  8. 运行回测,打印回测前后的资金情况。

  9. 获取回测结果,并打印相关指标:

    • 年化收益率(Annualized Return)
    • 夏普比率(Sharpe Ratio)
    • 最大回撤(Max Drawdown)
    • 最大回撤期间(Max Drawdown Period)
  10. 绘制回测结果图表。

代码运行以后结果怎么样呢,我们一起来看一下。

执行结果:
Starting Portfolio Value: 10000.00 
Final Portfolio Value: 205910.77
Annualized Return: 19.83%
Sharpe Ratio: 1.64
Max Drawdown: 17.69%
Max Drawdown Period: 313

根据回测结果,我们可以得到以下信息:

  1. 最终资产组合价值(Final Portfolio Value)为205,910.77美元。相比初始的100,000美元,资产实现了105.91%的增长。这表明在回测期间,该MTM策略在苹果股票上取得了不错的收益。

  2. 年化收益率(Annualized Return)为19.83%。这意味着平均每年该策略能够提供19.83%的回报。这是一个相当可观的收益率,高于同期的许多其他投资机会。

  3. 夏普比率(Sharpe Ratio)为1.64。夏普比率衡量了策略的风险调整后收益,即每承受一单位风险,策略能够提供多少超额回报。一般来说,夏普比率大于1就被认为是不错的策略。1.64的夏普比率表明该MTM策略在回测期间提供了高于平均水平的风险调整后收益。

  4. 最大回撤(Max Drawdown)为17.69%。最大回撤衡量了从高点到低点的最大跌幅,反映了策略可能遭受的最大损失。17.69%的最大回撤说明在最糟糕的情况下,该策略可能会损失17.69%的资产。这个数值相对较高,投资者需要有相应的风险承受能力。

  5. 最大回撤期间(Max Drawdown Period)为313。这表示从回撤开始到恢复到之前的高点,共经历了313个交易日。这个时间较长,说明该策略可能面临一定的回撤风险,需要较长时间来恢复损失。

哈哈,不错不错,4年时间资产翻了一倍,想想都刺激。MTM策略在回测期间表现优异,取得了高于平均水平的收益和风险调整后收益。但是,该策略也面临着较大的回撤风险,投资者需要有足够的风险承受能力和长期投资的耐心。此外,回测结果只是基于历史数据的模拟,未来的表现可能与回测结果存在差异。

 注意,这个只是一个例子,不保证你能靠这个指标就一定能赚到钱,不构成投资建议,大家投资要结合实际情况谨慎投资。

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

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

相关文章

C++中stack的用法及其解析

一、stack的介绍 1.stack是一个容器适配器&#xff0c;它的名字叫做栈 专门用在后进先出的上下文环境中的&#xff0c;它的删除与插入操作只能从容器的一端进行。形象一点&#xff0c;就好像一个容器里放东西&#xff0c;先放进去的就在底部&#xff0c;要想拿出来&#xff0c;…

华为昇腾asend

昇腾Ascend C编程语言 Ascend C原生支持C/C编程规范&#xff0c;通过多层接口抽象、并行编程范式、孪生调试等技术&#xff0c;极大提高了算子的开发效率&#xff0c;帮助AI 参考文章 手把手教你在昇腾平台上搭建PyTorch训练环境 - 哔哩哔哩 (bilibili.com)https://www.bilibi…

PCL点云处理之重复随机采样一致性(RRANSAC法)平面拟合(二百三十七)

PCL点云处理之重复随机采样一致性(RRANSAC法)平面拟合(二百三十七) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 pcl::SAC_RRANSAC"是 PCL库中的一个方法,是 RANSAC 方法的改进版本,通过多次重复采样和模型拟合来提高鲁棒性。RRANSAC 的思想是在 RANSAC 的基…

双网卡环境概率出现DNS解析错误

测试环境 VMware Rocky Linux 9 虚拟机, 双网卡(eth0和eth1)配置如下&#xff1a; eth0 10.206.216.27/24 DNS 10.204.16.18 eth1 192.168.1.27/24 DNS 192.168.1.1问题描述 手动配置eth1的DNS后&#xff0c;网络不通&#xff0c;通过抓包发现是eth1的DNS server配置有误…

最新海外投资理财源码 amazon多语言投资理财系统源码 区块链理财项目平台源码 共享充电宝系统

一款新UI的海外多语言刷单系统&#xff0c;支持后台在线添加订单派单、预约派单、余额宝等功能 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88949885 更多资源下载&#xff1a;关注我。

Vue使用el-statistic和el-card显示大屏中的统计数据

​ 一、页面内容&#xff1a; <el-row :gutter"20"><el-col :span"6"><el-card class"box-card"><div><el-statisticgroup-separator",":precision"2":value"value2":title"tit…

上位机图像处理和嵌入式模块部署(qmacvisual图像修复)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 qmacvisual提供了一个图像修复的功能。所谓的图像修复&#xff0c;就是对图像中缺省的部分进行修补&#xff0c;它的操作&#xff0c;其实分成两个…

深入理解SSL协议:从理论到实践(二)

前言 这是一篇关于SSL协议的技术文章&#xff0c;有理论知识&#xff0c;但又兼具一定的实战性&#xff0c;文章的主要内容分享了SSL协议的核心概念、工作原理、常见的应用场景&#xff0c;以及就https这种实际应用场景&#xff0c;又着重分享具体的工作原理以及如何实现https…

【性能优化】 【回溯】 【字符串】1307. 口算难题

作者推荐 视频算法专题 本文涉及知识点 数学 回溯 字符串 性能优化 LeetCode1307. 口算难题 给你一个方程&#xff0c;左边用 words 表示&#xff0c;右边用 result 表示。 你需要根据以下规则检查方程是否可解&#xff1a; 每个字符都会被解码成一位数字&#xff08;0 - …

R: 网状Meta分析进行模型构建及图形绘制

网状meta分析的制作步骤主要包括&#xff1a; 1. 绘制网状证据图 2. 普通Meta分析&#xff08;两两之间的直接比较&#xff09; 3. 网状Meta分析&#xff08;整合直接比较和间接比较的结果&#xff0c;绘制相关图形&#xff09; 4. 绘制累积概率排序图 5. 三个假设的检验…

【Linux】网络基础1

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;一些常见网络设备&#x1f449;&#x1f3fb;网络协议(栈)&#x1f449;&#x1f3fb;协议分层OSI参考模型每个层…

CCF-CSP真题202206-2《寻宝!大冒险!》

题目背景 暑假要到了。可惜由于种种原因&#xff0c;小 P 原本的出游计划取消。失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期……直到…… 某天&#xff0c;小 P 获得了一张神秘的藏宝图。 问题描述 西西艾弗岛上种有 n 棵树&#xff0c;这些树的具体位置记录在…

【沐风老师】3DMAX顶点投影插件VertexProjection使用方法详解

3DMAX顶点投影插件VertexProjection使用教程 3DMAX顶点投影插件VertexProjection&#xff0c;将可编辑多边形顶点向下投影到网格对象表面。可以对可编辑多边形对象上的所有顶点或部分顶点进行投影。主要用于地形建模、道路交通等领域。 【适用版本】 3dMax 2010 - 2024&#x…

【前端】layui学习笔记

参考视频&#xff1a;LayUI 1.介绍 官网&#xff1a;http://layui.apixx.net/index.html 国人16年开发的框架,拿来即用,门槛低 … 2. LayUi的安装及使用 Layui 是一套开源的 Web UI 组件库&#xff0c;采用自身轻量级模块化规范&#xff0c;遵循原生态的 HTML/CSS/JavaScript…

解决VMWare Esxi 6.5.0 导出虚拟机时发生网络错误

解决办法&#xff1a;使用vmware ovftool工具导出。 1 先安装该工具到windows下面&#xff0c;有32位的和64位的 2 用管理员进入命令方式&#xff1a; 进入&#xff1a;c:\windows 进入工具命令当前文件夹&#xff08;具体看用户的安装路径&#xff09;&#xff1a; cd \p…

Docket常见的软件部署1

1 安装MySQL # 查看MySQL镜像 docker search mysql # 拉起镜像 docker pull mysql:5.7 # 创建MySQL数据映射卷&#xff0c;防止数据不丢失 mkdir -p /hmoe/tem/docker/mysql/data/ # 启动镜像 docker run -d --name mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /home…

(原型与原型链)前端八股文修炼Day5

一 原型链的理解 原型链定义&#xff1a; 原型链是 JavaScript 中实现对象继承的关键机制之一&#xff0c;它是一种对象之间的关系&#xff0c;通过这种关系&#xff0c;一个对象可以继承另一个对象的属性和方法。 原型链的组成&#xff1a; 每个对象都有一个指向另一个对象的…

抖音短视频矩阵系统源代码开发部署/SaaS贴牌/源码开源

抖音短视频矩阵系统的源代码开发部署可以分为以下几个步骤&#xff1a; 确定需求&#xff1a;首先&#xff0c;你需要确定你想要开发的具体功能和特性&#xff0c;比如用户注册、上传短视频、评论等。 开发源代码&#xff1a;根据需求&#xff0c;你可以选择使用合适的编程语言…

【安全用电管理系统的应用如何保证用电安全】Acrel-6000安科瑞智慧安全用电解决方案

政策背景 国家部委 ※2017年5月3日国务院安委会召开电气火灾综合治理工作视频会议&#xff0c;决定在全国范围内组织开展为期3年的电气火灾综合治理工作。 公安部领导 ※公安部副部长李伟强调&#xff1a;向科技要战斗力&#xff0c;加快推进“智慧消防”建设不断提升火灾防控…

通过组策略,统一发布桌面壁纸,并禁止用户更改

在Windows域环境中&#xff0c;可以通过组策略&#xff08;Group Policy&#xff09;来实现统一发布桌面壁纸并且禁止用户更改。以下是操作步骤&#xff1a; 打开“组策略管理”&#xff08;Group Policy Management Console, GPMC&#xff09;。 在GPMC中&#xff0c;选择你想…