Quantlab整合Alpha158因子集,为机器学习大类资产配置策略做准备(代码+数据)

原创文章第565篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。

我们的研报得现工作,用了两篇文章讲数据准备:

【研报复现】年化16.19%,人工智能多因子大类资产配置策略

【研报复现】年化27.1%,人工智能多因子大类资产配置策略之benchmark

今天我们来整理因子集。

研报里没有给出因子细节,我的解读是“根本不重要”。

因此,我就用qlib的Alpha158,结合部分WorldQuant101,还有常用的Ta-lib的技术分析指标来构建因子集。

我把函数集统一了命名,补充了一些函数:Alpha158可以正常工作了:

图片

from datafeed.factor.alpha import AlphaBaseclass Alpha158(AlphaBase):def get_fields_names(self):# ['CORD30', 'STD30', 'CORR5', 'RESI10', 'CORD60', 'STD5', 'LOW0',# 'WVMA30', 'RESI5', 'ROC5', 'KSFT', 'STD20', 'RSV5', 'STD60', 'KLEN']fields = []names = []# kbarfields += ["(close-open)/open","(high-low)/open","(close-open)/(high-low+1e-12)","(high-greater(open, close))/open","(high-greater(open, close))/(high-low+1e-12)","(less(open, close)-low)/open","(less(open, close)-low)/(high-low+1e-12)","(2*close-high-low)/open","(2*close-high-low)/(high-low+1e-12)",]names += ["KMID","KLEN","KMID2","KUP","KUP2","KLOW","KLOW2","KSFT","KSFT2",]# =========== price ==========feature = ["OPEN", "HIGH", "LOW", "CLOSE"]windows = range(5)for field in feature:field = field.lower()fields += ["shift(%s, %d)/close" % (field, d) if d != 0 else "%s/close" % field for d in windows]names += [field.upper() + str(d) for d in windows]# ================ volume ===========fields += ["shift(volume, %d)/(volume+1e-12)" % d if d != 0 else "volume/(volume+1e-12)" for d in windows]names += ["VOLUME" + str(d) for d in windows]# ================= rolling ====================windows = [5, 10, 20, 30, 60]fields += ["shift(close, %d)/close" % d for d in windows]names += ["ROC%d" % d for d in windows]fields += ["mean(close, %d)/close" % d for d in windows]names += ["MA%d" % d for d in windows]fields += ["std(close, %d)/close" % d for d in windows]names += ["STD%d" % d for d in windows]#fields += ["slope(close, %d)/close" % d for d in windows]#names += ["BETA%d" % d for d in windows]fields += ["ts_max(high, %d)/close" % d for d in windows]names += ["MAX%d" % d for d in windows]fields += ["ts_min(low, %d)/close" % d for d in windows]names += ["MIN%d" % d for d in windows]fields += ["quantile(close, %d, 0.8)/close" % d for d in windows]names += ["QTLU%d" % d for d in windows]fields += ["quantile(close, %d, 0.2)/close" % d for d in windows]names += ["QTLD%d" % d for d in windows]#fields += ["ts_rank(close, %d)" % d for d in windows]#names += ["RANK%d" % d for d in windows]fields += ["(close-ts_min(low, %d))/(ts_max(high, %d)-ts_min(low, %d)+1e-12)" % (d, d, d) for d in windows]names += ["RSV%d" % d for d in windows]fields += ["ts_argmax(high, %d)/%d" % (d, d) for d in windows]names += ["IMAX%d" % d for d in windows]fields += ["ts_argmin(low, %d)/%d" % (d, d) for d in windows]names += ["IMIN%d" % d for d in windows]fields += ["(ts_argmax(high, %d)-ts_argmin(low, %d))/%d" % (d, d, d) for d in windows]names += ["IMXD%d" % d for d in windows]fields += ["correlation(close, log(volume+1), %d)" % d for d in windows]names += ["CORR%d" % d for d in windows]fields += ["correlation(close/shift(close,1), log(volume/shift(volume, 1)+1), %d)" % d for d in windows]names += ["CORD%d" % d for d in windows]fields += ["mean(close>shift(close, 1), %d)" % d for d in windows]names += ["CNTP%d" % d for d in windows]fields += ["mean(close<shift(close, 1), %d)" % d for d in windows]names += ["CNTN%d" % d for d in windows]fields += ["mean(close>shift(close, 1), %d)-mean(close<shift(close, 1), %d)" % (d, d) for d in windows]names += ["CNTD%d" % d for d in windows]fields += ["sum(greater(close-shift(close, 1), 0), %d)/(sum(abs(close-shift(close, 1)), %d)+1e-12)" % (d, d)for d in windows]names += ["SUMP%d" % d for d in windows]fields += ["sum(greater(shift(close, 1)-close, 0), %d)/(sum(abs(close-shift(close, 1)), %d)+1e-12)" % (d, d)for d in windows]names += ["SUMN%d" % d for d in windows]fields += ["(sum(greater(close-shift(close, 1), 0), %d)-sum(greater(shift(close, 1)-close, 0), %d))""/(sum(abs(close-shift(close, 1)), %d)+1e-12)" % (d, d, d)for d in windows]names += ["SUMD%d" % d for d in windows]fields += ["mean(volume, %d)/(volume+1e-12)" % d for d in windows]names += ["VMA%d" % d for d in windows]fields += ["std(volume, %d)/(volume+1e-12)" % d for d in windows]names += ["VSTD%d" % d for d in windows]fields += ["std(abs(close/shift(close, 1)-1)*volume, %d)/(mean(abs(close/shift(close, 1)-1)*volume, %d)+1e-12)"% (d, d)for d in windows]names += ["WVMA%d" % d for d in windows]fields += ["sum(greater(volume-shift(volume, 1), 0), %d)/(sum(abs(volume-shift(volume, 1)), %d)+1e-12)"% (d, d)for d in windows]names += ["VSUMP%d" % d for d in windows]fields += ["sum(greater(shift(volume, 1)-volume, 0), %d)/(sum(abs(volume-shift(volume, 1)), %d)+1e-12)"% (d, d)for d in windows]names += ["VSUMN%d" % d for d in windows]fields += ["(sum(greater(volume-shift(volume, 1), 0), %d)-sum(greater(shift(volume, 1)-volume, 0), %d))""/(sum(abs(volume-shift(volume, 1)), %d)+1e-12)" % (d, d, d)for d in windows]names += ["VSUMD%d" % d for d in windows]return fields, names

