Qlib智能因子挖掘系统(五):让因子自己长出来,遗传编程初探
引言
“数据是土壤,算法是阳光,因子则是要破土而出的那颗种子。”
先前我们探讨了 Qlib 的因子系统,虽然手动编写策略具备高适应性,但本质上还是遵循“人工设定指标、系统进行验证”的传统模式。现在,我们将尝试让机器自主完成指标设计环节——通过运用***遗传编程 (Genetic Programming, GP)*** 技术,观察这些指标如何像生物体一样自我优化、不断进步。
Qlib 的瓶颈:只能“拼”不会“生”
系列开篇介绍了Alpha158,这个模型包含了158个手工设计因子,让使用者体验到了即插即用的便捷性,然而,当你希望系统能够自主生成新因子时,便会意识到Qlib目前仅支持对已有因子进行线性或非线性的组合,尚不具备自动生成的功能
那么,能不能让机器自己写因子?
能够实现,并且想法十分顺理成章:将因子视为“生命体”,让它们在优胜劣汰的环境中自主发展。
遗传算法&遗传编程,一分钟入门
如果你已经熟悉 GA/GP,可以直接跳到下一节。
遗传算法和遗传编程的区别归纳如下,将遗传编程整合进 Qlib 需要明确方法和步骤,开始前必须设定初始种群
生成一些因子公式开yun体育官网入口登录app,其中元素包含:加法,减法,乘法,除法,指数移动平均,标准差,相关系数等,然后进行适配度评价
借助 Qlib 的模拟交易或 IC/RankIC 衡量,针对每支因子树进行评分评估,接着挑选并组合
让高分因子优先“繁衍”,交叉子树、互换基因。变异
随机替换节点或子树,注入新血。循环迭代
若干世代后开元ky888棋牌官网版,保留表现最优或稳健度最高的因子。
这个流程很面熟,确实,跟农业种植类似,先撒下种子,接着挑选出优质幼苗,然后进行品种改良,再筛选一遍,如此循环,最终选育出一些产量高的种子。
推荐工具:DEAP,一行代码都不嫌多
快速上手(伪代码):
import deap.gp as gp
算子被设定为 gp 的 PrimitiveSet 类型,命名为 FINANCE,参数个数是四个
# ... 添加 add, sub, ema 等
toolbox = gp.Toolbox()
注册一个评估函数,该函数用于执行因子回测,这是你的Qlib回测方法
# 初始化、进化、选优...
进化现场:一段真实 Log
为了让大家直观感受,下面是某次实验里的父子代对比。
父代 1: 当标准差($收盘价,13)等于指数移动平均($最高价,11)时,取最小值($开盘价,31)在56周期内的最低点,否则计算相关系数($未平仓合约量,$收盘价,6)在55周期内的斜率,最后取结果的8周期rsquare值
父代 2: 先判断数量与收盘价是否不等,再确认最低价是否等于持仓量,最后将结果转化为数值
关联→后代:Rsquare(当(标准差($open_interest,13)等于移动平均($high,11))时,取最小值($open,31)在56位置的最小值,否则计算相关系数($open_interest,$close,6)斜率在55位置的值),取8
变异→子代: *同上,节点变异...*
看着像天书?不用急开元ky888棋牌官方版,关键在于 —— 机器确实在自行生成元素,并且部分芯片效果相当不错。
写在最后
从“手工构建因子”到“因子自主生成”,遗传编程为量化分析开辟了新途径。接下来,我们将进行实践操作:借助 DEAP 与 Qlib,执行一次完整的因子培育,并评估其对投资组合表现的影响。