Deap牛刀小试,挖掘出长期年化29.2%的轮动因子

往原创内容第774篇,专注量化投资、个人成长与财富自由。

继续优化deap因子挖掘。

大家的核心诉求是“稳定持续赚钱”,切换到AI量化视角就是交付低回撤的高收益策略,而策略的核心是因子。就是如何找到因子。

传统人工构建、规则信号肯定是低效的。

通过遗传算法、强化学习等去找到好的因子才是王道。

牛刀小试,挖掘出年化29.2%的轮动因子:

图片

 

{'ts_cov(low, open, 10)': np.float64(0.28487583819680373),

'ts_cov(low, high, 10)': np.float64(0.254114759001814),

'inv(low)': np.float64(0.24075309737516704),

'ts_cov(open, high, 10)': np.float64(0.22695529559423488),

'ts_cov(low, volume, 20)': np.float64(0.20794227483346384),

'ts_cov(open, high, 120)': np.float64(0.18873854006052104),

'sqrt(inv(ts_corr(volume, high, 60)))': np.float64(0.15951674502459867),

'sqrt(abs(kf(low)))': np.float64(0.14909771143185702),

'ts_cov(low, high, 20)': np.float64(0.14411107652056132),

'sqrt(abs(kf(volume)))*1': np.float64(0.14247985396647134),

'sqrt(abs(kf(volume)))': np.float64(0.14247985396647134),

'sqrt(abs(kf(volume+60-log(low))))': np.float64(0.14247985396647134),

'ts_cov(open, high, 20)': np.float64(0.13979288180259397),

'inv(volume-high)': np.float64(0.13759568515253662),

'open*1': np.float64(0.13215586401877144),

'sqrt(open*20)': np.float64(0.13215586401877144)}

from deap import base, creator, gp
import numpy as np
from alpha.deap_patch import *  # noqa
# 创建一个新类 FitnessMax,参数weights:(1.0,),就是最大化
from alpha import *

creator.create("FitnessMax", base.Fitness, weights=(1.0,))
# creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMax)

from deap import base, creator, tools

creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
from alpha.init_pset import get_pset

pset = get_pset()
toolbox.register("expr", gp.genHalfAndHalf, pset=pset, min_=1, max_=5)
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.expr)
# print(toolbox.individual())
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

toolbox.register("evaluate", print)  # 、,在map中一并做了

toolbox.register("select", tools.selTournament, tournsize=3)  # 目标优化
# toolbox.register("select", tools.selNSGA2)  # 多目标优化 FITNESS_WEIGHTS = (1.0, 1.0)
toolbox.register("mate", gp.cxOnePoint)
toolbox.register("expr_mut", gp.genFull, min_=0, max_=2)
toolbox.register("mutate", gp.mutUniform, expr=toolbox.expr_mut, pset=pset)

toolbox.register('map', backtester)

import operator

toolbox.decorate("mate", gp.staticLimit(key=operator.attrgetter("height"), max_value=17))
toolbox.decorate("mutate", gp.staticLimit(key=operator.attrgetter("height"), max_value=17))

pop = toolbox.population(10)

for p in pop:
    print(stringify_for_sympy(p))

hof = tools.HallOfFame(10)
# 只统计一个指标更清晰
stats = tools.Statistics(lambda ind: ind.fitness.values)
# 打补丁后,名人堂可以用nan了,如果全nan会报警
stats.register("avg", np.nanmean, axis=0)
stats.register("std", np.nanstd, axis=0)
stats.register("min", np.nanmin, axis=0)
stats.register("max", np.nanmax, axis=0)

# 使用修改版的eaMuPlusLambda
population, logbook = eaMuPlusLambda(pop, toolbox,
                                     # 选多少个做为下一代,每次生成多少新个体
                                     mu=150, lambda_=100,
                                     # 交叉率、变异率,代数
                                     cxpb=0.5, mutpb=0.1, ngen=3,
                                     # 名人堂参数
                                     # alpha=0.05, beta=10, gamma=0.25, rho=0.9,
                                     stats=stats, halloffame=hof, verbose=True,
                                     # 早停
                                     early_stopping_rounds=5)

print('=' * 60)
#print(logbook)

print('=' * 60)

def print_population(population):
    for p in population:
        expr = stringify_for_sympy(p)
        print(expr, p.fitness)

print_population(hof)

因子挖掘有一个系列,从遗传算法(gplearn或者deap),到强化学习符号生成,还有大模型因子生成(关于大模型LLM因子挖掘的思考),都是通过生成海量的因子,然后“拟合”最优。

这里还有一个工作要继续细化,就是因子表达式的函数集。而框架本身的工作,够用就好(原本打算把gplearn扩展一下,但感觉意义有限)。重点在因子函数集上发力,完善因子表达式系统(qlib的扩展)。

这个层面就够用了,加上lightGBM ranker以及transformer这样的模型,就完善了。

