gplearn筛选高ic值因子,单因子回测(代码下载)

昨天的文章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
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 29 日
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注