Deap因子挖掘基础框架完成|量化私募投研的典型工作流程

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

继续因子挖掘:

因子挖掘,其实是一个“开放式的”,有很多tricks的工作,其实遗传算法不复杂。

说白了,根据你给定的“符号集”——就是表达式函数:比如ts_rank, log, exp等,然后你也可以使用技术分析的指标,反正就是函数。

一般遗传算法库都会有一个生成符号表达式的规则树,deap在这方面做得比gplearn好得多。——用强化学习来实现因子挖掘的逻辑也是类似的,后续我们会实现。

完整的代码如下:

import copyfrom deap_patch import *  # noqa
from deap import base, creator, gp
from deap import tools
from datafeed.mining.deap_alpha.add_ops import *
from datafeed.dataloader import CSVDataloader
from config import DATA_DIR_QUOTES
import pandas as pd
from loguru import loggerdef convert_inverse_prim(prim, args):"""Convert inverse prims according to:[Dd]iv(a,b) -> Mul[a, 1/b][Ss]ub(a,b) -> Add[a, -b]We achieve this by overwriting the corresponding format method of the sub and div prim."""prim = copy.copy(prim)converter = {'Add': lambda *args_: "{}+{}".format(*args_),'Mul': lambda *args_: "{}*{}".format(*args_),'fsub': lambda *args_: "{}-{}".format(*args_),'fdiv': lambda *args_: "{}/{}".format(*args_),'fmul': lambda *args_: "{}*{}".format(*args_),'fadd': lambda *args_: "{}+{}".format(*args_),# 'fmax': lambda *args_: "max_({},{})".format(*args_),# 'fmin': lambda *args_: "min_({},{})".format(*args_),'isub': lambda *args_: "{}-{}".format(*args_),'idiv': lambda *args_: "{}/{}".format(*args_),'imul': lambda *args_: "{}*{}".format(*args_),'iadd': lambda *args_: "{}+{}".format(*args_),# 'imax': lambda *args_: "max_({},{})".format(*args_),# 'imin': lambda *args_: "min_({},{})".format(*args_),}prim_formatter = converter.get(prim.name, prim.format)return prim_formatter(*args)def stringify_for_sympy(f):"""Return the expression in a human readable string."""string = ""stack = []for node in f:stack.append((node, []))while len(stack[-1][1]) == stack[-1][0].arity:prim, args = stack.pop()string = convert_inverse_prim(prim, args)if len(stack) == 0:break  # If stack is empty, all nodes should have been seenstack[-1][1].append(string)# print(string)return stringdef calc_ic(x, y):"""个体fitness函数"""ic = pd.Series(x.corr(y))return icdef map_exprs(evaluate, invalid_ind, gen, label, split_date):names, features = [], []for i, expr in enumerate(invalid_ind):names.append(f'GP_{i:04d}')features.append(stringify_for_sympy(expr))features = [f.lower() for f in features]#for name, feature in zip(names, features):#    print(name, ':', feature)all_names = names.copy()all_names.append(label)all_features = features.copy()all_features.append('label(close,5)')df = CSVDataloader(path=DATA_DIR_QUOTES.resolve(), symbols=['510300.SH']).load(all_features, all_names)df.set_index([df['symbol'], df.index], inplace=True)# df.dropna(inplace=True)# 将IC划分成训练集与测试集df_train = df[df.index.get_level_values(1) < split_date]df_valid = df[df.index.get_level_values(1) >= split_date]#print(df_train)#print(names, features)ic_train = df_train[names].groupby(level=0, group_keys=False).agg(lambda x: calc_ic(x, df_train[label])).mean()ic_valid = df_valid[names].groupby(level=0, group_keys=False).agg(lambda x: calc_ic(x, df_valid[label])).mean()#print('ic_train', ic_train)#print('ic_valid', ic_valid)results = {}for name, factor in zip(names, features):results[factor] = {'ic_train': ic_train.loc[name],'ic_valid': ic_valid.loc[name],}#print(results)return [(v['ic_train'], v['ic_valid']) for v in results.values()]def init_pset():pset = gp.PrimitiveSetTyped("MAIN", [], RET_TYPE)pset = add_constants(pset)pset = add_operators(pset)pset = add_factors(pset)return psetdef init_creator():# 可支持多目标优化# TODO 必须元组,1表示找最大值,-1表示找最小值FITNESS_WEIGHTS = (1.0, 1.0)creator.create("FitnessMulti", base.Fitness, weights=FITNESS_WEIGHTS)creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMulti)return creatordef init_toolbox(creator):toolbox = base.Toolbox()pset = init_pset()toolbox.register("expr", gp.genHalfAndHalf, pset=pset, min_=2, max_=5)toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.expr)toolbox.register("population", tools.initRepeat, list, toolbox.individual)toolbox.register("evaluate", print)  # 不单独做评估了,在map中一并做了toolbox.register("select", tools.selTournament, tournsize=3)  # 目标优化# toolbox.register("select", tools.selNSGA2)  # 多目标优化 FITNESS_WEIGHTS = (1.0, 1.0)toolbox.register("mate", gp.cxOnePoint)toolbox.register("expr_mut", gp.genFull, min_=0, max_=2)toolbox.register("mutate", gp.mutUniform, expr=toolbox.expr_mut, pset=pset)import operatortoolbox.decorate("mate", gp.staticLimit(key=operator.attrgetter("height"), max_value=17))toolbox.decorate("mutate", gp.staticLimit(key=operator.attrgetter("height"), max_value=17))from datetime import datetimedt1 = datetime(2021, 1, 1)LABEL_y = 'return_5'from itertools import counttoolbox.register('map', map_exprs, gen=count(), label=LABEL_y, split_date=dt1)return toolboxif __name__ == '__main__':import warningswarnings.filterwarnings('ignore', category=RuntimeWarning)logger.info('开始Deap因子挖掘...')random.seed(9527)creator = init_creator()toolbox = init_toolbox(creator)n = 100pop = toolbox.population(n=n)logger.info('完成初代种群初始化:{}个'.format(n))hof = tools.HallOfFame(10)# 只统计一个指标更清晰stats = tools.Statistics(lambda ind: ind.fitness.values)# 打补丁后,名人堂可以用nan了,如果全nan会报警stats.register("avg", np.nanmean, axis=0)stats.register("std", np.nanstd, axis=0)stats.register("min", np.nanmin, axis=0)stats.register("max", np.nanmax, axis=0)# 使用修改版的eaMuPlusLambdapopulation, logbook = eaMuPlusLambda(pop, toolbox,# 选多少个做为下一代,每次生成多少新个体mu=150, lambda_=100,# 交叉率、变异率,代数cxpb=0.5, mutpb=0.1, ngen=2,# 名人堂参数# alpha=0.05, beta=10, gamma=0.25, rho=0.9,stats=stats, halloffame=hof, verbose=True,# 早停early_stopping_rounds=5)print('=' * 60)print(logbook)print('=' * 60)def print_population(population):for p in population:expr = stringify_for_sympy(p)print(expr, p.fitness)print_population(hof)

这里当然还有很多工作要完善,但如果懂代码的同学,应该已经看出它的价值了,大家可以前往下载:

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

我们还会同步做一件事情——单因子评估。

说实话,构造一个因子很容易,遗传算法、强化学习或者ChatGPT来生成。你分分钟可以拿到成千上万上因子。

关键是如何分析因子,如何知道这个因子有用,以及怎么用——如何构建有效策略?

吾日三省吾身

昨天与星球管理员们开会讨论,分享星球下一步的计划,以及可以提供更多的服务等议题。

我的分享主要是,也是近期逐步想明白的——“职业投资的能力”。

这个能力如何量化呢?——应该是一个量化私募团队的能力。

一般10-100亿规模的公司,投研团队大致3-6人左右。

这与传统做应用开发的团队比较像。

其实,如果你是全栈,甚至可以自己搞定(外包一部分周边的活)。

量化私募投研的典型工作流程可以概括为以下几个步骤:

数据收集与整理:这是量化投资的基础环节,涉及到从各种数据源获取原始数据,并进行清洗和整理,以便后续分析使用。

因子挖掘与筛选:在数据准备好之后,下一步是通过统计学方法从大量数据中提取有用的信息因子,这些因子将用于构建投资模型。

策略设计与建模:根据选定的因子,设计并构建具体的量化投资策略。这一步通常需要编程实现,如使用Python等工具来编写和测试策略。

风险管理与优化:在策略建模完成后,需要对策略进行风险评估和优化,以确保策略在面对市场波动时能够保持稳定的表现。这可能包括设置止损点、分散投资等方法。

策略回测与验证:通过历史数据对策略进行回测,检验策略的有效性和稳健性。回测是量化投资中非常重要的一步,它帮助投资者了解策略在不同市场条件下的表现。

实施策略:一旦策略经过充分的回测并且表现良好,就可以开始实施策略。这可能包括连接交易平台、设置自动交易等操作。——这一步类似wonder trader这样的平台帮助到我们。

持续监控与调整:在策略实施过程中,需要持续监控其表现,并根据市场变化和策略表现进行必要的调整和优化。

数据是基础,这个毋庸置疑,“garbage in, garbage out”。但普通人和小团队,大家收集或者采购的数据都大差不差,这里做出差异化的可能性不高,尽量做得和大家一样即可。

重点是因子挖掘和策略设计,然后持续优化调整。

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

Deap因子挖掘:比gplearn强100倍(代码+数据)

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

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

相关文章

wordpress主题建站的步骤和流程

WordPress建站是一个涉及多个步骤的过程&#xff0c;包括选择主机、安装WordPress、选择和安装主题等。以下是详细的建站流程&#xff1a; 前期准备&#xff1a; 确定网站定位与目标受众&#xff1a;在开始建站之前&#xff0c;首先要明确你的网站定位和目标受众&#xff0c;…

个人笔记-python生成gif

使用文件的修改时间戳进行排序 import os import re import imageio# 设置图片所在的文件夹路径 folder_path /home/czy/ACode/AMAW_20240219/9.3.x(Discrete_time_marching&#xff09;/9.3.17.11.1(Disc_concessive_CH_ZJ)/current_figures # 文件夹路径&#xff1b;linux…

laravel开发新模块案例ChatGPT

laravel开发新模块案例 ChatGPT 2024年06月03日 10时13分Token: 1528 好的&#xff0c;以下是一个关于如何在Laravel应用中开发一个新模块的案例。这个示例将演示如何创建一个简单的博客模块&#xff0c;包括创建与管理文章的基本功能。 首先&#xff0c;确保你已经安装Larave…

电商核心技术系列58:电商平台的智能数据分析与业务洞察

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商核心技术揭秘56&#xff1a;客户关系管理与忠诚度提升 电商核心技术揭秘57:数…

Python语法构成:深度解析与实际应用

Python语法构成&#xff1a;深度解析与实际应用 Python&#xff0c;作为一种简洁、易读且功能强大的编程语言&#xff0c;其语法构成是其核心魅力之一。然而&#xff0c;对于初学者来说&#xff0c;Python的语法结构可能既具有吸引力又充满挑战。本文将从四个方面、五个方面、…

【Python系列】Python 方法变量参数详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

白酒:茅台镇白酒的醇厚口感与细腻层次

茅台镇&#xff0c;中国白酒的璀璨明珠&#xff0c;以其与众不同的自然环境和杰出的酿造技艺&#xff0c;孕育出了无数上好白酒。云仓酒庄豪迈白酒作为茅台镇的杰出品牌&#xff0c;以其醇厚口感和细腻层次&#xff0c;赢得了无数消费者的喜爱。 茅台镇地处赤水河畔&#xff0c…

训练集和测试集的分布一致性分析

规律一致性分析的实际作用   在实际建模过程中&#xff0c;规律一致性分析是非常重要但又经常容易被忽视的一个环节。通过规律一致性分析&#xff0c;我们可以得出非常多的可用于后续指导后续建模的关键性意见。通常我们可以根据规律一致性分析得出以下基本结论&#xff1a; …

ai写作神器app有哪些?好用的智能写作APP推荐

ai写作神器app有哪些&#xff1f;AI写作神器app在现代写作领域正迅速崭露头角&#xff0c;它们不仅极大提升了创作效率&#xff0c;而且通过集成前沿的人工智能技术&#xff0c;为创作者们提供了前所未有的便利。这些app能够智能分析写作需求&#xff0c;快速生成高质量的内容&…

十五、【源码】动态Sql

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/15-dynamic-sql 动态Sql 解析动态Sql分为两部分 1.解析XML中Sql的时候&#xff0c;要将其解析成不同的SqlNode节点&#xff0c;但是不进行…

Jenkins的jdk和maven配置

目录 传送门前言一、概念二、JDK的配置三、Maven配置四、环境变量配置五、坑 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyBatis框架&#xff08;精品&#xff09…

Python编程入门EPUB:探索编程世界的奇幻之旅

Python编程入门EPUB&#xff1a;探索编程世界的奇幻之旅 在数字化时代的浪潮中&#xff0c;编程已成为一项不可或缺的技能。而Python&#xff0c;作为一门简洁易懂且功能强大的编程语言&#xff0c;正逐渐成为初学者们的首选。那么&#xff0c;如何踏上Python编程的奇幻之旅呢…

「51媒体」媒体发布会如何做媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体发布会的媒体邀约是一个需要精心策划和准备的过程。 策划与准备阶段&#xff1a; 明确目标&#xff1a;明确发布会的目标、核心议题、举办日期、时间和地点。 准备资料&#xff1a…

体验式营销+旅行文化:品牌海外推广的创新之路

在全球化的时代背景下&#xff0c;体验式营销作为一种新兴的营销方式&#xff0c;以其独特的参与性、互动性和情感共鸣&#xff0c;成为品牌与消费者建立深层次联系的有效手段。而将体验式营销与旅行文化相结合&#xff0c;能够为海外消费者提供独特的品牌体验。本文Nox聚星将和…

邦芒职场:职业转型,如何稳稳把握方向盘?

职业转型&#xff0c;对于许多人来说&#xff0c;既是一次挑战也是一次机遇。虽然它需要勇气&#xff0c;但只要我们做好准备&#xff0c;转型之路同样可以顺畅无阻。接下来&#xff0c;我们将为你提供一些建议&#xff0c;帮助你稳稳把握职业转型的方向盘。 一、明确职业定位与…

GD32单片机开发--点亮第一盏灯

知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 目标 内容 开发流程 需求分析 项目新建 代码编写 GPIO初始化 完整代码 程序编译 程序烧录 烧录扩展&#xff08;熟悉&#xff09; 官方烧录器烧录&#xff08;熟悉&#xff09; 总结 前言 在本次项…

ArangoDB 学习笔记

新工作需要用到 arangodb&#xff0c;由于之前没有接触过&#xff0c;所以从头开始学&#xff0c;记录一下学习过程中的重点。 一. ArangoDB 安装 1. 下载地址 官网地址&#xff1a;https://www.arangodb.com/download/ 2. 部署步骤 下载 rpm 安装包并安装 rpm -ivh arang…

wpf、winform 监听USB拔插时触发

C# USB拔插监听 C#查找设备管理器中所有的 USB 设备 wpf、winform 监听USB拔插时触发 监听Windows USB 拔插时触发 private void MainWindow_Loaded(object sender, RoutedEventArgs e){FleckWebSocketConfig.OpenSocketConfig().GetAwaiter(); //websocket 服务开启用于监听W…

MySQL 判断查询条件是否包含某字符串的几种方式

在日常的数据库操作中&#xff0c;我们经常需要判断某个字段中是否包含特定的字符串。在 MySQL 中&#xff0c;有多种方式可以实现这一需求。本文将介绍几种常见的方式&#xff0c;并详细说明它们的使用场景和优缺点。 1. 使用 LIKE 进行模糊查询 LIKE 是最常见的字符串匹配方…

python手动搭建transformer,并实现自回归推理

以下是添加了详细注释的代码和参数介绍&#xff1a; Transformer 实现及自回归推理 本文展示了如何手动实现一个简化版的Transformer模型&#xff0c;并用自回归方式实现一个seq2seq任务&#xff0c;例如机器翻译。 导入必要的库 import torch import torch.nn as nn import…