当前位置: 首页 > news >正文

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.mrgr.cn/news/65959.html

相关文章:

  • mybatis源码解析-sql执行流程
  • 音频内容理解
  • vue3 怎么判断数据列是否包某一列名
  • 如何选择最适合的消息队列?详解 Kafka、RocketMQ、RabbitMQ 的使用场景
  • 高级SQL技巧详解与实例
  • CSS网格布局
  • 连锁餐饮企业-凡塔斯,用千里聆RPA搭建用户评价管理系统,提升门店服务满意度
  • Qt项目实战:银行利息(贷款)计算器
  • druid-multi-tenant-starter将系统改造成多租户系统如此简单
  • 企业邮箱后缀优化:提升邮件送达率的策略!
  • 三周精通FastAPI:32 探索如何使用pytest进行高效、全面的项目测试!
  • W55RP20-EVB-Pico评估板介绍
  • Android camera2
  • 全面提升小程序用户体验,让你的小程序一举夺目
  • 【Rust中的迭代器】
  • 植物神经紊乱不用怕,这些维生素来帮你!
  • OJ03:删除有序数组中的重复项
  • PHP电商供应链ERP管理系统小程序源码
  • SQL优化 - group by优化
  • 俄罗斯市场开发秘籍大公开
  • Vagrant使用教程:创建CentOS 8虚拟机
  • Ubuntu20.04两种安装及配置中文界面、输入法、换源、共享文件夹实现,及注意事项
  • 从0到1!手把手教你私域流量变现的5个必备技能
  • 使用实例讲解RTOS的内核结构、任务调动、资源管理、中断处理
  • 把握数字化新趋势,迎接生态架构新时代——The Open Group 2024生态系统架构·可持续发展年度大会参会指南
  • sql中判断一个字段是否包含一个数据的方法