机器学习模型与backtrader框架整合

news2024/10/6 2:20:09

原创文章第116篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。

北京疫情似乎还没有到拐点,但这三天结束后应该会到来。

今天重点说说,机器学习模型整合到我们的回测框架中,并与backtrader连接起来回测。

我们前面已经完成了数据标注,特征工程,数据集划分,模型准备,训练与评估等等。在测试集上生成pred_score用于排序即可。

01 排序算子

排序算子,就是在候选池或者已选择的标的池里,按某一个因子顺序选择前K个,比如动量从大到小选前2支,或者按机器模型预估的分数值,选前面K支。这个算法类似qlib里的TopK,qlib的更复杂一些,它是针对全市场选股,为了保证流动性,会强调淘汰排名靠后的后5支,但原理是类似的。

class SelectTopK:
    def __init__(self, K=1, order_by='order_by', b_ascending=False):
        self.K = K
        self.order_by = order_by
        self.b_ascending = b_ascending

    def __call__(self, context):
        stra = context['strategy']
        features = context['features']

        if self.order_by not in features.columns:
            logger.error('排序字段{}未计算'.format(self.order_by))
            return

        bar = get_current_bar(context)
        if bar is None:
            logger.error('取不到bar')
            return True
        bar.sort_values(self.order_by, ascending=self.b_ascending, inplace=True)

        selected = []
        pre_selected = None
        if 'selected' in context:
            pre_selected = context['selected']
            del context['selected']

        # 当前全候选集
        # 按顺序往下选K个
        for code in list(bar.code):
            if pre_selected:
                if code in pre_selected:
                    selected.append(code)
            else:
                selected.append(code)
            if len(selected) >= self.K:
                break
        context['selected'] = selected

主要逻辑的__call__函数中,即每次调用时计算。

1、检查确保order_by这段在数据中。

2、取当前日期的bar,对order_by字段进行排序(默认是升级,可以指定为降序)。

3、若是之前已有筛选子集,则使用这个子集;否则使用整体资产候选池子。

从前往后选K个即止。

02  机器学习计算pred_score

我们的引擎主体有add_features函数,

1、添加给backtrader的大脑。

2、由dataloader自动进行数据特征工程与数据标注。

def add_features(self, symbols, names, fields):
    # 1.添加数据集,即资产候选集
    for s in symbols:
        self.add_data(s)

    # 2.特征工程
    self.features = self.loader.load_one_df(symbols, names, fields)

3、我们下一步,进行数据预估。

def add_model(self, model, split_date, feature_names):
    self.dataset = Dataset(dataloader=self.loader, split_date=split_date, feature_names=feature_names)
    model.fit(self.dataset)
    self.features['pred_score'] = model.predict(self.dataset)
    print(self.features['pred_score'])

使用dataset对dataloader进行包装,可以自动划分时间序列数据集,使用model对数据集进行训练并评分。然后对数据进行预测,生成pred_score列。

后续的训练流程就是一样的了:

e.add_model(SklearnModel(RandomForestRegressor()), split_date='2020-01-01', feature_names=feature_names)

训练集上得分很高,但测试集上分是负的。(明显过拟合了)

使用SelectTopK算子,order_by='pred_score'进行排序。

e.run_algo_strategy([SelectTopK(K=1, order_by='pred_score',b_ascending=False), WeightEqually()])
e.analysis(pyfolio=False)

小结:今天把框架流程走通,明天继续优化。

代码与数据已经同步到星球-量化专栏。

ETF轮动+RSRS择时,加上卡曼滤波:年化48.41%,夏普比1.89

金融机器学习:数据集划分与baseline模型

etf动量轮动+大盘择时:年化30%的策略

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

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

相关文章

【Python模块】logging 日志模块

当入门一门语言时,最简单最直观的打印日志信息方式就是使用 print() 函数了,而这毕竟是自己练习和测试才会这样做。当参与项目时一定会去使用日志模块实现日志信息的打印和记录,而 Python 提供了内置的日志模块 logging,有必要深入…

解决每次打开pycharm都特别慢的几个方法

Python编写时,通常都会用vscode和pycharm两个工具,使用过程中,发现每次打开pycharm都特别特别慢,有时候要等十来分钟。相信大家可能都有遇到一样的情况,所以分享我自己的解决方法给大家参考。 1,每次需要关…

[附源码]java毕业设计置地房屋租赁信息系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

嵌入式驱动初级-中断

文章目录前言一、Linux 中断 API 函数二、Linux 中断实现三、中断上半部与下半部四、下半部机制之tasklet ---- 基于软中断五、按键中断下半部机制之tasklet六、下半部机制之workqueue ----- 基于内核线程七、按键中断下半部机制之workqueue前言 记录嵌入式驱动学习笔记 一、Li…

