gplearn遗传算法应用于CTA因子挖掘:手把手教程(代码+数据下载)
gplearn系列:使用因子rank ic评估因子性能(代码+数据)
大家知道,原生的GPLearn并不适合挖掘因子,主要存在以下几个问题:
1、gplearn只支持单标的,在CTA策略单标的可以,但单标的下挖掘的因子,很容易过拟合。
2、内置的函数不适合金融量化因子,需要自己扩展。而且原生的扩展,不支持常数项,比如SMA(10),这个10就是常数。
3、原生的fitness是ic和Rank IC,不支持夏普比或者卡玛比率这种。
4、而且网上能用的代码有限,版本鱼龙混杂,不成体系,或者文档不全。
5、传统的因子挖掘方法大多基于遗传规划(Genetic Programming)方法,这类方法具有收敛速度慢、超参数难以调优等局限;
网上的代码都是“暴改”之后的,且没有文档,demo未必能跑通。
我给大家跑通了一份,但是基于qlib的,与DeepAlpha同构,后续以这份代码为蓝本了。
大家直接pip install -r requirements.txt即可(python 3.8)
基于A股的qlib数据也会打包给大家,置于~/.qlib/qlib_data/cn_data_rolling目录下:
代码已经发布至星球:AI量化实验室——2024量化投资的星辰大海
1、支持GPLearn, DSO以及强化学习的版本。
2、数据目前的A股全量数据,qlib格式。
3、支持多支股票同时挖掘。
4、支持多因子联合评测。
原创文章第461篇,专注“AI量化投资、个人成长与财富自由”。
本周的重点是gplearn应用于CTA策略的因子挖掘,已经有两篇文章:
gplearn遗传算法应用于CTA因子挖掘:手把手教程(代码+数据下载)
gplearn系列:使用因子rank ic评估因子性能(代码+数据)
代码统一于本周五(明天)在星球更新,包括CTA回测框架、数据,因子挖掘等:AI量化实验室——2024量化投资的星辰大海
今天继续:
gpquant已经扩展了不少内容,我们可以拿过来用。
使用沪深300ETF的数据,很多同学问,股票行不行,其实咱们的代码和框架,你换成ETF,股票,期货或者加密货币,都差不多,我没有使用市场相关的东西。
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.utils import *
from gpquant.SymbolicRegressor import SymbolicRegressor
from gplearn.genetic import SymbolicTransformer
from gplearn.functions import make_function
from config import DATA_DIR
from datafeed import CSVDataloader
loader = CSVDataloader(DATA_DIR.joinpath('etfs'), ['510300.SH'],start_date='20220101')
data = loader.load(names=['label'], fields=['shift(close,5)/close-1'])
data.dropna(inplace=True)
data.columns = [c.capitalize() for c in data.columns] print(data) feature_names = ['Open', 'High', 'Low', 'Close', 'Amount'] y_train = data['Label'] X_train = data[feature_names] from gplearn.functions import _function_map sr = SymbolicRegressor(population_size=2000, tournament_size=20, generations=3, stopping_criteria=0.01, p_crossover=0.7, p_subtree_mutate=0.1, p_hoist_mutate=0.1, p_point_mutate=0.05, init_depth=(6, 8), init_method='half and half', function_set=list(_function_map.keys()), variable_set=feature_names, const_range=(0, 1), ts_const_range=(0, 1), build_preference=[0.75, 0.75], #metric='annual return', metric='sharpe ratio', parsimony_coefficient=0.01) sr.fit(X_train, y_train) print(sr.best_estimator)
————Generation 1————
best estimator: div(max(div(sin(sqrt(inv(Amount))), sub(div(abs(High), sub(1, Open)), max(neg(0), max(0, Low)))), abs(tan(mul(abs(Open), sqrt(Close))))), mul(cos(log(add(inv(1), Close))), min(div(sub(sqrt(0), Open), neg(add(Open, Close))), neg(min(Low, add(1, Amount))))))
best fitness: 3.735121955881781
div(max(div(sin(sqrt(inv(Amount))), sub(div(abs(High), sub(1, Open)), max(neg(0), max(0, Low)))), abs(tan(mul(abs(Open), sqrt(Close))))), mul(cos(log(add(inv(1), Close))), min(div(sub(sqrt(0), Open), neg(add(Open, Close))), neg(min(Low, add(1, Amount))))))
样本内夏普3.73,还可以吧。
当然这个因子非常复杂了。
代码明天统一打包更新:
明天讲讲GPT-alpha:
吾日三省吾身
最近翻了一本小书:《种子:走出迷茫,找到人生和工作的意义》。
说是翻,基本就是上班路上就看完了。
因为这种书,着实不需要逐字逐句去读。
老外写书,特别喜欢把一个简单的道理,搁到一个复杂故事里去讲。他们是演绎思维,我们还得发心思再把它归纳出来。
这本书最后演绎的结论是于当下的工作和生活中找到意义。简言之,不要试去找所谓“有意义的工作”,而是在当下的工作中找到意义。
若是早年,看到这个结论,我会和评论区里多数同学一样,把书扔了。
但现在似乎读出了一点不一样的东西。
其实每件事情,事业,工作都是一个复杂体系,一定有你喜欢,热爱的,也有你不热爱的。
在学校时,没日没夜写代码,不求回报,没开心;但毕业去了大公司,拿着不错的回报,反而没有了这份热情。为什么?是突然不喜欢了吗?不是,喜欢的是那份自由,想学啥学啥,想用啥用啥,想如何设计架构就如何设计,然后看着自己写的代码运行起来那份成就感。。。但大厂有其规范,工程师为何后来戏称“码农”,因为你没有选择,就是把活干了。
所以说,你喜欢的,是一些“元素”,而不是某一种工作。任何工作中都有你喜欢的和不喜欢的。所以你觉得换工作就能解决问题是错的,而是你要从工作中发现你喜欢的,去拥抱它。
比如创业,更多的琐事,搞定人,搞定资本,而不是电视剧里关键节点的杀伐决断。你是否喜欢应付这种日常?
从这个角度想过去,AI量化反倒特别契合我。
满足对新技术的好奇,选择自己喜欢的技术栈,离市场近,不需要过多受制于人的因素。——“一人企业”特别契合我的理念。
至于意义嘛——把前沿技术转化为生产力,我们搞应用或者科普,落在量化上,只是目前找到有落地路径的一个场景;后续比如像大模型LLM, Sora等,如何能以“一人企业”的模式落地,我们依然会探索。
另外,个人特别喜欢“规则极简,内涵极丰富”的技术产品形态,比如围棋,规则可能两句话就说清楚了,但却是棋类里最难的。搜索,推荐,以及当下的ChatGPT问答。产品极简,但内在技术极丰富。
回到量化投资,它的内核就是因子,因子组合成策略。
这时我们仅需要专注因子挖掘,或者说因子的自动化挖掘就好。
历史文章:
gplearn遗传算法应用于CTA因子挖掘:手把手教程(代码+数据下载)
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103518
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!