内容简介:遗传规划(Genetic Programming)由达尔文的进化论演变而来,是一种智能进化计算 (Evolutionary Computation) 技术,通常用来求解最优化问题。遗传算法在在多因子投资过程中我们面临的问题是选取哪些因子,以及这些因子如何组合在一起才能实现超额收益,使用GP算法可以实现给定目标下的因子最优化组合。
遗传规划(Genetic Programming)由达尔文的进化论演变而来,是一种智能进化
计算 (Evolutionary Computation) 技术,通常用来求解最优化问题。遗传算法在 量化投资 中的应用主要在于遗传规划(简称GP),是遗传算法的推广和更一般地形式。本文主要介绍在BigQuant平台上如何利用GP算法实现因子寻优,策略完整代码见文末,可直接前往 BigQuant人工智能量化投资平台 进行克隆实现。
在多因子投资过程中我们面临的问题是选取哪些因子,以及这些因子如何组合在一起才能实现超额收益,使用GP算法可以实现给定目标下的因子最优化组合。
GP算法首先将因子组合表达为树结构,通过设置函数集和因子集,按照一定的适应度函数不断进化,生成表达式,然后基于这些表达式构建交易信号进行回测,输出策略回测指标。
一、因子组合的表示方法
假设我们有基础因子X0和X1(例如市盈率月末值、每股收益月末值),需要预测目标y(例如下月收益率)。一个可能的因子组合方式是:
在这个二叉树里,所有的叶节点都是基础因子变量或者常数,内部的节点则是函数集中的函数。函数集中的可选函数包括:
'add':加法,二元运算 'sub':减法,二元运算 'mul':乘法,二元运算 'div':除法,二元运算 'sqrt':平方根,一元运算 'log':对数,一元运算 'abs':绝对值,一元运算 'neg':相反数,一元运算 'inv':倒数,一元运算 'max':最大值,二元运算 'min':最小值,二元运算 'sin':正弦(弧度),一元运算 'cos':余弦(弧度),一元运算 'tan':正切(弧度),一元运算
二、计算适应度函数
和其他机器学习算法一样,遗传算法的核心在于衡量公式的适应度(fitness function),适应度的地位类似于目标函数、score、loss和error。在GP回归模型(SymbolicRegressor)训练过程中利用遗传算法得到因子组合的公式预测目标变量的值,然后利用label值计算两者之间的error,通过不断寻找因子组合公式来最小化这个error。GP回归模型中的适应度函数有三种,都是机器学习里常见的error function:
- mae: mean absolute error
- mse: mean squared error
- rmse: root mean squared error
当然,用户也可以自定义适应度的标准。
遗传算法内,耗时最大的部分无疑是适应度的计算。所以,gplearn允许用户通过修改n_jobs参数控制并行运算。在数据量和公式数量较大时,并行计算的速度优势最为明显。
三、组合公式的进化
首先定义每代种群的因子组合公式数量(population_size),所有的组合都会以二叉树公式方式随机生成。每棵公式树的深度都会受到init_depth参数的限制。init_depth是一个二元组(min_depth, max_depth),树的初始深度将处在[min_depth, max_depth]的区间内(包含端点)。
通常而言,变量越多,模型越复杂,那么population_size就越大越好。
为了模拟自然选择的过程,大部分「不适应环境」,即适应度不足的因子组合公式会被淘汰。从每一代的所有公式中,tournament_size个公式会被随机选中,其中适应度最高的公式将被认定为生存竞争的胜利者,进入下一代。tournament_size的大小与进化论中的选择压力息息相关:tournament_size越小,选择压力越大,算法收敛的速度可能更快,但也有可能错过一些隐藏的优秀公式。
进入下一代的优胜公式未必原封不动——完全不改变优胜者,直接让它进入下一代的策略被称为繁殖(reproduction)。用户可以采取一系列的变异措施:
交叉(Crossover)
优胜者内随机选择一个子树,替换为另一棵公式树的随机子树。此处的另一棵公式树通常是剩余公式树中适应度最高的。算法模型中,由p_cross_over参数控制子树交叉的发生概率。
子树变异(Subtree Mutation)
这是一种更激进的变异策略:优胜者的一棵子树将被另一棵完全随机的全新子树代替。算法模型中,由p_subtree_mutation参数控制子树变异的发生概率。
hoist变异(Hoist Mutation)
hoist变异是一种对抗公式树膨胀(bloating,即过于复杂)的方法:从优胜者公式树内随机选择一个子树A,再从A里随机选择一个子树B,然后把B提升到A原来的位置,用B替代A。hoist的含义即「升高、提起」。算法模型中,由p_hoist_mutation参数控制子树变异的发生概率。
点变异(Point Mutation)
一个随机的节点将会被改变,比如加法可以被替换成除法,变量X0可以被替换成常数-2.5。点变异可以重新加入一些先前被淘汰的函数和变量,从而促进公式的多样性。算法模型中,由p_point_replace参数控制点变异的发生概率。
通过上述几种方式实现每代种群内个体的表达式进化,就实现了“优胜劣汰,适者生存”的森林法则,最终获取最优的因子组合表达式,同时解决了因子选择和因子间组合方式这两个问题。
四、 BigQuant平台 上实现GP算法
4.1 构建基础因子库
我们首先构建月频因子数据库,参考华泰金工的相关报告,构建了估值、成长、盈利、财务质量、市值、反转、波动率、换手率、beta和技术等十类基础因子。所有的因子数据按照以下流程进行了清洗处理:
- 计算基础因子日线数据
- 计算衍生因子日线数据,例如技术指标日线值计算
- 对日线因子数据进行月度频率转化
- 对月度横截面数据逐月进行去极值、行业市值中性化、zscore归一化处理
- 对zscore后数据中的na值使用0值填充
处理后的结果存放在factor_CN_STOCK_A表中,可以通过DataSource(‘factor_CN_STOCK_A’).read()查看相应数据,表中的各因子如"alpha001"因子公式含义见文末链接。
4.2 构建GP算法流程
如下图所示,分别获取两个历史阶段数据作为GP算法的训练集和预测集数据,在“遗传规划模型训练”模块中使用训练集数据训练GP模型获取因子组合表达式,在“遗传规划模型预测”模块中使用预测集数据和模型进行下月收益率预测。模型训练后会输出最优表达式,例如:
末代最佳表达式: sub(X2, X2) 筛选后最佳表达式: max(min(X1, X0), abs(add(mul(0.781, X1), mul(-0.630, X1))))
获取因子组合表达式后,我们可以通过因子数据计算表达式的下月收益率预测值,并构建月度轮仓策略,每月月初卖出上月持有的股票,并选取下月收益率预测值最高的40只股票买入。
通过m6模块对训练集的数据进行回测,如下图所示;
通过m17模块对预测集的数据进行回测,如下图所示。
4.3 批量测试
为了寻找最优因子组合,采用自定义运行模块,将基础因子进行随机组合,并计算回测结果。
计算流程如下图所示,
各种因子组合的最优化结果存储在自定义运行模块m5中,通过m5.result[i]获取各因子组合的计算结果,整理后可以绘制每个因子组合的月度换仓策略下的收益率回测曲线。下面列举几个因子组合的例子:
-
例1:组合因子表达式
min(X17, X14) 其中X17和X14 分别为因子库中的alpha014和alpha019
-
例2:组合因子表达式
sqrt(mul(max(-0.110, X8), add(X4, X5))) 其中X8,X4和X5分别为 alpha008 alpha026和alpha014
上述例子中是使用2010-01-01~2016-01-01日期范围的历史月度因子数据作为训练集训练GP模型,预测集数据日期范围为2016-01-01~2019-01-01。蓝色曲线为沪深300基准收益,橙色曲线为策略净值曲线,绿色曲线为相对收益率曲线,黑色曲线为日相对收益率的复利净值曲线(假设每日的相对收益可以每日复利投资)。
结语: 本文展示了如何利用平台的月度因子数据和GP遗传规划算法进行因子组合寻优。
参考文献:
2、广发证券—《基于遗传规划的智能交易策略方法—另类交易策略系列之九》
3、申万宏源—《遗传算法和遗传规划—寻找不一样的Alpha》
4、 遗传算法详解
附录
源码地址:《 遗传算法在因子投资中的应用 》
本文由BigQuant 人工智能 量化投资平台 原创推出,版权归BigQuant所有,转载请注明出处。
以上所述就是小编给大家介绍的《遗传算法在因子投资中的应用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 深入理解遗传算法(三)
- 《常用算法之智能计算 (四) 》:遗传算法
- golang 实现的一个遗传算法的例子
- “刷脸”窥见遗传病:深度学习算法助疾病诊断
- 基于Python的遗传算法特征约简(附代码)
- 量化选股-因子检验和多因子模型的构建
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ACM国际大学生程序设计竞赛亚洲区预选赛真题题解
郭炜 / 电子工业 / 2011-7 / 49.00元
ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,简称ACM/ICPC)是世界上历史最悠久,规模最大、最具声望的程序设计竞赛,一直受到众多国际知名大学的重视,全球著名IT公司更是争相招募竞赛的优胜者。 该项赛事分为各大洲预选赛和全球总决赛两个阶段。北京大学多次在亚洲区预选赛中负责命题工作,是中国在ACM/ICPC命......一起来看看 《ACM国际大学生程序设计竞赛亚洲区预选赛真题题解》 这本书的介绍吧!