分享

随机森林——多因子量化回测

 AI量化实验室 2023-10-12 发布于北京

达原创文章第188篇,专注“个人成长与财富自由、世界运作的逻辑,AI量化投资"。

昨天的文章,我们跑通了随机森林对全球指数的alpha158因子集,从结果上看,明显过拟合。

Alpha158因子集与随机森林拟合

从pickle中加载模型,并显示最重要的特征:

import pickle
import pandas as pd
pkl_filename = "pickle_model.pkl"
with open(pkl_filename, 'rb') as f:
clf = pickle.load(f)

df = pd.read_csv('factors.csv', index_col=0)
df.set_index('date', inplace=True)
label_col = 'LABEL0'
feature_cols = list(df.columns)
for c in ['code', 'LABEL0', 'open', 'high', 'low', 'close', 'volume']:
feature_cols.remove(c)
print(feature_cols)

# 重要性就是决策树给出的feature_importances_
factor_weight = pd.DataFrame({'features': list(feature_cols),
'importance': clf.feature_importances_}).sort_values(
# 这里根据重要程度降序排列,一遍遍找到重要性最高的特征
by='importance', ascending=False)
print(factor_weight)
factor_weight.to_csv('importance.csv')

取排名得分最高的前5,做下测试:

feature_cols = ['ROC60', 'CORD60', 'STD60', 'IMXD60', 'CORR60']

feature_cols =['CNTP10', 'RANK20', 'CNTP5', 'CNTD5', 'RANK5']

从训练集来看,非常明显,其实158个因子里,这5个因子就够了,足够对数据进行划分,当然更多的因子没有带来特别负面的作用,就是训练的时间长了一些。不过随机森林支持多进程计算,所以,总体还好。

接下来,我们先不管这个模型的泛化能力,先把流程整理到回测引擎里看看效果。

年化26%,最大回撤23%。

按top1的逻辑:年化48%,最大回撤38%。

如下是我们的工程代码:

from quant_project.dataloader.dataloader import Dataloader
from quant_project.dataloader.dataset import Alpha158_Dataset
from quant_project.engine.algo.algos import *
from quant_project.engine.engine_runner import Engine

features = ['ROC60', 'CORD60', 'STD60', 'IMXD60', 'CORR60']

names = ['ROC60', 'CORD60', 'STD60', 'IMXD60', 'CORR60']
fields = ["Ref($close, 60)/$close", 'Corr($close/Ref($close,1), Log($volume/Ref($volume, 1)+1), 60)',
'Std($close, 60)/$close',
'(IdxMax($high, 60)-IdxMin($low, 60))/60',
'Corr($close, Log($volume+1), 60)']

from quant_project.dataloader.dataloader import Dataloader

fields += ['$close/Ref($close,1) -1']
names += ['rate']
df = Dataloader().load_datas('__all__', names, fields)

e = Engine(df)

print('初始总市值', e.acc.get_total_mv())
e.run(name='随机森林-多因子-月频-top1', algo_list=[
RunMonthly(), # 改这行代码即可
PredScore_Model(features=features),
SelectTopK(K=1),
WeightEqually()
])
print('最终总市值', e.acc.get_total_mv())
e.show_results(benckmarks=['000300.SH'])

df = df[features]

多因子使用机器学习,在代码层面上比较简单,但就是机器模型比较容易过拟合。后续我们可以把可转债的数据与之前的多因子规则——进行对比。

代码与模型已经发布到星球-专栏中,请大家前往下载。

Alpha158因子集与随机森林拟合

我的开源项目及知识星球

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多