backtrader下的轮动策略模板,附年化20.6%的策略源码。

原创内容第700篇,专注量化投资、个人成长与财富自由。

原创日更700天,回首向来萧瑟处,也无风雨也无晴。

但行好事,莫问前程,持续改1%,为社群的同学们提供价值。

今天我们实现backtrader下的轮动策略模板。

这个模板有通用,几乎所有的策略都可以在此基础上派生。

class StrategyRolling(StrategyBase):# 参数定义params = dict(period=20,  # 动量周期topK=1,dropN=0,)def __init__(self, show_info=False):super(StrategyRolling, self).__init__(show_info)# 多标的需要循环定义指标self.sorters = {}for data in self.datas:self.sorters[data] = bt.indicators.ROC(data, period=self.p.period)def next(self):orderby = {}for data, sorter in self.sorters.items():orderby[data] = sorter[0]sorted_datas = [data for data, value in sorted(orderby.items(), key=lambda x: x[1], reverse=True)]selected = sorted_datas[self.p.dropN:self.p.topK]# 当前持仓holdings = self.get_current_holding_datas()if holdings and len(holdings) > 0:for h in holdings:if h not in selected:self.close(h)if len(selected) > 0:weight = 1 / len(selected)for data in selected:self.order_target_percent(data, weight * 0.99)

类定义和参数

  • StrategyRolling 类继承自 StrategyBase,这是一个交易策略的基类。

  • params 字典定义了策略的参数:

    • period:动量周期,默认为20,表示计算动量时使用过去20个交易日的数据。

    • topK:这个参数在代码中没有直接使用,通常用于选择动量排名前几的资产。

    • dropN:这个参数用于在排序后跳过前几个资产,可能是为了避免最近表现不佳的资产。

构造函数 __init__

  • 构造函数接受一个参数 show_info,用于控制是否显示额外的信息。

  • 调用父类的构造函数 super(StrategyRolling, self).__init__(show_info)

  • self.sorters 是一个字典,用于存储每个数据(资产)的动量指标。

  • 循环遍历 self.datas(这是一个包含所有资产数据的列表),为每个资产计算动量指标 ROC(Rate of Change,变化率指标),并将其存储在 self.sorters 字典中。

next 方法

  • next 方法是策略的核心,它在每个交易周期被调用。

  • orderby 字典用于存储每个资产及其动量值。

  • 循环遍历 self.sorters 字典,将每个资产的动量值存储在 orderby 字典中。

  • 使用列表推导式和排序函数对 orderby 字典的项进行排序,选择动量值最高的资产。

  • sorted_datas 是排序后的资产列表。

  • selected 是从 sorted_datas 中根据 dropN 和 topK 参数选择的资产列表。

交易逻辑

  • 获取当前持有的资产列表 holdings

  • 如果持有资产,检查这些资产是否在 selected 列表中。如果不在,则卖出这些资产。

  • 如果 selected 列表不为空,计算每个选中资产的购买权重,并将目标资产权重设置为总资产的 0.99 倍(可能是为了避免全仓操作)。

这个策略的基本思想是:在每个交易周期,计算所有资产的动量,选择动量最高的资产进行投资,同时卖出不在选择列表中的资产。这种策略假设动量高的资产在未来一段时间内会继续表现良好。

我们来调用这个模板:

