昨天的文章gplearn之因子挖掘,与我们的数据集整合(代码),我们通过gplearn挖出了一堆因子,但好不好,需要通过fitness适应度来筛选。
在昨天代码的基础上,我们新增model的保存:
import pandas as pd
import cloudpickle
from gplearn.fitness import make_fitness
from gplearn.genetic import SymbolicTransformer
import gplearn as gp
import time
from engine.alpha.funcs import funcs_set
from engine.alpha.metrics import _my_metric_backtest
my_metric = make_fitness(function=_my_metric_backtest, greater_is_better=True)
def gp_fit(df_train, label):
init_function = ['add', 'sub', 'mul', 'div', 'sqrt', 'abs', 'sin', 'cos', 'tan']
init_function.extend(list(funcs_set))
trans = SymbolicTransformer(
generations=5, # 整数,可选(默认值=20)要进化的代数
population_size=1000, # 整数,可选(默认值=1000),每一代群体中的公式数量
hall_of_fame=100,
n_components=100, # 最终生成的因子数量
function_set=init_function,
parsimony_coefficient=0.0005,
max_samples=0.9,
verbose=1,
const_range=(10.0, 20.0),
feature_names=list('$ ' + n for n in df_train.columns),
random_state=int(time.time()), # 随机数种子
n_jobs=-1, #metric=my_metric, ) trans.fit(df_train, label) print(trans) best_programs = trans._best_programs best_programs_dict = {} for p in best_programs: factor_name = 'alpha_' + str(best_programs.index(p) + 1) best_programs_dict[factor_name] = {'fitness': p.fitness_, 'expression': str(p), 'depth': p.depth_, 'length': p.length_} best_programs_dict = pd.DataFrame(best_programs_dict).T best_programs_dict = best_programs_dict.sort_values(by='fitness') print(best_programs_dict) filename = 'factors.pkl' with open(filename, 'wb') as f: cloudpickle.dump(trans, f) if __name__ == '__main__': from engine.config import etfs from engine.datafeed.dataloader import CSVDataloader symbols = etfs loader = CSVDataloader(symbols, start_date="20100101") df = loader.load(fields=['shift(close,-20)/close-1'], names=['label']) df.dropna(inplace=True) cols = ['open', 'high', 'low', 'close', 'volume'] gp_fit(df[cols], df['label'])
看这个fitness值(默认就是因子IC),看起来还不错,当然这些因子有点长,我们后续会优化。
从本地加载训练好的模型,可以直接计算因子值:
if __name__ == '__main__': import cloudpickle filename = 'factors.pkl' with open(filename, 'rb') as f: est_gp = cloudpickle.load(f) best_programs = est_gp._best_programs best_programs_dict = {} for p in best_programs: factor_name = 'alpha_' + str(best_programs.index(p) + 1) best_programs_dict[factor_name] = {'fitness': p.fitness_, 'expression': str(p), 'depth': p.depth_, 'length': p.length_} best_programs_dict = pd.DataFrame(best_programs_dict).T best_programs_dict = best_programs_dict.sort_values(by='fitness') print(best_programs_dict)
按因子值从大到小轮动,接入我们自己的回测系统:
pred_data = pd.DataFrame(factors_pred).T.T pred_data.index = df.index factor = pred_data[50] df['factor'] = factor e = Env(df) e.set_algos([ RunMonthly(), SelectTopK(order_by='factor', b_ascending=False, K=3), WeightEqually() ]) e.backtest_loop() e.show_results()
(仅做单因子回测评估之用)
代码在这里:知识星球与开源项目:万物之中,希望至美
人生感悟:
今天看到一句话,觉得挺好。跟大家分享。
“做一个有少年气的中年人,看到生命的偶然和无意义,仍然热爱生命,创造意义”。
少年气是什么,就是什么都没有,明天不知道在何方,但心怀希望,觉得明天一定会更好。
生命的偶然和无意义,这不是消极。人生本无意义,但热爱生活的人自己赋予生命的意义。因此,生活没有模板,没有样板,遵循你内心的感受就好——在法律的框架内。
人生没有意义,从内心的道德出发,把养我们的人养老,我们养的人养大,然后就是一种体验。昨天一本书“允许一切发生”,作者自称是“地球观光客,人生体验家”。这个提法很有意思。走完不长不短的人生,我们能留下什么呢?普通人就是一些回忆,而且带不走。王侯将相也不过历史书上寥寥数笔。
——那么,你还要纠结什么呢?尽情地去体验吧。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/104100
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!