精华帖子

弹性网络选股:机器学习多因子模型搭建

由bq5973r5创建,最终由bq5973r5 被浏览 2 用户

1. 策略概览

本策略属于中频多因子选股:使用价值、成长、质量、动量、波动/交易特征、规模等共 18 个因子构建特征,在滚动训练窗口(240 交易日)内训练 ElasticNet 模型,预测未来 20 个交易日收益的横截面排名(rank),并在每个调仓日选取 Top 30 股票等权持有,调仓周期为 20 个交易日。

策略核心特点:

  • 模型驱动的动态因子权重:不固定因子权重,通过 ElasticNet 自动学习权重与稀疏筛选。
  • 排序型目标:预测未来收益的 rank,符合选股“相对强弱排序”本质。
  • 信息隔离与无前视:关键修复点为“截面标准化在标签筛选之前完成”,避免 universe leakage(隐性前视偏差)。
  • 稳健处理:训练集分位裁剪(1%/99%)抑制极端值影响,预测集使用同一边界避免信息泄露。

参数设置(默认):

  • 调仓周期:20 交易日
  • 持股数量:30
  • 训练窗口:240 交易日
  • 标签预测周期:20 交易日
  • 模型:ElasticNet(alpha=0.005, l1_ratio=0.5)
  • 交易成本:买入万3、卖出万13、最低 5 元/笔

2. 股票池与数据过滤

本策略数据来自预处理因子库 cn_stock_prefactors。为保证可交易性与数据质量,在数据层做股票池过滤(该过滤旨在提升可实现性与可复现性,而非后验挑样本)。

过滤规则:

  • 市场板块:list_sector IN (1, 2, 3)(主板/中小/创业)
  • 指数覆盖:is_hs300=1 OR is_zz500=1 OR is_zz1000=1(提高流动性与容量)
  • 剔除:ST(st_status=0)、停牌(suspended=0)
  • 上市时间:list_days > 365
  • 数据有效性:pe_ttm > 0 AND pb > 0 AND close > 0 AND amount > 0

SQL(核心字段说明):

  • 包含行情字段:close/high/low/amount
  • 包含财务/估值:pe_ttm/pb/ps_ttm、营收同比、利润同比、ROE/ROA/毛利率/ROIC等
  • 额外取 future_close = m_lag(close, -20) 仅用于构造监督学习标签

3. 截面标准化与信息隔离(关键风控)

3.1 为什么要做截面标准化

多因子存在量纲差异,若直接进入带正则化的线性模型,惩罚项会对不同尺度因子产生不公平影响,导致权重偏向尺度较大的特征。因此,本策略对每个因子做按日截面的 Z-score 标准化

3.2 隐性前视偏差(Universe leakage)问题

监督学习需要未来标签(未来 20 日收益),这会导致部分样本在尾部日期没有 future_close。如果先剔除 future_close 缺失样本再做截面标准化,会引入隐性前视:

  • future_close 是否存在本质上依赖“未来是否还能拿到价格”
  • 若先剔除缺失样本,等于用未来可得性改变了当日横截面股票集合
  • 从而影响当日截面的均值/方差,造成标准化统计被污染(隐性前视)

3.3 本策略的修复流程

为避免上述问题,本策略严格采用以下顺序:

1)仅要求因子非空形成标准化基集(不要求 future_close)\n2)在该基集上按 date 进行因子截面标准化\n3)标准化完成后,再筛选 future_close 构造标签并进入训练

实现逻辑(关键思想):

  • 标准化的横截面统计必须基于“当日可见股票集合”
  • 标签仅用于监督学习,不得反向影响特征分布估计

4. 模型:ElasticNet 回归(因子筛选 + 稳定性)

4.1 为什么选 ElasticNet

多因子选股场景普遍存在:

  • 特征相关性高(共线性):如不同动量窗口、质量因子之间
  • 噪声与冗余特征:若无约束容易过拟合
  • 系数稳定性影响换手:权重剧烈波动会提升换手与成本

ElasticNet 同时引入 L1 与 L2 正则:

  • L1:促稀疏,实现自动筛选无效因子
  • L2:稳定权重,缓解共线性导致的不稳定

4.2 目标函数

其中:

  • alpha 对应 α:整体正则强度
  • l1_ratio 对应 ρ:L1 占比

4.3 弹性网络与ols的区别

第一张图:原始数据

  • 真实关系是:

    y=3x+噪声

  • 点呈线性趋势,但带有随机扰动

第二张图:OLS回归

  • OLS 会尽量拟合数据
  • 系数接近真实值
  • 不做任何正则化

OLS估计系数:\n≈ 2.78

第三张图:弹性网络回归

特点:

  • L1 → 稀疏化(类似Lasso)
  • L2 → 收缩(类似Ridge)
  • 会把系数往0方向压缩

ElasticNet估计系数:\n≈ 1.90

可以看到: 回归线变“平缓”,系数被压缩,防止过拟合

5. 滚动训练与预测流程

策略采用日频滚动训练,但交易执行按调仓周期发生。

5.1 训练窗口与样本划分

  • 训练窗口:过去 240 个交易日(约 1 年)
  • 预测时点:当前交易日截面
  • 仅当训练样本足够大且预测集不为空时才执行拟合(避免不稳定)

5.2 极值裁剪(稳健性与信息隔离)

对每个因子:

  • 在训练集上计算 1%/99% 分位数边界
  • 用同一边界裁剪训练集与预测集

该设计的两层含义:

  • 稳健性:减少极端值对系数的拉扯
  • 信息隔离:边界只来自训练集,预测集不参与任何统计估计

5.3 预测输出

模型输出 predicted_rank 为连续分数:

  • 含义:预测的相对强弱(用于排序)
  • 不解释为未来收益率的点预测

6. 因子贡献与可解释性输出

为避免“黑盒”印象并便于运营监控,本策略对 ElasticNet 系数做周期性记录与统计分析:

  • 每 20 个交易日记录一次系数快照(对应调仓节奏)
  • 对每个因子计算:
    • 平均绝对系数:作为“重要性”指标
    • 系数接近 0 的比例:作为“保留率”指标(衡量长期是否被模型采纳)

输出内容包括:

  • Top 重要因子列表(默认输出 Top 18)
  • 低重要性因子提示(例如重要性 < 0.001)

用途:

  • 解释近期模型偏好(价值/动量/质量等)
  • 监控因子失效与模型漂移
  • 提升策略可解释性与可审计性


策略源码:https://bigquant.com/square/ai/cdc3a6e0-b423-a44e-1f27-56bd88662d9b

\

{link}