from backtrader_extends.engine import Engine
from backtrader_extends.strategy import StrategyRollingsymbols = ['510300.SH','513500.SH',  # 标普500'159920.SZ',  # 恒生ETF'159915.SZ']
e = Engine(symbols=symbols)if __name__ == '__main__':e.run_strategy(StrategyRolling)#e.optstrategy(StrategyRolling, period=range(6, 30, 2), topK=range(1, 3, 1), dropN=range(0, 3, 1))e.show_result_empyrical()

图片

年化20.6%,效果还可以。

图片

代码在如下位置:

图片

AI量化实验室 星球,已经运行三年多,1200+会员。

quantlab代码交付至6.X版本,含几十个策略源代码,因子表达式引擎、遗传算法(Deap)因子挖掘引等,支持backtrader和bt引擎,每周五迭代一次,代码和数据在星球全部开源。

图片

作者:AI量化实验室(专注量化投资、个人成长与财富自由)

暴躁是因为能力不足,劳苦是因为方法不对。

图片

 扩展  •  历史文章   

• 如何把一个9.5%的策略优化至年化19%?| quantlab6.1代码发布:backtrader择时策略模板

创业板ETF调参,最优参数年化19.2%。

期货海龟策略,年化27.67% | 健康无碍,财富可解千愁

• AI量化实验室——2024量化投资的星辰大海

▼点击阅读原文,访问“AI量化实验室”策略集合

(http://www.ailabx.com/mall)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B2109 统计数字字符个数

B2109 统计数字字符个数 #include <iostream> using namespace std; # include <string.h> #include <ctype.h> #include <algorithm> int main(){ char str[256]; cin.getline(str,256); //fgets(str,256,stdin); int cnt 0; //for(size_t i 0…

使用AWS Lambda构建无服务器应用程序

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用AWS Lambda构建无服务器应用程序 AWS Lambda 简介 创建 AWS 账户 创建 Lambda 函数 配置触发器 编写和测试代码 示例代码&am…

如何在Word的表格中一次性插入多行?

当我们想在Word中的表格中一次性插入多行时&#xff0c;却发现内置的插入功能并没有插入行数选项。 此时我们只需要选择多行&#xff0c;例如&#xff0c;选择5行&#xff0c;以同样的步骤插入&#xff0c; 在下方就新增了5行。 同理&#xff0c;插入其他自定义行数。

【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024,11月29-12月1日)

大会官网&#xff1a;www.icadi.net (CVA为ICADI分会&#xff0c;网站沿用主会议&#xff1b;议程、出版将以主会为准&#xff09; 大会时间&#xff1a;2024年11月29-12月1日 大会地点&#xff1a;中国-天津 终轮截稿&#xff1a;2024年11月22号&#xff08;特殊情况联系会…

火山引擎VeDI数据服务平台:在电商场景中,如何解决API编排问题?

01 平台介绍 数据服务平台可以在保证服务高可靠性和高安全性的同时&#xff0c;为各业务线搭建数据服务统一出口&#xff0c;促进数据共享&#xff0c;为数据和应用之间建立了一座“沟通桥梁”。 同时&#xff0c;解决数据理解困难、异构、重复建设、审计运维困难等问题&#x…

网付碰一下支付系统功能分享来了!

随着碰一下支付代理骗局的持续曝光&#xff0c;越来越多的人都开始将目光转向了碰一下支付系统源码部署这一入局方式之上&#xff0c;使得这一项目愈加火爆的同时&#xff0c;也让网付等头部聚合支付公司成为了大家关注的焦点&#xff0c;连带着网付碰一下支付系统有哪些功能这…

ElasticSearch学习篇16_《检索技术核心20讲》进阶篇之空间检索

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 相关问题&#xff1a; 查询范围固定的需求 直接计算两点之间距离区域二进制编码GeoHash编码 查询范围不固定的需求 GeoHash编码索引结构设计 基于…

SSH详解

一、SSH 引入 在使用 https 协议访问我们的 Gitee 库的时候&#xff0c;如果我们想要克隆一个私有库&#xff0c;或者说想要使用 git push&#xff0c;我们都需要输入账户账号和密码&#xff0c;这样十分繁琐而且很不安全。 虽然我们可以使用 Git for Windows 的 Git Credent…

互联网大厂钟爱的压测工具分享,战绩可查!

双11来了&#xff0c;又到了一些互联网大厂技术团队疯狂&#xff08;~~加班&#xff09;~~备战的紧张时刻。 今天&#xff0c;为大家带来一期“互联网大厂亲测的压测工具分享”&#xff0c;并在结尾附上30天SaaS版免费体验&#xff01; 压力测试相比于监控而言&#xff0c;是…

mac-泛洪

泛洪攻击的类型 TCP SYN Flood&#xff1a; 攻击者向目标服务器发送大量的 TCP SYN 请求&#xff0c;但不完成握手过程。服务器为每个请求分配资源&#xff0c;最终可能耗尽其连接表&#xff0c;导致无法处理正常请求。 UDP Flood&#xff1a; 攻击者向目标发送大量的 UDP 数据…

【数据分享】1901-2023年我国省市县镇四级的逐年最高气温数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最高气温栅格数据和Excel和Shp格式的省市县镇四级逐月最高气温数据&#xff0c;原始的逐月最高气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月数据我们采用求年平均值的方法得到逐年最高…

算法笔记:Day-09(初始动态规划)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …

「Mac畅玩鸿蒙与硬件27」UI互动应用篇4 - 猫与灯的互动应用

本篇将带领你实现一个趣味十足的互动应用&#xff0c;用户点击按钮时猫会在一排灯之间移动&#xff0c;猫所在的位置灯会亮起&#xff08;on&#xff09;&#xff0c;其余灯会熄灭&#xff08;off&#xff09;。应用会根据用户的操作动态更新灯光状态和文本提示当前亮灯的位置&…

Python毕业设计选题:基于django+vue的4S店客户管理系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 员工信息管理 个人中心 车辆信息管理 售后服务管理 售后安排管理 车辆信…

优选算法精品——双指针

移动零 算法原理&#xff1a; 1.数组划分,数组分块 2.双指针算法 (利用数组下标来充当指针) 两个指针的作用: cur:从左往右扫描数组,遍历数组 dest:已处理的区间内,非零元素的最后一个位置 代码实现&#xff1a; cur 从前往后遍历的过程中: 1.遇到0元素:cur; 2.遇到 非零元…

音视频入门基础:FLV专题(22)——FFmpeg源码中,获取FLV文件音频信息的实现(中)

本文接着《音视频入门基础&#xff1a;FLV专题&#xff08;21&#xff09;——FFmpeg源码中&#xff0c;获取FLV文件音频信息的实现&#xff08;上&#xff09;》&#xff0c;继续讲解FFmpeg获取FLV文件的音频信息到底是从哪个地方获取的。本文的一级标题从“四”开始。 四、音…

一个由Deno和React驱动的静态网站生成器

大家好&#xff0c;今天给大家分享一个由 Deno React 驱动的静态网站生成器Pagic。 项目介绍 Pagic 是一个由 Deno React 驱动的静态网站生成器。它配置简单&#xff0c;支持将 md/tsx 文件渲染成静态页面&#xff0c;而且还有大量的官方或第三方主题和插件可供扩展。 核心…

已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘

部署GPTSoVITS过程中&#xff0c;开启一键三连进程发生&#xff0c;报错AsyncRequest object has no attribute _json_response_data 具体报错内容为 (GPTSoVITS) PS D:\Code\GPT-SoVITS-beta0706> python webui.py Running on local URL: http://0.0.0.0:9874 IMPORTANT:…

Chrome 130 版本开发者工具(DevTools)更新内容

Chrome 130 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、网络&#xff08;Network&#xff09;面板更新 1. 重新定义网络过滤器 网络面板获新增了一些过滤条件&#xff0c;这些过滤条件是根据反馈重新设计的&#xff0c;特定于类型的过滤条件保持不变&…

Java之包,抽象类,接口

目录 包 导入包 静态导入 将类放入包 常见的系统包 抽象类 语法规则 注意事项&#xff1a; 抽象类的作用 接口 实现多个接口 接口间的继承 接口使用实例 &#xff08;法一&#xff09;实现Comparable接口的compareTo()方法 &#xff08;法二&#xff09;实现Comp…