原创文章第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代码)
源代码123
开源项目821
以交易为生59
源代码 · 目录
上一篇自研“因子挖掘流水线”——语法树的实现(附python代码)