代码位置:

图片

本周的代码统一本周五更新,aitrader_4.0改动比较大:AI量化实验室——2024量化投资的星辰大海

吾日三省吾身

回看过去五年,是有进步的。

一个开始,缘自一个起心动念,做成一件事。

也有机缘巧合,运气加持。

ABZ之布局基本成型,需要感恩和持续努力。

往前看五年。

该规划太难,没有人知道未来会如何。

但一些目标和方向是需要的,至少你需要了解自己希望去往何方,过什么样的生活,然后想想,如何让自己配得上她。

未来五年的目标,仍然是财富小自由(至少积累可投资本金500个W),然后探索出通过财富大自由之路(5000个W起)。

流量在哪里,机会就在哪里。

向水草丰美的地方流动,做有价值的内容,就是这样。

开始缘自一次起心动念,然后就是短期“不计回报”的持续投入,为目标建立一个系统。

开始理解芒格说的:宏观是我们必然承受的,而微观才是我们有所作为的。

有些朋友,刷新闻,就关注各种大的局势,花边,各种宏大叙事。讲叙事很容易,亲自做做成一点点小事情才难。

并不是说不需要抬头看天,当然需要。大规律和趋势就那么一点,而且需要通过自己的深度思考和实践去认知。而不是刷几篇文章就可以解决。

代码与数据下载地址:AI量化实验室——2024量化投资的星辰大海

AI量化实验室 星球,已经运行三年多,1300+会员。

aitrader代码,含几十个策略源代码,因子表达式引擎、遗传算法(Deap)因子挖掘引等,支持vnpy,qlib,backtrader和bt引擎,名内置多个年化30%+的策略,每周五迭代一次,代码和数据在星球全部开源。

图片

扩展  •  历史文章   

EarnMore(赚得更多)基于RL的投资组合管理框架:一致的股票表示,可定制股票池管理。(附论文+代码)

10年17倍:使用卡曼滤波过滤器优化动量和斜率策略(python代码策略下载)

年化16%,最大回撤7.5%,卡玛比率超过2的实盘策略(附python代)

aitrader_v3.2代码发布:含波动率组合策略,年化19.3%(python代码+数据)

### 使用DEAP框架进行因子分析的相关操作 #### DEAP框架简介 DEAP(Distributed Evolutionary Algorithms in Python)是一个用于快速原型设计和测试进算法的Python库[^1]。该框架允许用户定义复杂的遗传算法并应用于各种优问题。 #### 遗传算法中的因子分析应用 在遗传算法中引入因子分析可以增强模型的表现力,通过识别数据集内的潜在结构来改进特征选择过程。因子分析是一种统计方法,旨在描述观测变量之间的协方差关系,并将其归因于少量不可观察的因素或潜变量[^2]。 #### 实现步骤概述 为了利用DEAP执行基于遗传算法的因子分析任务,主要涉及以下几个方面: - 定义适应度函数:衡量个体性能的标准; - 创建种群初始机制:随机生成初始解空间样本; - 设计交叉变异算子:模拟自然界的基因重组现象; - 整合因子分析模块:作为评估过程中的一部分,帮助提取重要特性。 #### 代码示例 下面给出一段简单的Python代码片段,展示如何结合DEAP因子分析技术处理一组假设的数据集: ```python import numpy as np from deap import base, creator, tools, algorithms from sklearn.decomposition import FactorAnalysis # 假设有一个n_samples * n_features 的数据矩阵 X X = ... def eval_fitness(individual): """计算单个染色体(即候选解决方案)对应的适应度""" # 应用因子分析降维 fa = FactorAnalysis(n_components=int(np.sum(individual))) transformed_data = fa.fit_transform(X) # 这里可以根据具体需求自定义其他评价指标... score = sum(transformed_data.var(axis=0)) return score, creator.create("FitnessMax", base.Fitness, weights=(1.0,)) creator.create("Individual", list, fitness=creator.FitnessMax) toolbox = base.Toolbox() toolbox.register("attr_bool", np.random.randint, 2) toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=X.shape[1]) toolbox.register("population", tools.initRepeat, list, toolbox.individual) toolbox.register("mate", tools.cxTwoPoint) toolbox.register("mutate", tools.mutFlipBit, indpb=0.05) toolbox.register("select", tools.selTournament, tournsize=3) toolbox.register("evaluate", eval_fitness) pop = toolbox.population(n=300) result = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=40)[0] best_ind = tools.selBest(result, k=1)[0] print(f"最佳个体: {best_ind}") ``` 此段程序展示了怎样构建一个基本的遗传算法循环,在每次迭代期间都会调用`eval_fitness()` 函数对当前群体成员打分;而评分依据则是经过因子分析转换后的低维度表示形式下的方差总和——这只是一个例子,实际应用场景下可能还需要考虑更多因素以确保最终结果的有效性和鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI量化投资实验室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值