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

news2024/12/24 21:12:55

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

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

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

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

今天我们来整理因子集。

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

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

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

图片

from datafeed.factor.alpha import AlphaBase


class Alpha158(AlphaBase):

    def get_fields_names(self):
        # ['CORD30', 'STD30', 'CORR5', 'RESI10', 'CORD60', 'STD5', 'LOW0',
        # 'WVMA30', 'RESI5', 'ROC5', 'KSFT', 'STD20', 'RSV5', 'STD60', 'KLEN']
        fields = []
        names = []

        # kbar
        fields += [
            "(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.coloradmin.cn/o/1842285.html

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

相关文章

vmware workstation下centos7屏幕切换及大小调整

虚拟机版本&#xff1a;vmware workstation15.5.2 操作系统版本&#xff1a;centos 7.9.2009 一 图形界面和命令行界面切换方法 在CentOS 7中&#xff0c;可以使用以下方法切换界面&#xff1a; 1 使用快捷键切换&#xff1a;按下Ctrl Alt F2&#xff08;或F3&#xff0…

0.5 逐行扫描(Progressive scan)简介

0.5 逐行扫描简介 逐行扫描&#xff08;Progressive scan&#xff09;是一种将图像显示在扫描式的显示设备上的方法。 逐行扫描常被用在计算机显示器上。 逐行扫描按照从左到右&#xff0c;从上到下的顺序扫描图像的所有行。如下图&#xff1a; 下图粗略的将逐行扫描与隔行…

LORA、UNB无线网关物联网锁助力人才公寓智慧化管理

吸引和留住青年人才是城市持续发展的关键&#xff0c;解决青年人才住房问题又是其中重要一环。“人才跟着产业走、公寓跟着人才建”已成为全国各地新建及改造人才公寓的目标&#xff0c;“引才聚才”离不开人才公寓行业布局与发展。 人才公寓不同于普通的长短租公寓&#xff0c…

[HGAME 2022 week1]Matryoshka(古典密码混合)

题目&#xff1a; 直接说方法&#xff1a; 首先这是一段盲文&#xff0c;要先将盲文反转&#xff0c; 然后再用摩斯密码转换 将得到的字符串去掉“,”后&#xff0c;base16解码 在尝试维吉尼亚密码 再用base64解码 然后用凯撒密码 最后栅栏密码&#xff08;22栏&#xff09;

专家观点∣企企通采购供应链数字化总监于海生:如何利用数字化技术重构采购流程,推动企业降本增效?

摘要 数字化转型现已成为企业提升竞争力、实现降本增效的必由之路。企业应主动参与到数字经济的建设中&#xff0c;以数据资源为关键要素&#xff0c;以现代信息网络为主要载体&#xff0c;以信息通信技术的有效使用作为效率提升和经济结构优化的重要推动力的一系列经济活动&a…

基于STC12C5A60S2系列1T 8051单片机接收串口调试助手发送的固定长度字符串控制单片机的功能

基于STC12C5A60S2系列1T 8051单片机接收串口调试助手发送的固定长度字符串控制单片机的功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能…

广州化工厂可燃气体报警器检定检验:安全生产新举措显成效

随着科技的不断发展&#xff0c;可燃气体报警器的检定检验技术也在不断进步。 广州的一些化工厂开始采用先进的智能检测系统和数据分析技术&#xff0c;对报警器的性能进行更加精准和全面的评估。 这些新技术不仅能够提高检定检验的效率和准确性&#xff0c;还能够为化工厂的…

第11章 测试代码

第11章 测试代码 11.1 测试函数11.1.1 单元测试和测试用例11.1.2 可通过的测试11.1.3 未通过的测试11.1.4 测试未通过时怎么办11.1.5 添加新测试 11.2 测试类11.2.1 各种断言方法11.2.2 一个要测试的类11.2.3 测试 AnonymousSurvey 类11.2.4 11.1 测试函数 11.1.1 单元测试和测…

Rancher注册已有k8s集群

Rancher安装后注册K8s集群操作 1.Rancher安装 编辑docker—compose文件 version: 3.8services:rancher:image: registry.cn-hangzhou.aliyuncs.com/rancher-images/rancher:v2.8.5container_name: rancherprivileged: truerestart: unless-stoppedports:- "18080:80&qu…

2004年上半年软件设计师【下午题】试题及答案

文章目录 2004年上半年软件设计师下午题--试题2004年上半年软件设计师下午题--答案2004年上半年软件设计师下午题–试题

Ant Design Vue中的Table和Tag的基础应用

目录 一、Table表格 1.1、显示表格 1.2、列内容过长省略展示 1.3、完整分页 1.4、表头列颜色设置 二、Tag标签 2.1、根据条件显示不同颜色 2.2、控制关闭事件 一、Table表格 效果展示&#xff1a; 官网&#xff1a;Ant Design Vue 1.1、显示表格 <a-tableref&quo…

Simufact Additive仿真助力金属粘结剂喷射成型(MBJ)工业化

引 言 烧结过程中“设计”补偿变形的能力被视为是实现金属粘结剂喷射成型&#xff08;MBJ&#xff09;快速商业化的关键。针对烧结过程的仿真分析&#xff0c;Simufact Additive软件现已推出了MBJ仿真模块第三个版本&#xff0c;当前版本能够准确模拟烧结过程&#xff0c;预测…

微信多开器

由于微信的限制&#xff0c;我们平时只能登录一个微信&#xff0c;要登录多个微信一般需要多台手机&#xff0c;很显然这种方法很费手机&#xff01;&#xff01;一个微信多开神器可以给你省下好几台手机钱&#xff0c;抓紧拉下来放手机里落灰http://www.xbydon.online/?p132 …

Windows清理C盘的4类方法【新手小白专用】

一、系统清理法 1.磁盘清理 【Win R】启动命令提示符&#xff0c;输入【cleanmgr】,选择打开C盘&#xff0c;勾选要清理的文件 一般大的文件是【临时文件和下载的程序文件】 2.存储清理&#xff08;1&#xff09; 打开【设置】-【系统】-【存储】-【配置存储感知或立即运行…

Vue elementui表格

去除表头 <el-table:data"tableData"stripestyle"width: 100%":cell-style"{ text-align: justify-all }":show-header"false"></el-table>合并 <template><div class"elife-container"><el-ro…

大模型LLM微调技术进展与热门方法汇总

大模型微调是机器学习中的一项重要技术&#xff0c;旨在帮助我们降低成本&#xff0c;进一步提高模型的性能。具体来说&#xff0c;大模型微调指的是在现有预训练模型的基础上&#xff0c;根据特定任务数据进行微调&#xff0c;以适应任务的特定需求&#xff0c;以便我们更好地…

偏微分方程算法之抛物型方程差分格式编程示例四(Richardson外推)

目录 一、研究问题 二、C++代码 三、结果分析 一、研究问题 已知其精确解为。分别取以下三种步长: ①

口罩佩戴智能监测摄像机

智能监测摄像机在现代城市安全管理中扮演着关键角色&#xff0c;尤其是像口罩佩戴智能监测摄像机这样的设备&#xff0c;其应用正在日益扩展&#xff0c;对于公共卫生和安全至关重要。 这类摄像机利用先进的图像识别技术&#xff0c;能够实时监测人群中是否佩戴口罩。通过高精度…

GIAOTracker——一个用于多类、多对象追踪的综合框架探索

介绍 论文地址&#xff1a;https://arxiv.org/pdf/2202.11983.pdf 这篇论文探讨了人工智能图像处理领域中一项非常直观且令人兴奋的任务——在原始视频数据中检测和追踪单个物体。在图像处理的人工智能应用中&#xff0c;图像分类、物体检测和语义分割等任务经常被提及&#…

【查缺补漏】python

python查缺补漏 底板除 还有一种除法是//&#xff0c;称为地板除&#xff0c;两个整数的除法仍然是整数&#xff1a; >>> 10 // 3 3你没有看错&#xff0c;整数的地板除//永远是整数&#xff0c;即使除不尽。要做精确的除法&#xff0c;使用/就可以。 因为//除法只…