4. 遗传编程核心概念

在Alpha因子挖掘中,遗传编程不是“随机搜索公式”,而是一套有明确生物学隐喻的进化计算框架。理解这套框架的关键,是把九个核心概念串成一条闭环:个体是候选因子,种群是个体的集合,基因型是公式的树形编码,表现型是公式在数据上计算出的因子值,适应度衡量因子好坏,选择决定谁留下,交叉与变异产生新个体,进化代数控制迭代轮次。下面从原理、流程、案例和误区四个模块展开。

一、核心原理:从基因型到表现型的映射

遗传编程最容易被误解的一点,是把它当成“直接搜索最优公式”。实际上,算法操作的是基因型,而评估的是表现型。基因型是一棵语法树,内部节点是算子(如 add、sub、mul、div、rank、ts_mean),叶子节点是终端(如 close、volume、returns、常数)。表现型则是把这棵树在行情数据上执行后得到的因子序列。

例如,基因型为 div(sub(close, ts_mean(close, 20)), ts_std(close, 20)),表现型就是过去20日收盘价的标准化偏离度。同一个基因型在不同股票池、不同时间窗口下,表现型可能完全不同。因此,适应度必须在明确的数据切片和评估协议下计算,否则比较没有意义。

关键映射关系:基因型(树结构)→ 执行引擎 → 表现型(因子值序列)→ 评估指标 → 适应度(标量)。遗传编程的搜索发生在基因型空间,但选择压力来自表现型空间。

二、方法流程:一轮进化到底发生了什么

一个标准遗传编程回合可以拆成八个步骤,每一步都对应一个核心概念:

  1. 初始化种群:随机生成N个个体,常用ramped half-and-half方法控制树深,避免一开始就出现巨型公式。
  2. 计算表现型:对每个个体执行树,得到因子值,并做去极值、标准化、中性化等预处理。
  3. 计算适应度:常用IC、ICIR、RankIC、多空收益、换手率惩罚等组合指标。
  4. 选择:按适应度排序,采用锦标赛选择或轮盘赌选择,保留精英个体。
  5. 交叉:从两个父代中随机选择子树并交换,生成两个子代。
  6. 变异:随机替换子树或节点,维持种群多样性,防止早熟收敛。
  7. 形成新种群:精英保留+交叉子代+变异子代,组成下一代。
  8. 进化代数递增:重复步骤2-7,直到达到最大代数或适应度不再提升。

下面是一个简化的参数配置示例,展示这些概念在代码中如何落地:

population_size = 500
max_generations = 30
tournament_size = 5
crossover_rate = 0.7
mutation_rate = 0.2
elitism_size = 10
max_tree_depth = 6
fitness_metric = "rank_icir"
parsimony_coefficient = 0.001

其中parsimony_coefficient用于惩罚过大的树,避免公式膨胀。这个参数看似小,但在Alpha因子挖掘中非常关键,因为复杂公式更容易过拟合。

三、案例场景:一个因子从诞生到被淘汰

假设我们要挖掘一个量价背离因子。初始种群中有一个个体基因型为:

div(ts_mean(volume, 5), ts_mean(volume, 20))

它的表现型是短期成交量均值与长期成交量均值的比值。在评估期,该因子RankIC为0.018,ICIR为0.35,换手率较高。适应度计算时加入换手惩罚后,排名中游。

在交叉阶段,它与另一个个体sub(close, ts_mean(close, 10))交换子树,产生新个体:

div(ts_mean(volume, 5), ts_mean(close, 10))

这个新个体表现型变成“短期成交量均值与中期收盘价均值之比”,经济含义模糊,RankIC降至0.006,被自然淘汰。与此同时,另一个变异个体将ts_mean(volume, 5)替换为ts_rank(volume, 5),得到:

div(ts_rank(volume, 5), ts_mean(volume, 20))

该因子RankIC提升至0.024,ICIR达到0.52,且换手率下降,最终进入精英池。这个过程说明:交叉和变异本身不保证变好,它们只是产生多样性,真正决定方向的是适应度函数和选择机制。

四、误区与复盘:九个概念中最容易踩的坑

误区一:把适应度当成唯一目标。如果只用IC最大化,算法会迅速生成大量高IC但高换手、高相关、不可交易的因子。适应度必须是多目标或带惩罚的复合指标。

误区二:忽视基因型与表现型的区分。两个基因型不同的树可能产生完全相同的表现型,导致种群“假多样性”。去重时应在表现型层面做相关性过滤。

误区三:进化代数越多越好。代数过多会过拟合训练集,且计算成本线性增长。通常30-50代后适应度提升边际递减,应结合样本外验证早停。

误区四:变异率设置过低。变异率太低会导致种群早熟,所有个体趋同;太高则退化为随机搜索。经验值在0.1-0.3之间,需根据种群规模调整。

为了更系统地对比这些概念,下表给出每个核心概念在遗传编程中的角色、常见实现和Alpha因子挖掘中的注意事项:

核心概念角色常见实现Alpha挖掘注意事项
个体一个候选因子公式语法树需限制树深和节点数
种群候选因子集合500-2000个个体规模太小易早熟,太大计算贵
基因型公式的树形编码算子+终端算子集要符合金融语义
表现型因子值序列执行树得到需做标准化和中性化
适应度因子好坏评分RankICIR+惩罚必须样本外验证
选择保留优秀个体锦标赛/轮盘赌保留精英防止退化
交叉交换子树产生新个体子树交叉可能破坏有效结构
变异随机改变节点子树变异/点变异维持多样性关键
进化代数迭代轮次30-50代结合早停和样本外监控