遗传规划因子挖掘

145 阅读5分钟

遗传规划因子挖掘:从数据到Alpha的智能进化之路

一、遗传规划机制解析

**遗传规划(Genetic Programming, GP)**作为一种启发式算法在因子挖掘领域展现出独特的优势,能够自动发现复杂的非线性因子组合。与传统的人工构造因子不同,遗传规划通过模拟生物进化过程,在庞大的因子空间中智能搜索最优解。

核心机制包括四个关键环节:

  • 选择(Selection):根据适应度函数评估每个因子的优劣,优秀的因子有更高概率被选中参与下一代繁殖。常用的选择策略包括轮盘赌选择、锦标赛选择和精英保留策略。

  • 交叉(Crossover):将两个父代因子的优秀基因片段重组,产生新的子代因子。在树状结构中,交叉操作会交换不同父代的子树,创造出新的因子计算逻辑。

  • 变异(Mutation):随机改变因子表达式中的某些节点,包括运算符变异、常数变异和子树变异,增加种群的多样性,避免陷入局部最优。

  • l适应度评估(Fitness Evaluation):量化每个因子的预测能力,通常结合IC值、IR比率、收益稳定性等多个维度进行综合评估。

    这种进化机制使得算法能够自动发现人类难以构想的复杂因子模式,在高维特征空间中找到真正有效的Alpha因子。

image.png

二、算子库与字段库的搭建

​ 想象一下,如果把量化因子挖掘比作烹饪,那么算子库就是我们的厨具,字段库就是食材。有了好的工具和原料,才能做出美味的"Alpha大餐"。

1. 时序+截面算子库:我们的"量化厨具"

​ 现在的算子库主要基于Polars和PyTorch来构建,这两个框架的组合堪称完美——Polars负责高效的数据处理,PyTorch负责GPU加速计算,让我们的因子挖掘速度飞起来。

ts_meants_ewmts_stdts_skew
ts_kurtts_corrts_rankts_argmax/min

2. 字段库:丰富的"Alpha食材"

​ 字段库就像是我们的食材仓库,分为三大类数据源,每种都有独特的"味道":

returnobvmfiamplitude
log_volumelog_tradesdelta_volume_ratiooir

三、适应度函数的选择和相关性过滤机制

  1. 适应度函数:因子的"体检报告"

    在遗传规划中,适应度函数就像是给每个因子做全面体检,从多个维度评估因子的"健康状况"。我们不能只看一个指标,需要综合考虑,就像医生不会只看血压就判断身体状况一样。

    • IC(信息系数)- 预测能力的核心指标

    IC值衡量的是因子预测收益的能力,简单来说就是因子值高的标的未来收益是否真的更高

    • *夏普比率 - 风险调整后的收益表现

      夏普比率告诉我们的是,承担单位风险能获得多少超额收益。这个指标特别重要,因为高收益如果伴随着高风险,实际上并不划算。

    • 盈亏比 - 胜负的艺术

      盈亏比关注的是平均盈利与平均亏损的比例。即使胜率不高,但如果每次盈利都比亏损大得多,整体还是能赚钱的。这就像做生意,不是每笔都要赚,但赚的时候要比亏的时候多。

    • 最大回撤 - 心理承受能力的考验

      最大回撤衡量的是从最高点到最低点的最大损失幅度。这个指标直接关系到策略的可执行性,因为即使长期收益很好,但如果中间回撤太大,投资者往往会承受不住而放弃。

    2. 相关性阈值筛选:避免"无增益信息"

    ​ 相关性过滤就像是基因筛查,确保我们的因子库保持多样性。

    • 为什么要做相关性筛选?

    ​ 如果我们的因子库里都是高度相关的因子,看起来有很多因子,实际上可能都在反映同一个市场现象。

    • 筛选机制的工作原理

    ​ 我们会设定一个相关性阈值,通常0.6。当一个新的因子被发现时,系统会自动计算它与因子库中现有因子的相关性。如果相关性超过阈值,就会触发筛选机制:如果新因子的适应度更高,就替换掉老因子;如果适应度较低,就直接淘汰。这样既保证了因子库的质量,又维持了多样性。

    四、生成因子表达式

    ​ 遗传规划生成因子表达式的过程,就像是用数学语言在编写一首描述市场规律的"诗歌"。每个表达式都是算子与字段的精巧组合,承载着对市场行为的深度理解。

    遗传规划中的因子表达式采用树状结构表示,这种结构既直观又灵活。想象一下家谱图,每个节点都有自己的"父母"和"孩子":

    • 叶子节点:基础字段(如close、volume、return)和常数值

    • 内部节点:各种算子(如ts_mean、cs_rank、add、mul)

    • 根节点:最终的因子值输出

    sub(ts_mean(cs_rank(return), 3) , ts_rank(ts_corr(obv, close, 15), 30))
    ts_std(ts_rank(div(amplitude, ts_ewm(amplitude, 0.2)), 10), 5)
    condition(mfi > 50, ts_corr(return, log_volume, 8), − ts_rank(delta_volume_ratio, 15))

    此文章内容由云梦量化科技高频策略研究员Joy创作投稿。