跳转至

量化投资入门系列(六)——技术性因子分析与遗传算法生成

引言

在之前的文章中,我们讨论了如何构建起多因子的组合,在量化在国内刚刚起步的过程中,做量化的私募基金通过上述方法赚得了第一桶金,但是在量化领域有一句名言:量化投资没有圣杯。在经历过初期的红利之后,通过基础的因子所构建的多因子组合的赚钱效力越来越低,因此更多地机构开始将中心转移到因子挖掘上。在这一阶段,技术性分析扮演了更加重要的角色,在技术分析中,使用的数据基本地来自于基础的行情数据,再通过数学运算来构建成新的因子,然后利用新生成的因子去构建组合。

在系列的第二篇文章中,我们曾介绍了一些很基本的策略,这些策略构成了技术类分析的雏形——通过对开高收低成交量等行情数据进行组合,根据组合生成的结果来进行买卖点的判断。

在2015年Zura Kakushadze发布了alpha101因子,相比于前面所提到的均线类策略,这些因子在计算上更加复杂,并且在价格的基础上加入了成交量、换手率等因子,这无疑将技术类分析引上了新的路途(alpha101尽管不是最早的技术类因子,但却是首次大规模公开发布的因子体系)。之后在2017年,国泰君安证券发布了alpha191因子,这是对公开技术类因子的又一次大规模补充,而基于技术类因子的多因子模型也在此之后也开始变的愈加成熟。

技术类单因子有用吗?

无论是alpha101还是alpha191,在介绍的过程中都附带了一些因子的回测情况,从回测结果看,即使使用单因子,也可以取得非常理想的收益率,但是必须要指出的是,在当前量化投资已经遍地开花的市场环境下,依靠此类公开的技术类因子是很难实现稳定的收益的,尤其是在使用单因子的情况下。这并不难理解,因为当大家都知道一种方法可以赚钱的时候,这种方法很快就无法赚钱了。因此对于发布因子的机构而言,尤其是买方机构,其发布出的因子,很大程度上是在实盘中表现不那么优秀的因子,而部分有效的因子,也会因为被市场所知晓而失去赚钱效应。这些公开因子最大的价值,其实是为技术类分析打开了一扇窗,为众多的量化投资机构提供了一些因子挖掘的思路,要想获取真正有价值的因子,自己动手丰衣足食是最稳妥的方法。

alpha101

在讨论如何获取有效的因子之前,我们首先介绍一下如何来评价因子的有效性。基本思路有两种,一是通过一些统计类的数值来反映因子的有效性,而是直接通过回测来进行观察。

对于第一类,常用的就是IC,RIC和IR三个值:

IC值检验

求当期(t期)的因子暴露和下一期(t+1期)的个股收益的相关系数,得到当期(t期)的该因子的IC值:

\[ IC_i^t=Var_{pearson}(Factor_i^t,Return^{t+1}) \]

RIC值检验

RIC值检验与IC值检验的思路类似,只是把皮尔逊相关系数改成了斯皮尔曼相关系数。

\[ IC_i^t=Var_{spearman}(Factor_i^t,Return^{t+1}) \]

IR值检验

\[ IR=\frac{mean(IC)}{std(IC)} \]

对于第二类,除了关注最基本的收益率参数外,还有几个参数值得关注,包括,波动率,最大回撤以及夏普比率(sharp ratio)。

\[ sharpratio=\frac{E(R_p)-R_f}{\sigma_p} \]

如果进行因子挖掘?

如果对alpha101和alpha191的因子进行观察,可以看出一个明显的特点,就是前面的几个因子,基本上具备一定的可解释性,因子本身的结构也比较简单,看上去应该是人为构造的,而后面的一系列的因子,则让人摸不着头脑,个人对这一点的推测是这些因子在生成的过程中并不是基于人为的因子分析,而是采用了遗传算法来进行因子的自动生成,所以接下来会对遗传算法做简单的介绍。

_ 基于遗传算法的因子挖掘_

遗传算法是结合了生物繁衍进化的原理,包含了过度繁殖、自然选择、交叉变异等几个步骤。