计算出来Qlib的159个因子,

图片

其实因子就是原始数据的数学变形。

在线性模型里还需要分析“多重共线性”的问题,但在机器学习里,反正就是一股脑进去,树模型还能把重要的特征筛选出来。

接下来就是数据集做一个量纲的统一,预处理之类的。

Qlib里有类似的预处理函数:

图片

def __call__(self, df):

        def normalize(x, min_val=self.min_val, max_val=self.max_val):

            return (x - min_val) / (max_val - min_val)

这里的预处理需要格外小心,不能引入未来函数。

本质是是做归一化,避免量纲不同,模型训练失真。

研报结论是CSMinMax效果最好,所谓CSMinMax就是在截面(时间,即calc_by_date),也就是每天对因子数据进行MinMax的归一化。——这一点上符合逻辑,从机器学习的角度,每天的数据是一个样本,而样本进行minmax,相对大小没有发生改变,只是“归一化”到0-1之间,更符合特定分布。

def cs_minmax(se: pd.Series):return (se - se.min()) / (se.max() - se.min())

图片

后续可以引入lightGBM机器学习模型,进行训练和策略开发。

有同学在问的优惠券:

阅读

《特斯拉传-万物皆我》,这本书读完了。

与其说读完了,不如说翻完了。

这本书确实写得一般,不同于传统传记,他的写作,更像是要与特斯拉融入一体,那种半梦半醒,活在自我构建的世界,那种感觉。

一个不为名,不为钱的怪才,狂热的科学实验爱好者。

注定是孤独的。

普通人无法成为特斯拉、图灵,我想也不愿意身边的人,成为他们。

但我们有可能“成为”爱迪生。——实用主义,解决问题,有美满的家庭,儿女成群,世人拥戴。

我想,只是欲望不过度,不伤害其他人,一定的财富与名利是好的。

本周要的书,估计是《点亮黑夜——爱迪生传》。

由于有这一次教训,我特意在电子书平台看了半章,确保内容不会再出现这样的问题。

“FIRE与退休”

之前聊过比较多“FIRE——财务自由,提前退休”的方式,也聊过“500,10%”的财务自由逻辑。

