原创内容第895篇,专注智能量化投资、个人成长与财富自由。
今天发布aitrader_core_1.2,代码已经发布到星球:
from deap import base, creator, gp
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
def init_tool_box():
# 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 deap_factor.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)
from deap_factor.backtest import backtester
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))
return toolbox
if __name__ == '__main__':
from deap_factor import utils
from deap import tools
import numpy as np
my_tool_box = init_tool_box()
# 这里定义初始化的因子数,可以得行修改
print('开始生成因子...')
pop = my_tool_box.population(10)
for p in pop:
print(utils.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)
#print(stats)
from deap_factor.deap_patch import * # noqa
population, logbook = eaMuPlusLambda(pop, my_tool_box,
# 选多少个做为下一代,每次生成多少新个体
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)
trend_score(trend_score(trend_score(high, 40), 1), 25)
trend_score(cs_rank(ts_std(high, 25)-open)+10, 25)
trend_score(volume, 30)-ts_std(high, 25)-ts_slope2(trend_score(close, 60), 120)
trend_score(cs_rank(high-open)+10, 25)
trend_score(cs_rank(trend_score(volume, 30)-open)+10, 25)
trend_score(close, 120)
trend_score(ts_slope2(ts_argmax(close, 40), 120)+10, 25)
100%|██████████| 49/49 [00:17<00:00, 2.81it/s]
{'trend_score(volume, 30)-ts_std(high, 25)-ts_slope2(ts_argmax(ts_min(close, 60), 40), 120)': np.float64(0.2528221602140279), 'trend_score(volume, 25)-ts_std(high, 25)-ts_slope2(ts_argmax(ts_min(close, 60), 40), 120)': np.float64(0.2528221602140279), 'open/close': np.float64(0.24995681472423592), 'trend_score(close, 25)': np.float64(0.2384714464117741), 'trend_score(low, 25)': np.float64(0.22600332434410308), 'trend_score(volume, 120)-ts_mean(close, 40)+trend_score(close, 25)-ts_slope2(ts_argmax(close, 40), 120)': np.float64(0.2245671846117263), 'trend_score(ts_abs(close)*ts_log(close), 30)-ts_std(high, 25)-ts_slope2(ts_argmax(close, 25), 120)': np.float64(0.22345032952292576), 'trend_score(low+10, 25)': np.float64(0.22330608686614872), 'trend_score(high, 30)/25': np.float64(0.22063716048964244), 'trend_score(high, 30)/20': np.float64(0.22063716048964244), 'ts_slope2(ts_min(close, 120), 40)/volume': np.float64(0.2198712163727523), 'trend_score(ts_abs(close)*ts_log(close), 30)-ts_std(high, 25)-ts_slope2(ts_argmax(close, 40), 120)': np.float64(0.21946497840592927), 'trend_score(close+10, 25)': np.float64(0.20456012511415933), 'trend_score(cs_rank(high-open)+10, 25)': np.float64(0.19941719655494716), 'trend_score(cs_rank(high-open)+30, 25)': np.float64(0.19551277442374038), 'trend_score(cs_rank(high-open)+40, 25)': np.float64(0.19551277442374038), 'trend_score(cs_rank(high-open)+120, 25)': np.float64(0.19493367466113254), 'trend_score(volume, 120)-low-ts_slope2(ts_argmax(close, 40), 120)': np.float64(0.17762363095168565), 'roc(ts_min(volume, 10), 5)': np.float64(0.17505529379055695), 'ts_slope2(ts_min(close, 120), 120)/volume': np.float64(0.16055052466542707), 'trend_score(volume/25, 30)-ts_std(high, 25)-ts_slope2(ts_argmax(close, 40), 120)': np.float64(0.1564023176588656), 'ts_mean(ts_argmin(low, 40), 60)': np.float64(0.15108422369144958), 'trend_score(volume, 30)-ts_std(high, 25)-ts_slope2(ts_argmax(low, 40), 120)': np.float64(0.14277517835451503), 'trend_score(volume, 30)-ts_std(high, 40)-ts_slope2(ts_argmax(close, 40), 120)': np.float64(0.13317960966279463), 'trend_score(volume, 30)-ts_std(high, 25)-ts_slope2(ts_argmax(close, 40), 120)': np.float64(0.13275270776895476), 'trend_score(volume/25+10, 25)': np.float64(0.11983921550003318)}
{'avg': array([0.21339417]), 'std': array([0.02849871]), 'min': array([0.11983922]), 'max': array([0.25282216])}
大家可以通过替换symbols和扩充因子库来做更多的事情。
有同学的策略,超过的年化300%,大家可以去看看:
http://ailabx.com/mall
吾日三省吾身
浪漫的想法,都是,如何可以回到从前。。。
你突然从梦中醒来,发现自己是在初中的课堂上睡着了,现在经历的一切都是一场梦, 桌上满是自己的口水。
你还告诉同桌,说自己做了一个好长好长的梦。
同桌骂你白痴,叫你好好听课。
你看着窗外的操场, 一切都那么熟悉, 一切还充满希望…
过去是确定的历史,回到过来,说明你想好好体验一些事情,因为你不必担心未来,你真实的知道过程。
就好比你知道一部电视剧的大结局,然后你再去看过程中的艰难险阻,你会觉得,尽性就好,体验一切。
没有过程中的焦虑,担忧和恐惧。
一切都带着主角光环。
可以,人生其实充满了“蝴蝶效应”。
你改变了一个点,后面就全变了,一样的不可预知。
反而,我们可能告诉自己,其实大结局我们本来就知道,所有人的大结局都是一样的。
大胆一点,尽兴一点,继往不恋,未来不迎,当下不杂!
现在没有年轻时的浪漫想法。
这两天闪过的念头,是,如果人生可以快进呢?
快进五年,十年??
为什么呢?
十年后孩子就长大了。
自由的束缚,一个孩子教育,二是工作地点。
孩子长大了,有自己的生活了,不必我们事事牵挂了。
我们也差不多退休了,或者应该财富自由了。
可是快进十年,父母都更老了。
也有人说,陪孩子长大也就这么几年时间。
还有,人到中年,快进之后,那就真步入中老年阶段了。
人不就活个过程嘛。
都是生不带来,死不带去。
代码和数据下载:AI量化实验室——2025量化投资的星辰大海
AI量化实验室 星球,已经运行三年多,1700+会员。
aitrader代码,因子表达式引擎、遗传算法(Deap)因子挖掘引擎等,支持vnpy,qlib,backtrader和bt引擎,内置多个年化30%+的策略,每周五迭代一次,代码和数据在星球全部开源。
扩展 • 历史文章
EarnMore(赚得更多)基于RL的投资组合管理框架:一致的股票表示,可定制股票池管理。(附论文+代码)
年化收益200%+的策略集 | 实时板块资金热力图 「aitrader 5.0系统代码发布」
机器学习驱动的策略开发通过流程 | 普通人阶层跃迁的可能路径?
年化30.24%,最大回撤19%,综合动量多因子评分策略再升级(python代码+数据)
三秒钟创建一个年化28%,夏普比1.25的策略(python系统已开放源代码下载)