Quantlab3.4代码发布 | lightGBM排序轮动 | 29个行业机器学习合成因子轮动策略(代码+数据+模型下载)

本文介绍了Quantlab3.4版本的重要更新,包括支持截面rank函数的因子编写、基于机器学习的因子集、lightGBM分类和排序模型,以及基于模型的多因子轮动策略模板。同时提及了模型训练和潜在的过拟合问题,展示了AI在量化投资领域的最新进展。
摘要由CSDN通过智能技术生成

原创文章第444篇,专注“AI量化投资、个人成长与财富自由"。

按咱们星球的惯例,今天发布代码:Quantlab3.4。

quantlab 3.4重要更新: 

1、支持截面rank函数写因子。 

2、alpha158因子集。 

3、lightgbm分类和排序模型。 

4、基于模型的多因子轮动策略模板。

5、29个主要行业指数的机器模型轮动策略。

图片

图片

1、截面rank函数。

咱们的函数基本都是时序的,比如 log, std,或者常见的均线,macd,布林带等。

rank需要特殊处理,它是groupby('date'),就是某一天截面数据的排序分位点。

def rank(se: pd.Series):
    ret = se.groupby(level=1).rank(pct=True)
    return ret

2、本期咱们是机器学习合成因子,因此需要因子集:

代码在工程的如下位置:

图片

考虑到性能,我只选了十几个,这个大家可以添加自己的因子进来即可。

windows = [2, 5, 10, 20]
fields += ['close/shift(close,%d) - 1' % d for d in windows]
names += ['roc_%d' % d for d in windows]

fields += ['avg(volume,1)/avg(volume,5)']
names += ['avg_amount_1_avg_amount_5']

fields += ['avg(volume,5)/avg(volume,20)']
names += ['avg_amount_5_avg_amount_20']

fields += ['rank(avg(volume,1))/rank(avg(volume,5))']
names += ['rank_avg_amount_1_avg_amount_5']

fields += ['avg(volume,5)/avg(volume,20)']
names += ['rank_avg_amount_5_avg_amount_20']

3、机器学习模型,lightGBM是所有学习算法里,效率兼性能最高的。

代码在engine/models下,一个分类模型,一个排序模型。大家重点关注排序模型。

图片

模型训练的模块在ModelTrainer里:

from config import DATA_DIR
from datafeed import CSVDataloader
from datafeed.factor.alpha import AlphaBase, AlphaLit


class ModelTrainer:
    def __init__(self, symbols, model_name='model.pkl', split_date='20200101'):
        self.model_name = DATA_DIR.joinpath('models').joinpath(model_name).resolve()
        self.split_date = split_date
        self.model_path = DATA_DIR.joinpath('models').joinpath(self.model_name)
        self.alpha = AlphaLit()
        self.symbols = symbols
        self._load_data()

    def _load_data(self):
        loader = CSVDataloader(path=DATA_DIR.joinpath('indexes'), symbols=self.symbols)

        features, feature_names = self.alpha.get_fields_names()
        fields, names = self.alpha.get_all_features_names()

        df = loader.load(fields=fields, names=names)
        df.dropna(inplace=True)
        self.df = df

    def train(self, train_func):
        df = self.df
        split_date = self.split_date
        df_train = df.loc[:split_date]
        df_val = df.loc[split_date:]

        fields,names = self.alpha.get_fields_names()

        train_func(df_train, df_val, feature_cols=names, model_save_path=self.model_path)


if __name__ == '__main__':
    etfs_indexes = {
        '159870.SZ': '000813.CSI',
        '512400.SH': '000819.SH',
        '515220.SH': '399998.SZ',
        '515210.SH': '930606.CSI',
        '516950.SH': '930608.CSI',
        '562800.SH': '930632.CSI',

        '515170.SH': '000815.CSI',
        '512690.SH': '399987.SZ',
        '159996.SZ': '930697.CSI',
        '159865.SZ': '930707.CSI',
        '159766.SZ': '930633.CSI',

        '515950.SH': '931140.CSI',
        '159992.SZ': '931152.CSI',
        '159839.SZ': '399441.SZ',
        '512170.SH': '399989.SZ',
        '159883.SZ': 'h30217.CSI',

        '512980.SH': '399971.CSI',
        '159869.SZ': '930901.CSI',
        '515050.SH': '931079.CSI',
        '515000.SH': '931087.CSI',
        '515880.SH': '931160.CSI',
        '512480.SH': 'h30184.CSI',
        '515230.SH': 'h30202.CSI',

        '512670.SH': '399973.SZ',
        '515790.SH': '931151.CSI',
        '159757.SZ': '980032.CNI',
        '516110.SH': 'h30015.CSI',

        '512800.SH': '399986.SZ',
        '512200.SH': '931775.CSI',
    }
    symbols = etfs_indexes.values()
    m = ModelTrainer(symbols=symbols)
    from engine.models.lightGBM_stockranker import train
    m.train(train_func=train)

图片

训练好的模型保存在如下位置data/models:

图片

多因子轮动策略模板:

在轮动之前,新增了SelectByModel算子,选择机器模型,并对数据进行预测计算。

@dataclass
class TaskRolling_Model(Task):  # 轮动策略模板
    def get_algos(self):
        return [
            RunAlways(),
            SelectBySignal(rules_buy=self.rules_buy,
                           buy_at_least_count=self.at_least_buy,
                           rules_sell=self.rules_sell,
                           sell_at_least_count=self.at_least_sell
                           ),
            SelectByModel(model_name=self.model_name,feature_names=self.feature_names),
            SelectTopK(factor_name=self.order_by, K=self.topK, drop_top_n=self.dropN,
                       b_ascending=self.b_ascending),
            self._parse_weights(),
            Rebalance()
        ]

29个行业,基于机器学习模型的轮动策略:

def Rolling_ranker():
    task = TaskRolling_Model()
    task.name = '轮动策略-29个行业指数-StockRanker'
    task.benchmark = '510300.SH'
    task.start_date = '20100101'
    task.symbols = list(etfs_indexes.values())
    task.data_path = 'indexes'
    task.model_name = 'ranker.pkl'

    alpha = AlphaLit()
    features, feature_names = alpha.get_fields_names()
    # fields, names = alpha.get_all_features_names()

    task.features = features
    task.feature_names = feature_names

    # task.rules_buy = ['roc_20>0.02']
    # task.rules_sell = ["roc_20<-0.02"]

    task.topK = 2
    return task

图片

拟在走通策略模型,明显出现了过拟合的情况,这个下周我们继续来做超参数优化,如何避免过拟合等,如果挖掘到更好的因子。

历史文章:

Quantlab3.3代码发布:全新引擎 | 静待花开:年化13.9%,回撤小于15% | lightGBM实现排序学习

创业板指布林带突破策略:年化12.8%,回撤20%+| Alphalens+streamlit单因子分析框架(代码+数据)

轮动策略模板重写,先来一个年化21%的策略(代码+数据)

去掉底层回测引擎,完全自研,增加超参数优化,因子自动挖掘,机器模型交易。

飞狐量化——AI驱动的量化。(持续给大家写代码的,交付最前沿AI量化技术和策略的星球AI量化实验室——2024量化投资的星辰大海

关于我:CFA,北大光华金融硕士,十年量化投资实战。 / CTO,全栈技术,AI大模型 。——应该是金融圈最懂技术的男人

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI量化投资实验室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值