现在把这种方式,归入ABCZ的Z计划。

因为所谓退休,是一种心态。

即你不为设想中的明天而放弃今天的生活,就是退休的状态。

比如,你能很大程度上享受当下在做的事情,或者工作,就是一个退休之状态。

历史文章:

【研报复现】年化27.1%,人工智能多因子大类资产配置策略之benchmark

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

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

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

相关文章

云服务器部署Neo4j

文章目录 导读安装Neo4j先去官网看看下载安装包如果真的下载了rpm安装包 插件 导读 大模型&#xff0c;他终于来了。 不过呢&#xff0c;大模型相关&#xff0c;现在也就跟着热点去尝试一下multi-agent的RAG方向&#xff0c;看看能做到什么地步。总之我们先从安装neo4j开始。…

QT自定义标题栏窗口其二:实现拖动及可拉伸效果 + 顶部全屏/侧边半屏

1、效果 2、核心代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent<

学习笔记——网络管理与运维——SNMP(基本配置)

四、SNMP基本配置 1、SNMP配置举例 整个华为数通学习笔记系列中&#xff0c;本人是以网络视频与网络文章的方式自学的&#xff0c;并按自己理解的方式总结了学习笔记&#xff0c;某些笔记段落中可能有部分文字或图片与网络中有雷同&#xff0c;并非抄袭。完处于学习态度&#x…

蓝鹏测控公司全长直线度算法项目多部门现场组织验收

关键字:全场直线度算法,直线度测量仪,直线度检测,直线度测量设备, 6月18日上午&#xff0c;蓝鹏测控公司全长直线度算法项目顺利通过多部门现场验收。该项目由公司技术部、开发部、生产部等多个部门共同参与&#xff0c;旨在提高直线度测量精度&#xff0c;满足高精度制造领域需…

118 杨辉三角

题目 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 解析 就是模拟法&#xff0c;没有什么特殊的…

Spring Cloud全家桶(上)【Nacos、OpenFeign、LoadBalancer、GateWay、金丝雀灰色发布】

0.零基础入门微服务实战课 1.微服务和 Spring Cloud1.1 什么是微服务&#xff1f;1.2 什么是 Spring Cloud&#xff1f;1.3 微服务 VS Spring Cloud 2.为什么要学微服务&#xff1f;3.Spring Cloud 组件介绍1.什么是 Nacos?1.1 Nacos 功能1.1.1 配置中心1.1.2 注册中心 1.2 Na…

2024年6月20日 (周四) 叶子游戏新闻

超市播音系统: 定时播放不同音乐 强制卸载软件: 一款强制卸载软件 免费多人沙盒游戏《宝藏世界》推出更新“潮起潮落”&#xff0c;带来全新克苏鲁风冒险准备好迎接一场超凡的冒险吧&#xff0c;MMORPG发行商gamigo宣布《宝藏世界》的最新更新&#xff1a;“潮起潮落”。这次更…

模拟原神圣遗物系统-小森设计项目,设计圣遗物(生之花,死之羽,时之沙,空之杯,理之冠)抽象类

分析圣遗物 在圣遗物系统&#xff0c;玩家操控的是圣遗物的部分 因此我们应该 物以类聚 人与群分把每个圣遗物的部分&#xff0c;抽象出来 拿 生之花&#xff0c;死之羽为例 若是抽象 类很好的扩展 添加冒险家的生之花 时候继承生之花 并且名称冒险者- 生之花 当然圣遗物包含…

Pikachu靶场--RCE

参考借鉴 pikachu-RCE_pikachu rce-CSDN博客 Pikachu靶场-RCE远程命令/代码执行漏洞-CSDN博客 命令执行/代码执行/RCE&#xff08;CTF教程&#xff0c;Web安全渗透入门&#xff09;_bilibili exec"ping" 输入IP地址查看页面反应 可以在IP地址的后面拼接我们想要执行…

【全开源】快递寄件小程序源码(FastAdmin+ThinkPHP+原生微信小程序)

&#x1f4e6;快递寄件小程序&#xff1a;轻松寄送&#xff0c;便捷生活 &#x1f69a;一、引言&#xff1a;告别繁琐&#xff0c;让寄件更简单 在繁忙的生活中&#xff0c;寄送快递往往成为我们的一大难题。传统的寄件方式需要前往快递公司网点&#xff0c;填写繁琐的寄件信…

