分享一个因子挖掘的利器:遗传规划

你是如何挖掘因子的呢?基于经验吗?但经验是有限的,总会有用尽的时候。基于研报或者论文等公开资料?但这类因子不可避免地涉及到因子拥挤问题,毕竟有效的因子,其他人也会用。

那么还有其他方法吗?答案是有。

今天我们便基于华泰证券的《人工智能系列之基于遗传规划的选股因子挖掘》,给大家介绍一款因子挖掘的利器: 遗传规划 。

什么是遗传规划?

遗传规划是演化算法的分支,是一种启发式的公式演化技术。它从随机生成的公式群体开始。通过模拟自然界中遗传进化的过程,来逐渐生成契合特定目标的公式群体。作为一种监督学习方法,遗传规划可以根据特定目标,发现某些隐藏的、难以通过人脑构建出的数学公式。传统的监督学习算法主要运用于特征与标签之间关系的拟合,而遗传规划则更多运用于特征挖掘(特征工程)。

——《人工智能系列分析报告之基于遗传规划的选股因子挖掘》

以往的因子研究都是“先有逻辑,后有公式”,是一种“演绎法”。但遗传规划的形式是“先有公式,后有逻辑”,属于“归纳法”。它的优势在于可以充分利用计算机的强大算力进行启发式搜索,同时突破人类的思维局限,挖掘出某些隐藏的、难以通过人脑构建的因子,为因子研究提供更多的可能性。

生物中的遗传进化会涉及到基因的遗传,变异,对生态环境的适应能力等情况,遗传规划算法中也是如此,也会有交叉变异、子树变异、点变异、Hoist变异和适应度等,具体细节可以查看研报或论文。

我们采用Python遗传规划项目中的gplearn模块包进行因子挖掘,模型的主要参数如下:

模型所要用到的数据如下:

  • 测试品种:上证指数
  • 回测区间:2010年01月01日-2022年05月31日
  • 初始因子:开盘价、收盘价、最高价、最低价、成交量、收益率、成交量加权平均价
  • 预测目标:未来5天收益率
  • 函数列表:所有gplearn自带函数

准备好数据之后就可以开始训练模型了:

gp1 = SymbolicTransformer(generations=10, population_size=1000, function_set=function_set, init_depth=(1,4), tournament_size=20, metric='spearman', p_crossover=0.4, 
                          p_subtree_mutation=0.01, p_hoist_mutation=0, p_point_mutation=0.01, p_point_replace=0.40, 
                          warm_start=False, verbose=1,random_state=0, n_jobs=-1,feature_names=['open', 'close', 'high', 'low', 'volume', 'return_rate', 'vwap'])
...
gp1.fit(train,label)# 训练模型

模型会自动显示过程日志,其中Fitness是适应度,这里我们选用的是Spearman秩相关系数,相关系数越高,代表因子与未来5天收益率相关度越高 。

  

我们进一步通过曲线的形式展示最优因子的迭代过程:

由上图可以看出,最优因子大约迭代到第四代(X轴中,0是第一代)的时候,秩相关系数就达到了较高水平,后续的迭代提升并不高。

  

最后通过树形图来看下模型迭代出来的最优因子:

  

  

用公式来表达便是:log(收盘价)/log(成交量) 。结合下模型前十个最优因子:

   

可以发现,模型的输出结果中有很多重复的因子,剔除重复因子后,只有两个因子分别为:log(收盘价)/log(成交量)和log(成交量)/log(收盘价) 。

其实这两个因子应该算同一个因子,只是进行了倒数变形。以log(收盘价)/log(成交量)因子来看,先分别对收盘价和成交量进行对数计算,再相除,可以看作是以成交量倒数加权下的收盘价。感兴趣的朋友,可以进一步测试该因子的表现,也可以对其他指数或商品期货进行因子挖掘。

本篇内容是对遗传规划的前期探索,但其中还有很大一块内容是还没有解决的,比如本次所用到的函数都是gplearn自带函数。如何扩充函数?尤其是时间序列型的函数,例如求历史5天均值。当前测试品种的单一品种,如何扩展到多品种?这样的三维数据该如何处理?这些都有待解决。

后续将推出进阶版遗传规划,带你进一步探索因子挖掘!

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值