第一步,种群生成 :在生物的遗传中,遗传信息是储存在染色体中的,而在因子挖掘的过程中,我们将因子的公式看做遗传信息,然后以一个列表(或字符串)来储存因子公式,为了方便解析,我们一般使用前缀表达式来进行因子的表达,选择的主要原因就是这样可以避免使用括号。在因子计算中,我们拥有两类基因,一类是数值类,包括开高收低成交量换手率等数据,以及预设的一系列的常数,例如0.5,2 10等,特别的,收益率类的数据可以放很多不同期限的,一类是计算符号类,包括加减乘除、标准差、求和、求平均、相关性、排名、乘方以及开根号等操作,其中,标准差、求和以及求平均等操作是比较特殊的,因为其还涉及另外一个变量,就是序列的长度,因此,在随机生成的过程中,当遇到此类运算符时,还需要同步地生成一个序列长度一并存储,然后将两者的整体看做一个一元运算符,另一种简单的方式是直接预设一部分带参数的运算符,例如sum(数值, 20),avg(数值,40)等,当然,还有一种不可或缺的就是“空”,因子我们的计算公式不一定占满整条染色体。然后我们需要按照一定的规则来自动生成前缀表达,记数值类基因的数量为n,计算符号类基因中二元运算符的数量为m,一元运算符的数量为o,则整个字符串需要满足以下条件:

  1. 字符串以运算符开头,以数值结尾
  2. 在字符串中任意位置i, \( 'm_i+1\geq n_i' \)
  3. 在字符串中,m+1=n

在这一规则下,我们可以自动生成一系列的公式,作为我们的初始种群。生成公式的数量记作种群数量p。

第二步,适应度评价 :在自然界中,生物有着不同的适应自然的能力,同样的,在遗传算法中,我们也要计算不同因子的适应度,计算的方式即上一节所说的几种评价标准,以IC为例,我们可以计算出所有因子的IC作为因子的适应度,IC越大,适应度越高。当然,在计算适应度之前,需要有一个解码的过程,将前缀字符串转换为具体的因子值。

第三步,自然选择 :在生物进化中,有着更高适应度的生物将更有机会繁衍后代,同样的,IC更高的因子也应该更有机会进入下一轮,一个简单的选择方式是按如下的概率来进行选择:

\[ prob=\frac{IC_i}{\sum_{i=1}^pIC_i} \]

然后以轮盘赌的方式来进行有放回地抽样,每次抽一对染色体,共抽取p/2次。

第四步,交叉组合 :对于每一对染色体,我们随机选择一个位点,然后将两条染色体在该位点之后的部分进行交换,然后生成两条新的染色体,一个显而易见的问题就是,交叉后的染色体,可能并不满足上述的规则,处理方法有两种,一种是对我们的前缀字符串,解析成二叉树的方式,然后对两颗二叉树,在某个子节点做子树的交换,另一种方法是,在进行位点选择的时候,选择的是数值类基因所在的位点,该位点需要满足 \( m_k+1=n_k \) ,然后将该位点之后的部分进行交换。

第五步,基因变异 :生物在遗传的过程中都会发生一定的基因变异,所以在遗传算法中也需要设定这一环节,一个简单的方式是随意选取一定的位点,然后将其替换成同类的基因。

至此,我们重新生成了p个染色体,形成了新一代的种群,然后重复后四步操作,不断迭代生成新的种群,最后选择最后一个种群中适应度最高的个体作为生成的因子。

在python中,常用的遗传算法包包括 gplearnDEAP ,其中也包含有专门的公式生成的算法(生成方式可能与上述介绍的方式有差异,但是只要是在上述五步的大框架下,效果上差异不大),这在很大程度上简化了我们开发的流程,不过如果想深入领会遗传算法,建议自己做一些简单的实现。

多因子VS单因子

常言道:三个臭皮匠,顶个诸葛亮。在因子投资中同样有类似的情况,想要挖掘出一个有效的单因子是一件很难也比较看运气的事情,所以一个比较常见的做法是使用多个因子,然后利用机器学习的强大的拟合能力,去构建多因子模型,这一部分的具体实现方式我们将在下一节中进行介绍。

凡本网注明"来源:XXX "的文/图/视频等稿件,本网转载出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如涉及作品内容、版权和其它问题,请与本网联系,我们将在第一时间删除内容!
作者: 李浩然 华泰证券 算法工程师
来源: https://zhuanlan.zhihu.com/p/407885566