多因子选股体系主要包括 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%}