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

发布于: 雪球转发:0回复:0喜欢:0

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

2018年,看到机会,但没有知行合一,2020左右完成建仓。

2023年,我看到的是机会,这次争取知行合一。

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

前面的文章开了个头: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算法

明天继续。

投资体系,由胜率与赔率构成:一个稳定获利的实盘策略迭代(一)(代码与数据下载)

网页链接{AI量化系统Quantlab V1.7代码更新,支持pybroker引擎,含大类资产风险平价及波动率策略源码集,平均年化15%}

Quantlab开源量化系统升级:底层兼容pybroker,附年化20%的ETF波动率策略。

年化18.8%的ETF轮动改进,夏普比1.283

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