一文带你深入理解【Java基础】· 枚举类

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

Vision Transformer这两年

作者|Maximilian Schambach OneFlow编译 翻译|胡燕君、杨婷 在NLP领域取得巨大成功后,Transformer架构在计算机视觉方面的作用日渐凸显,成为越来越普遍的CV工具。自2020年10月Vision Transformer模型推出以来,人们开始…

《研究生学术与职业素养讲座》第七讲~第九讲作业答案

第七讲 八千里路云和月—2015年意大利米兰世博会中国馆设计 填空题(1分)单选题(1分)判断题(1分)多选题(2分)第八讲 从纳米研究看工程创新 填空题(1分)单…

干货 | 一条语句更新多个表

众所周知,多个服务器命中会减慢应用程序的速度。出于这个原因,开发人员致力于找尋使用最少的语句更新数据的最有效方法。事实证明,SQL UPDATE 语句确实支持使用以下语法设置多个表的字段: UPDATE table1, table2, ...SET column1…

2022-11-14 西安 activiti工作流(01)

语言确实有其局限性,但我相信:一件值得做的事情即使做的不怎么样也是值得的! 概念 1.流程审批以前的实现方式 在没有专门的工作流引擎之前,为了实现流程控制,通常的做法就是采用状态字段的值来跟踪流程的变化情况。通过状态字段的取值来决定…

【数据结构】二叉树优先级队列——堆

文章目录1. 树的概念及结构1.1 树的相关概念1.2 树的表示2. 二叉树的概念及其结构2.1 二叉树的概念2.2 特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储结构3. 堆3.1 堆的概念及结构3.2 堆的实现3.2.1 堆的创建3.2.2 堆的插入3.2.3 堆的向上调整算法3.2.4 堆的删除3.2.5 堆的向下…

javaSE--数据类型(复习)

一、变量和类型 变量 指的是 程序运行时 的 可变的量,相当于开辟一块内存空间来保存一些数据 类型 则是 对 变量的种类 进行了 划分,不同的类型 的 变量 具有不同特性 我们所讨论的"变量"主要 和 我们的"内存"这样的硬件设备密切相关…

value_counts()与count()的简单介绍

文章目录一,value_counts()(一)用法(二)参数介绍二,count()一,value_counts() (一)用法 value_counts()是针对某一列的数据中存在不同的值进行汇总计算 举例 data[dis…

昨天阅读量900

昨天周五了,阅读量还不错的,超过平均值700的,一看有900多呢

80211 TIM流量指示图 附C语言实现

TIM是什么? TIM:Traffic Indication Map,流量指示图。 在80211协议节能模式中,AP会缓存下行数据,AP就是通过beacon帧中TIM来告知休眠中的STA有数据需要接收。 DTIM:Delivery Traffic Indication Map&#…

css引入其它字体

1、下载需要的字体,放到下图的文件夹中。 2、把下载的字体文件放到项目的font目录下 3、在css中加入下面的代码 font-face {font-family: "思源黑体";src: url("../font/SourceHanSansCN-Normal.ttf"); } * { font-family: "思源黑体&quo…

【计算机网络】Cookie、Session和上传文件重点知识汇总

目录 1.Cookie基础知识: 2.Session基础知识: 3.相关API: 3.1.HttpServletRequest类: 3.2.HttpServletResponse类: 3.3.HttpSession类: 3.4.Cookie类: 3.5.模拟实现登录页面 4.上传文件…

伸展树原理介绍

一 点睛 伸展树,也叫作分裂树,是一种二叉搜索树,可以在 O (logn ) 内完成插入、查找和删除操作。在任意数据结构的生命周期内执行不同操作的概率往往极不均衡,而且各操作之间有极强的相关性,在整体上多呈现极强的规律…

【LeetCode】882. 细分图中的可到达节点

题目描述 给你一个无向图(原始图),图中有 n 个节点,编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。 图用由边组成的二维数组 edges 表示,其中 edges[i] [ui…

ESG,TO B长期主义里的「新战役」

中国企业最好的方式是从初始阶段就植入ESG基因,使它逐渐从隐形变成显性基因。长期坚持此类发展导向,对后续发展ESG战略,提升ESG合规能力也将成为一种积累和准备。 作者|三七 编辑|皮爷 出品|产业家 20世纪初期,伦敦得到一个延…

MyBaits-Plus中@TableField和@TableId用法

目录 前言 一、TableField(value "表字段") 二、TableField(select false) 三、TableField(exist false) 四、TableId(type IdType.AUTO)补充 总结 前言 接着前两篇mybatis-plus的知识点 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀…