DeepAlphaGen:强化学习的因子组合挖掘:框架代码+数据下载

后面咱们社群的规则:

1、每周打包更新系统源代码及数据1次(暂定每周五)

2、加一条主线:给星友们提供线上化的回测系统,避免新同学安装,使用的成本。(代码仍然会提供下载)。

3、官方提供成熟可实盘策略供订阅

从很多量化书上最简单,但最实用的——大小盘轮动策略:

def gen_rollong():
proj = ProjConfig()
proj.name = '大小盘轮动策略'
proj.commission = 0.0001
proj.slippage = 0.0001
proj.symbols = ['159915.SZ', '510300.SH'] # 证券池列表
proj.benchmark = '000300.SH'
proj.start_date = '20120528'
proj.data_folder = 'etfs' # 这里指定data/数据目录

fields = ['roc(close,20)']
names = ['roc_20']
proj.fields = fields
proj.names = names

# 这里是策略算子列表
proj.algos.append(
AlgoConfig(name=SelectBySignal().name, kwargs={'rules_buy': ['roc_20>0.02'], 'rules_sell': ['roc_20<-0.02']})

) proj.algos.append( AlgoConfig(name=SelectTopK().name, kwargs={'factor_name': 'roc_20'}) ) proj.algos.append(AlgoConfig(name=WeightEqually().name)) proj.algos.append(AlgoConfig(name=Rebalance().name))

return proj

图片

12年年化20.3%,某ETF软件上,这个策略是20%+,这个大家可以仔细检查一下。

后面我会把类似这样的策略SAAS化,同步每边自动更新数据,盘后自动更新策略。

吾日三省吾身

这个系列源于”N阶行动计划“,就是1件事情,先干它1000天再说。

不知不觉,日更了365天,一个真正意义上的完整年份,挺有成就感的

收获了600+位星友的支持。

大家的提问,参与,提供了动力,坚持的意义。

当然,有时候也会焦虑,大家的基础不一样,比如python如何安装,环境都是问题,尽管我们一直在努力营造星球的学习氛围。但肯定还有很大的提升空间。

另外一个更关键的是:如何提供价值。

用户的认可,来自价值创造,解决问题。

几次例会,从公募,到私募,到分钟级,到高频,到订单簿… 从深度学习到强化学习,GPU,超级计算。。。

但突然想到,曲高而和寡。C++的人少,python次之,excel更多,更多人就是理财诉求。

或者说,傻瓜式的操作,或者直接给策略。大家当然对策略感兴趣。尤其是收益高,夏普比还高的策略。

提供工具类的,我在想,就算是傻瓜向导式,用户就能用得起来么?看着热闹罢了。——当然也是一种模式。策略不在于多而在于有效,而且会自动进化。

用户需要安装python环境或者软件都是门槛,完全可以SAAS化。

我们的初心是什么?——投资是件必须做,但应该是轻松、美好的事情。

今天开始深度学习挖因子。

前面的文章开了个头:DeepAlphaGen:强化学习的因子组合挖掘

主流的公、私募量化,多因子模型是重中之重和热点方向。容量大,可以与前沿技术相结合。

东方证券的一张图:多因子选股体系

图片

多因子选股体系主要包括 Alpha 模型、风险模型、交易成本模型和组合优化四个模块。Alpha 模型负责对股票收益或 Alpha 的预测,对组合收益的影响相对更大,是量化研究的重中之
重。传统的 Alpha 模型一般分为 Alpha 因子库构建和 Alpha 因子加权两个核心步骤。

其中:在 Alpha 因子构建中,可以引入的常见机器学习模型主要有两大类:遗传规划和神经网络

先挖掘因子,再合成,忽略了因子之间的相互作用。

今天开始要代码实现的:一种新的因子组合挖掘框架,直接使用因子组合的表现来优化一个强化
学习因子生成器,最终生成的是一组公式因子集合,这些因子协同使用具有较高的选股效力。这
样做既能保留遗传规划算法公式化的优势,也能提升模型泛化能力,适应多种股票池,还能大幅
提升运算效率。

论文上周已经在星球里分享,代码后续会跟上。

【优惠券】知识星球与开源项目:万物之中,希望至美

图片

我对这篇论文感兴趣的核心在于,它具备一定程度上的通用性,集传统遗传规划的优点,可以显示生成表达式,结果了深度学习的泛化能力和端到端的能力。另外,原作者是提供代码的,不过它使用qlib的数据库,我进行了拆分,与咱们的开源项目,数据模块整合起来,让这个模块更加通用。

核心代码在Quantlab工程的如下位置:alphagen。

图片

代码环境,需要:pytorch框架上的强化学习包:

stable_baselines3==2.0.0
sb3_contrib==2.0.0

核心的调用代码如下:

import json
import os
from datetime import datetime
from typing import Optional

import numpy as np
from sb3_contrib import MaskablePPO
from stable_baselines3.common.callbacks import BaseCallback

from alphagen.data.calculator import AlphaCalculator
from alphagen.models.alpha_pool import AlphaPool, AlphaPoolBase
from alphagen.rl.env.core import AlphaEnvCore
from alphagen.rl.env.wrapper import AlphaEnv
import torch

from alphagen.rl.policy import LSTMSharedNet
from alphagen.utils import reseed_everything
from alphagen.caculator.duckdb_caculator import DuckdbCalculator


def train(seed: int = 0, pool_capacity: int = 10, steps: int = 200_000, instruments: str = "csi300"):
    calculator_train = DuckdbCalculator(instrument=instruments,
                           start_time='2010-01-01',
                           end_time='2019-12-31')
    calculator_valid = DuckdbCalculator(instrument=instruments,
                           start_time='2020-01-01',
                           end_time='2020-12-31')
    calculator_test = DuckdbCalculator(instrument=instruments,
                          start_time='2021-01-01',
                          end_time='2022-12-31')

    pool = AlphaPool(
        capacity=pool_capacity,
        calculator=calculator_train,
        ic_lower_bound=None,
        l1_alpha=5e-3
    )

    reseed_everything(seed)

    device = torch.device('cuda:0')
    env = AlphaEnv(pool=pool, device=device, print_expr=True)

    name_prefix = f"new_{instruments}_{pool_capacity}_{seed}"
    timestamp = datetime.now().strftime('%Y%m%d%H%M%S')

    checkpoint_callback = CustomCallback(
        save_freq=10000,
        show_freq=10000,
        save_path='/path/for/checkpoints',
        valid_calculator=calculator_valid,
        test_calculator=calculator_test,
        name_prefix=name_prefix,
        timestamp=timestamp,
        verbose=1,
    )

    model = MaskablePPO(
        'MlpPolicy',
        env,
        policy_kwargs=dict(
            features_extractor_class=LSTMSharedNet,
            features_extractor_kwargs=dict(
                n_layers=2,
                d_model=128,
                dropout=0.1,
                device=device,
            ),
        ),
        gamma=1.,
        ent_coef=0.01,
        batch_size=128,
        tensorboard_log='/path/for/tb/log',
        device=device,
        verbose=1,
    )
    model.learn(
        total_timesteps=steps,
        callback=checkpoint_callback,
        tb_log_name=f'{name_prefix}_{timestamp}',
    )

其中DuckdbCaculator是我们实现的。

就是根据表达式计算因子,IC值等等。

使用了sb3的强化学习扩展包里的MaskablePPO算法

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103760
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

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

相关推荐

发表回复

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