自研“因子流水线”之遗传算法的交叉与变异的python代码实现

原创文章第625篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。

昨天咱们把生成因子的语法树写出来了:

自研“因子挖掘流水线”——语法树的实现(附python代码)

其实代码并不复杂,但确实比较精妙。——这是借了deap的思路,gplearn没办法带period参数,比如ts_max(high,20),这里的20,gplearn支持不了,所以这一段代码不用。

函数算子是不需要预定义的,这是deap与gplearn架构的根本区别。

只需要起一个函数名即可,而计算延迟到“因子表达式”来进行。

图片

生成表达式几乎不需要消耗时间的,包括表达式演进,而大量的时间,其实是花在因子计算以及fitness和 metrics指标上。

exprs = Expressions()

# 一元函数,不带period
for u in ['log', 'neg']:
    exprs.add_function(Expression(u, type_=EXPR, args=[EXPR]))

# 一元函数,带period
for u_r in ['delay', 'ts_min', 'ts_max', 'ts_argmin', 'ts_argmax',
            'ts_sum', 'ts_std', 'ts_rank',
            'ts_DEMA', 'ts_KAMA']:
    exprs.add_function(Expression(u_r, type_=EXPR, args=[EXPR, int]))

# 二元带period
for binary_rolling in ['ts_corr', 'ts_AROONOSC']:
    exprs.add_function(Expression(binary_rolling, type_=EXPR, args=[EXPR, EXPR, int]))

# 三元带period
for t_rolling in ['ts_WILLR', 'ts_CCI', 'ts_ADX']:
    exprs.add_function(Expression(t_rolling, type_=EXPR, args=[EXPR, EXPR, EXPR, int]))

for c in ['close', 'open', 'high', 'low', 'volume']:
    exprs.add_function(Expression(c, type_=EXPR, args=[]))

for p in [1, 3, 5, 10, 20, 40, 60]:
    exprs.add_function(Expression(str(p), type_=int, args=[]))

下面咱们再来介绍因子表达式的交叉与变异

图片

这一部分可以借用gplearn的代码:

点变异——就是按设定的概率,随机选择点位,比如位置2,把第2个位置的Expression替换成同group的。就是参数列表需要一致(否则就不符合语法了)。

# Get the nodes to modify
mutate = np.where(random_state.uniform(size=len(program)) <
                  self.p_point_replace)[0]

for node in mutate:
    if isinstance(program[node], Expression):
        group = program[node].group
        # Find a valid replacement with same arity
        replacement = len(exprs.group_exprs[group])
        replacement = random_state.randint(replacement)
        replacement = exprs.group_exprs[group][replacement]
        program[node] = replacement

如下例子,第二个位置发生变异,由ts_std变成了ts_KAMA。

图片

剪枝变异更激进一些——随机选一枝,然后在一枝里再随机选一段接到原来的位置。

def hoist_mutation(self, random_state):
   
    # Get a subtree to replace
    start, end = self.get_subtree(random_state)
    subtree = self.nodes[start:end]
    # Get a subtree of the subtree to hoist
    sub_start, sub_end = self.get_subtree(random_state, subtree)
    hoist = subtree[sub_start:sub_end]
    # Determine which nodes were removed for plotting
    removed = list(set(range(start, end)) -
                   set(range(start + sub_start, start + sub_end)))
    return self.nodes[:start] + hoist + self.nodes[end:], removed

子树变异:随机生成一棵新树,然后与现有的树交叉:

def subtree_mutation(self, random_state):
    
    # Build a new naive program
    chicken = self.generate()
    # Do subtree mutation via the headless chicken method!
    return self.crossover(chicken, random_state)

完整代码下载:AI量化实验室——2024量化投资的星辰大海

图片

吾日三省吾身

年少时,曾梦想仗剑走天涯。

曾经,觉得很多东西不是必须的,比如房子、车子、定居之类的。

曾经,认为西湖论剑尽在咫尺,弹笑间,樯橹飞灰烟灭。——却未曾想过,如何做到。

确实,有人做到了,比如董宇辉,比如小杨哥。

而立之年,各方压力,向现实妥协。

所谓“成熟”就是务实了,脚踏实地了。

开始积累,开始爬社会阶梯。

爽文的剧本,终究离普通人太远。

一晃年过不惑,意识上接受——平凡也挺好。

然而,潜意识不接受。

潜意识注入了太多梦。

那些梦,关于传奇,关于世界之巅,关于“春风得意马蹄疾,一日看尽长安花”。

年轻时,拥有的东西很少,但心怀希望。

希望是世界上最美的东西。——她可以让你住在几平米的小出租屋的单间,刷题、写代码。——这是关于希望、信心和勇气。

所谓“命运“。命是你的习惯,性格,过往经历所决定的;运是你可以通过学习,成长,认知提升去改变的。

运气与环境相关。——时来天地皆同力,运去英雄不自由。

务实来讲,你想要的财富源自于你能给社会提供的价值。

价值源于你创造的产品或服务

创造产品,提供给用户,获得正向反馈,持续迭代与优化。

梦还要继续做,只是会更加务实。

历史文章:

自研“因子挖掘流水线”——语法树的实现(附python代码)

整合deap和gplearn的代码,打造自研的因子流水线

AI量化实验室——2024量化投资的星辰大海

图片

源代码123

开源项目821

以交易为生59

源代码 · 目录

上一篇自研“因子挖掘流水线”——语法树的实现(附python代码)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI量化投资实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值