五十、openlayers官网示例JSTS Integration解析——使用JSTS 库来处理几何缓冲区并在地图上显示结果

官网demo地址&#xff1a; JSTS Integration 这篇讲了如何在地图上添加缓冲图形 什么叫做缓冲几何&#xff1f; 几何缓冲&#xff08;Geometric Buffering&#xff09;是指在 GIS&#xff08;地理信息系统&#xff09;和计算几何中&#xff0c;围绕一个几何对象创建一个具有…

eclipse 老的s2sh(Struts2+Spring+Hibernate) 项目 用import导入直接导致死机(CPU100%)的解决

1、下载Apache Tomcat - Apache Tomcat 8 Software Downloads 图中是8.5.100的版本&#xff0c;下面的设置用的是另一个版本的&#xff0c;其实是一样。 2、先将Server配好&#xff0c;然后再进行导入操作。 2、选择jdk 当然&#xff0c;这里也可以直接“Download and instal…

【Unity设计模式】状态编程模式

前言 最近在学习Unity游戏设计模式&#xff0c;看到两本比较适合入门的书&#xff0c;一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 这两本书介绍了大部分会使用到的设计模式&#xff0c;因此很值得学习 本…

【数据结构】红黑树实现详解

在本篇博客中&#xff0c;作者将会带领你使用C来实现一棵红黑树&#xff0c;此红黑树的实现是基于二叉搜索树和AVLTree一块来讲的&#xff0c;所以在看本篇博客之前&#xff0c;你可以先看看下面这两篇博客 【C】二叉搜索树-CSDN博客 【数据结构】AVLTree实现详解-CSDN博客 在这…

使用opencv合并两个图像

本节的目的 linear blending&#xff08;线性混合&#xff09;使用**addWeighted()**来添加两个图像 原理 (其实我也没太懂&#xff0c;留个坑&#xff0c;感觉本科的时候线代没学好。不对&#xff0c;我本科就没学线代。) 源码分析 源码链接 #include "opencv2/imgc…

spark学习总结

系列文章目录 第1天总结&#xff1a;spark基础学习 1- Spark基本介绍&#xff08;了解&#xff09;2- Spark入门案例&#xff08;掌握&#xff09;3- 常见面试题&#xff08;掌握&#xff09; 文章目录 系列文章目录前言一、Spark基本介绍1、Spark是什么1.1 定义1.2 Spark与M…

从0进入微服务需要了解的基础知识

文章目录 系统架构演化过程为什么要了解系统架构的演化过程技术发展认知技术选型与创新 演变过程单体架构分层-分布式集群微服务 分布式\集群\微服务 微服务中的核心要素-拆分原则项目拆分与复杂度微服务的拆分维度有哪些小结 微服务中的核心要素服务化进行拆分后一定是微服务&…

Unity和UE免费领恐怖书本头怪兽角色模型恐怖或奇幻游戏monster适合FPS类型PBR202406202143

Unity和UE免费领恐怖书本头怪兽角色模型恐怖或奇幻游戏monster适合FPS类型PBR202406202143 Unity恐怖书本头怪兽角色模型&#xff1a;https://prf.hn/l/zpBqgVl UE恐怖书本头怪兽角色模型&#xff1a;https://prf.hn/l/4PzY1Qy 作者其他资产&#xff1a;https://prf.hn/l/0…

百万级 QPS 接入层网关架构方案演进

文章目录 前言1、单机架构2、DNS 轮询3、Nginx 单机4、Nginx 主备 Keepalived5、LVS 主备 Keepalived Nginx 集群6、LVS 主备 Keepalived Nginx 集群 DNS 轮询 前言 随着PC、移动互联网的快速发展&#xff0c;越来越多的人通过手机、电脑、平板等设备访问各种各样APP、网…

OCC介绍及框架分析

1.OCC介绍 Open CASCADE &#xff08;简称OCC&#xff09;是一开源的几何造型引擎&#xff0c;OCCT库是由Open CASCADE公司开发和市场运作的。它是为开源社区比较成熟的基于BREP结构的建模引擎&#xff0c;能够满足二维三维实体造型和曲面造型&#xff0c;国内研究和使用它的单…