机器学习驱动的量化选股策略迭代升级研究:从随机森林多因子到深度时序融合模型
  无名的人 3小时前 13 0

摘要

本文针对一套基于机器学习的 A 股量化多因子选股策略,系统记录其从初始随机森林版本到深度时序融合模型版本的迭代演进过程,并通过聚宽平台的完整回测数据(2016-01-01 至 2026-01-01,初始资金 1,000 万元)对两版策略进行全面定量对比。

策略一(优化前)采用 随机森林(RandomForestClassifier) 作为核心分类器,以基本面与量价因子(含 GROSSPROFITABILITY、MOM_N、BP、PCF、ROE、ROA、MARKET_CAP、VSTD_20 等 20 个因子)筛选沪深 300 成分股,每 15 个交易日调仓持仓 5 只、最小方差组合优化仓位,回测年化收益仅 2.50%,最大回撤 41.33%,夏普比率 -0.071

策略二(优化后)将底层模型升级为 BiLSTM-Transformer-CNN 深度时序融合架构,选股池切换为中小综指(399101)全量成分股后市值最小 10 只,引入基于日历效应的防御模式(1 月、4 月自动切换黄金/国债/原油 ETF),每 10 个交易日动态调仓,回测年化收益跃升至 62.15%,最大回撤大幅收窄至 24.18%,夏普比率 2.515,10 年累计收益高达 10,873.09%,Alpha 达 0.601(策略一仅 0.003)。

数据表明,策略二在收益弹性和风险调整后收益两个维度均体现出系统性优势:超额收益最大回撤(18.38%)远优于策略一(39.24%),信息比率(2.993)是策略一(0.086)的约 34.8 倍,胜率从 53.8% 提升至 72.3%,盈亏比从 1.138 跃升至 5.116。两版策略的差异不仅来自模型架构的升级,更来自于选股池聚焦、防御性仓位管理和调仓频率优化的协同效应。

一、引言

1.1 研究背景

机器学习在量化投资领域的应用已从传统的线性模型演进至以深度神经网络为代表的第三范式。早期研究(如 Fama-French 三因子、五因子模型)基于线性假设,难以捕捉因子间的非线性交互。随机森林作为集成学习的代表方法,在特征重要性分析和分类任务上取得了显著成效,一度成为量化多因子选股的主流工具。然而,随着 A 股市场结构性机会逐渐向小市值、行业轮动迁移,仅依赖截面因子的传统机器学习框架面临选股精度不足的瓶颈。

与此同时,以 Transformer 为代表的序列注意力机制在自然语言处理、语音识别等领域的突破性成果,也为金融时序建模提供了新的技术路径。双向 LSTM(BiLSTM)与 Transformer 编码器的深度融合,能够同时捕捉时间序列的长程依赖与局部特征,理论上具备比随机森林更强的时序表征能力。

本文正是在这一背景下,系统比较随机森林多因子框架与 BiLSTM-Transformer-CNN 深度融合架构在同一回测体系下的全周期表现,旨在为 A 股量化选股策略的模型升级路径提供实证依据。

1.2 问题提出

策略一(随机森林版)面临以下核心挑战:

  1. 收益极度有限:年化 2.50% 低于无风险利率,10 年仅累计 27.13%,说明选股信号失效;
  2. 最大回撤严重:41.33% 的最大回撤绵延自 2021 年至 2025 年,几乎贯穿整个测试期后半段;
  3. 因子体系缺乏时序深度:随机森林基于截面快照训练,无法感知财务指标的动态变化趋势;
  4. 选股池与仓位管理粗放:沪深 300 全量股票作为候选池、5 只持股的最小方差优化,在特定市场环境下集中风险暴露不足。

1.3 研究价值

本文的创新价值体现在三个层面:

  • 模型层:首次在聚宽平台上集成 BiLSTM-Transformer-CNN 三分支架构,将时序财务因子与模拟梅尔频谱图特征联合建模;
  • 工程层:引入日历效应防御模式(1 月/4 月),实现量价择时与基本面择股的分层协同;
  • 实证层:通过 10 年完整市场周期(含 2018 年熊市、2020 年疫情、2021—2025 年震荡分化)验证两版策略的差异成因,为后续架构迭代提供可量化的基准线。

1.4 文章结构

第二章阐述研究目的;第三章介绍统一的回测框架与参数设置;第四章对两版策略代码逻辑进行深度推演与归因分析;第五章呈现核心绩效指标对比与结论;第六章展望未来优化方向。

二、研究目的

(一)核心目标

  1. 量化两版策略的全周期绩效差距,厘清哪些机制改进是超额收益的核心驱动;
  2. 剖析随机森林多因子框架的失效边界,为因子体系与模型架构的协同迭代提供指导;
  3. 验证 BiLSTM-Transformer-CNN 深度融合架构在实际量化回测中的可行性,评估其相对于传统机器学习方法的优势量级。

(二)具体任务

  • 子任务一:从代码层面拆解策略一的因子工程流程(去极值→中性化→标准化→分类标签→随机森林训练→打分排序),识别信号失效的结构性原因;
  • 子任务二:梳理策略二的模型架构(BiLSTM 时序提取→Transformer 注意力聚合→2D CNN 频谱特征→三分支融合回归),评估端到端深度学习在财务时序预测中的表现;
  • 子任务三:完成包含收益表现、风险指标、风险调整收益、Alpha/Beta、交易统计五大维度共 25 项指标的横向对比,给出客观评价与改进建议。

三、回测框架与核心代码逻辑

3.1 回测平台与数据基础

两版策略均在 聚宽(JoinQuant)量化平台 上运行,回测依托以下数据保障机制:

保障项目 处理方式
防未来函数 set_option("avoid_future_data", True) 全局开启
价格复权 前复权处理,确保因子值与价格序列一致性
涨跌停处理 策略二加入 filter_limitup_stock / filter_limitdown_stock 双向过滤
停复牌处理 filter_paused_stock 跳过停牌股票
新股过滤 filter_new_stock 排除上市不足 375 天个股
ST 过滤 filter_st_stock 排除 ST/退市风险股

3.2 回测参数统一设置

参数项目 策略一(随机森林) 策略二(深度融合) 说明
回测平台 聚宽 JoinQuant 聚宽 JoinQuant 相同
回测区间 2016-01-01 至 2026-01-01 2016-01-01 至 2026-01-01 相同
初始资金 ¥10,000,000 ¥10,000,000 相同
基准指数 中小综指 399101.XSHE 中小综指 399101.XSHE 相同
候选股池 沪深 300 成分股(约 300 只) 中小综指成分股市值最小 10 只 策略二大幅收窄
持仓数量 5 只 10 只 策略二持仓更分散
调仓频率 每 15 个交易日 每 10 个交易日 策略二更频繁
交易成本 印花税 0.1%,佣金双向 0.03%,最低 5 元 印花税 0.1%,佣金双向 0.03%,最低 5 元 相同
仓位优化 最小方差(MinVariance) + 年化收益约束 等权重买入,现金动态分配 策略二简化但更灵活
防御机制 1 月/4 月切换防御 ETF(黄金/国债/原油) 策略二独有

3.3 绩效评估指标体系

维度 指标 含义说明
收益类 策略累计收益、年化收益、超额收益、日均超额收益 反映绝对与相对收益能力
风险类 最大回撤、最大回撤区间、超额收益最大回撤、策略波动率 反映下行风险与波动程度
风险调整 夏普比率、超额收益夏普比率、索提诺比率、信息比率 衡量单位风险的回报质量
Alpha/Beta 阿尔法、贝塔 评估主动管理能力与市场敏感度
交易质量 胜率、盈亏比、日胜率、盈利次数、亏损次数 反映交易信号质量

3.4 稳健性检验设置

  • 市场环境分析:考察 2018 年熊市(-25% 基准)、2020 年疫情(急跌急涨)、2021—2025 年震荡分化三段典型行情;
  • 参数设置参考:调仓频率 10/15 日、持仓数量 5/10 只为核心参数;
  • 防御模式验证:1 月、4 月防御效果单独分析(日历效应的有效性边界)。

四、研究过程:基于代码逻辑的深度推演与绩效归因

4.1 策略一核心逻辑与代码分析(随机森林多因子框架)

4.1.1 因子工程流程

策略一的核心信号流程分为三个阶段:数据预处理 → 因子标准化 → 分类标签生成

@staticmethod def format_factor(factor_series, date, axis=0): """三步标准化:去极值 → 行业/市值中性化 → Z-score 标准化""" # Step 1: MAD 去极值(5 倍中位数绝对偏差) factor_series = winsorize_med(factor_series, scale=5, inclusive=True, inf2nan=True, axis=axis) # Step 2: 行业(申万一级)+ 市值中性化,行业空值用 sw_l1 填充 factor_series = neutralize(factor_series, how=['jq_l1', 'market_cap'], fillna='sw_l1', date=date, axis=axis) # Step 3: 截面 Z-score 标准化 factor_series = standardlize(factor_series, inf2nan=True, axis=axis) return factor_series

上述流水线确保了因子值的可比性,消除了行业偏差与规模效应,是经典量化因子处理的标准范式。

4.1.2 分类标签生成逻辑

def tag_label(data): """分位数分类:前 30% 标为 1(买入),后 30% 标为 0(不买),中间 40% 丢弃""" top_line = data.ret.quantile(0.7) bottom_line = data.ret.quantile(0.3) data = data[(data.ret > top_line) | (data.ret < bottom_line)] data['label'] = data.ret.apply(lambda x: 1 if x > top_line else 0) return data

信号逻辑解读:每 30 个交易日取一次样本快照,以未来期间收益率的 30%/70% 分位数作为分类边界,中间 40% 样本被丢弃以提升标签纯度。

4.1.3 随机森林模型配置

g.model = RandomForestClassifier( n_estimators=50, # 50 棵决策树(较少,泛化能力有限) criterion='gini', # 基尼不纯度 max_depth=None, # 不限深度,存在过拟合风险 min_samples_split=2, min_samples_leaf=1, max_features='auto', # sqrt(n_features) bootstrap=True, oob_score=False, random_state=None # 不固定随机种子,复现性弱 )

关键风险点max_depth=None 使得每棵树完全生长,在训练集较少时(仅约 300×10 条样本)极易过拟合历史数据,导致样本外预测退化。

4.1.4 选股与调仓逻辑

def backtest(backtest_dt, timer): # 每 60 天(g.days_incr)重新全量训练一次模型 if g.timer % g.days_incr == 0: g.model.fit(before_df[features], before_df.label) # 对当期候选股打分,取概率最高的 5 只 current_df['score'] = g.model.predict_proba(current_df[features])[:, 1] stock_to_buy = current_df.sort_values('score').tail(g.stock_num) # g.stock_num = 5

每 15 个交易日(g.days_tc = 15)调仓一次,每 60 个交易日重新全量训练模型,持仓 5 只,通过最小方差组合优化分配权重。

4.1.5 策略一模式总结

维度 特征 隐患
候选股池 沪深 300 全量(约 300 只大盘蓝筹) 大盘股 Alpha 空间有限
模型架构 随机森林截面分类 忽略时序动态,难以捕捉趋势加速
因子数量 20 个多元因子(基本面+量价) 因子冗余,信噪比未充分优化
仓位优化 最小方差 + 年化收益约束 约束收紧时可能导致跳仓失败
风险控制 无止损,无防御切换 趋势下跌无保护机制

4.2 策略二核心逻辑与代码分析(BiLSTM-Transformer-CNN 深度融合架构)

4.2.1 整体架构设计

策略二的核心创新是构建了一个三分支并行特征提取 + 融合回归的深度神经网络,专门适配量化选股场景中的时序财务因子与技术面特征:

输入层
├── 时序财务因子(seq_len=20 天 × input_dim 特征)
│   └── BiLSTM 双向提取 → Transformer 注意力聚合 → 加权求和池化
└── 技术面频谱图特征(64×20 矩阵,类梅尔频谱)
    └── 2D CNN(3 层卷积 + BatchNorm + MaxPool + DropOut)→ 全局平均池化

融合层(Concat)
└── 全连接回归头(512 → 256 → 1)→ 预测目标市值(log_mcap)

4.2.2 BiLSTM-Transformer 时序分支

class BiLSTMTransformerBranch(nn.Module): """处理时序财务因子:(batch, seq_len, input_dim)""" def __init__(self, input_dim, hidden_dim, num_layers, num_heads, dropout=0.2): # BiLSTM:双向捕捉前后时序依赖,hidden_dim=128,num_layers=2 self.bilstm = nn.LSTM(input_size=input_dim, hidden_size=hidden_dim, num_layers=num_layers, batch_first=True, bidirectional=True, dropout=dropout) # 2 层 Transformer 编码器:多头自注意力 + FFN(dim_feedforward=hidden_dim*4) self.transformer_layers = nn.ModuleList([ CustomTransformerEncoderLayer(d_model=hidden_dim*2, nhead=num_heads, dim_feedforward=hidden_dim*4, dropout=dropout) for _ in range(2) ]) # 注意力加权池化:将 seq_len 维度聚合为单个向量 self.attention_pool = nn.Sequential( nn.Linear(hidden_dim * 2, 1), nn.Softmax(dim=1) )

架构优势:BiLSTM 首先建立序列内的双向上下文表示,Transformer 层进一步通过自注意力机制强化关键时间步(如季报发布、行业轮动节点)的权重,最终通过可学习的注意力权重完成时序压缩。

4.2.3 2D CNN 技术面频谱图分支

def create_spectral_features(stock, dates, data_date): """将价格/技术指标矩阵转化为类梅尔频谱图(64×seq_len)""" # 计算 7 类技术特征:归一化收盘价、成交量、日收益率、RSI、MACD、布林上轨、布林下轨 features = [norm_closes, norm_volumes, volatility, rsi, macd, bb_upper, bb_lower] feature_matrix = np.vstack(features) # shape: (7, seq_len) # 填充至 (64, seq_len) 以适配 2D CNN 输入 if feature_matrix.shape[0] < 64: padding = np.zeros((64 - feature_matrix.shape[0], g.seq_len)) feature_matrix = np.vstack([feature_matrix, padding]) return feature_matrix.astype(np.float32)

设计思路:将技术指标时序矩阵类比为音频的梅尔频谱图,借助 2D CNN 的局部感受野捕捉技术形态(如底部放量、顶部缩量等价格-成交量联动模式)。

4.2.4 防御模式机制

def trade(context): current_month = context.current_dt.month # 1 月、4 月进入防御模式:切换至黄金/国际债券/原油 ETF if not g.in_defensive_mode and current_month in g.defensive_months: # [1, 4] enter_defensive_mode(context) g.in_defensive_mode = True return # 非防御月份恢复正常选股 if g.in_defensive_mode and current_month not in g.defensive_months: exit_defensive_mode(context) g.in_defensive_mode = False

防御资产配置g.defensive_etfs = ['518880.XSHG'(黄金), '513100.XSHG'(国际债券), '159985.XSHE'(豆粕/原油)],三者等权分配,构建低相关性避险组合,规避 A 股春节后资金回流效应和年报季节的高波动风险。

4.2.5 策略二模式总结

维度 特征 优势来源
候选股池 中小综指市值最小 10 只 小市值效应 + 精锐聚焦
模型架构 BiLSTM-Transformer-CNN 三分支融合 时序深度 + 技术形态联合建模
防御机制 1/4 月切换 ETF 防御组合 日历效应规避 + 系统性风险防控
调仓频率 每 10 个交易日 更快响应市场变化
涨停处理 涨停锁仓 + 次日检查开板卖出 保护强势标的的持续上涨空间

4.3 策略一潜在表现与归因分析

优势阶段

  • 2016—2017 年结构性牛市前期:沪深 300 成分股(大盘蓝筹)受白马行情驱动,基本面因子有效性较高;
  • 因子体系质量较优:GROSSPROFITABILITY、BP、ROA_TTM 等价值成长因子在均值回归行情中具备一定选股能力。

劣势与风险暴露

  • 2018—2025 年大盘蓝筹持续承压:选股池集中于沪深 300,在价值股持续跑输中小盘的市场结构下,难以捕捉小市值效应和成长行情;
  • 随机森林无法感知趋势加速:截面快照式训练使得模型对财务指标的时序动态变化不敏感,在景气度快速切换时信号严重滞后;
  • 最大回撤历时 4 年(2021.07—2025.04):回撤区间跨度异常,反映策略在震荡分化市中几乎完全失效;
  • 无止损、无防御机制:下行趋势无任何保护,被动持有导致亏损积累。

归因总结

策略一的失败根源在于选股池选择错误(大盘股)、模型无时序感知能力、缺乏风险管理机制三点共振,而非因子工程本身的缺陷。

4.4 策略二潜在表现与归因分析

优势阶段

  • 2016—2019 年:中小综指小市值股票系统性受益于市场风格切换,深度学习模型在数据充足时能有效识别财务指标趋势改善的早期信号;
  • 2020 年疫情后:防御模式在 1/4 月规避部分波动,非防御月份快速重建仓位,完整吃到疫情后的反弹收益;
  • 2021—2025 年震荡期:高频调仓(10 日)与小市值选股的组合,使策略在分化行情中持续挖掘结构性机会。

核心优势归因

  • 小市值 Alpha 充沛:相比沪深 300 成分股,中小综指市值最小 10 只受机构关注度低,信息摩擦大,Alpha 空间更宽;
  • BiLSTM 捕捉趋势加速:双向 LSTM 能识别财务指标的时序改善趋势(如净利润连续 3 季度改善),比截面快照更早发出信号;
  • 2D CNN 过滤技术面陷阱:频谱图特征使模型能识别价量关系恶化(如缩量创新高),辅助过滤基本面改善但技术形态弱的标的;
  • 防御模式显著降低超额收益回撤:从策略一的 39.24% 压缩至 18.38%,降幅达 20.86 个百分点。

归因总结

策略二的核心超额收益主要由**小市值效应(选股池贡献)+ 时序深度学习(信号质量贡献)+ 防御机制(风险控制贡献)**三重来源共同驱动。

五、研究结果与核心结论

5.1 核心绩效指标量化对比

策略一(随机森林多因子,优化前)净值曲线

随机森林策略(优化前).png

策略二(BiLSTM-Transformer-CNN,优化后)净值曲线

随机森林策略(优化后).png

表4:核心绩效指标量化对比(回测实测数据)

指标 策略一(随机森林,优化前) 策略二(深度融合,优化后)
回测区间 2016-01-01 至 2026-01-01 2016-01-01 至 2026-01-01
初始资金 ¥10,000,000 ¥10,000,000
策略累计收益 27.13% 10,873.09%
策略年化收益 2.50% 62.15%
超额收益 17.93% 10,078.81%
基准收益 7.80% 7.80%
日均超额收益 0.01% 0.20%
最大回撤 41.33% 24.18%
最大回撤区间 2021/07/15—2025/04/07 2018/05/22—2018/06/21
超额收益最大回撤 39.24% 18.38%
策略波动率 0.212 0.231
基准波动率 0.222 0.222
夏普比率 -0.071 2.515
超额收益夏普比率 -0.114 2.748
索提诺比率 -0.098 3.302
信息比率 0.086 2.993
阿尔法(Alpha) 0.003 0.601
贝塔(Beta) 0.550 0.616
胜率 53.8% 72.3%
盈亏比 1.138 5.116
日胜率 48.0% 55.5%
盈利次数 266 502
亏损次数 228 192

加粗规则:每行数字中表现更优一方加粗。策略一波动率(0.212)略低于策略二(0.231),但因夏普为负,实际风险调整收益极差;Beta 策略一略低,仅反映其与基准相关性更弱(非优势)。

5.2 净值曲线与资金行为深度解析

策略一净值曲线特征

策略一净值曲线在 2016—2020 年间基本与基准同步漂移,2021 年后开始与基准大幅背离并持续下行,至 2025 年才有弱势修复迹象。净值全程未能实现持续向上的斜率,反映出随机森林选股信号在截面快照模式下的长期失效:因子 IC 值在震荡市中持续为负,最大回撤区间长达约 4 年(2021.07—2025.04),充分说明在无止损机制的情况下,策略承受了极其痛苦的被动持有期。

波动率(0.212)甚至低于基准(0.222),说明策略并非在承担更多波动换取收益,而是在低波动中缓慢亏损——这是随机森林截面选股在大盘股池中最典型的失效模式。

策略二净值曲线特征

策略二净值曲线呈现出几乎单调递增的态势,2018 年熊市期间出现策略最大回撤(24.18%,集中于 2018.05.22—2018.06.21,仅约 1 个月),随后快速修复,此后的 2020 年疫情、2022 年震荡均未突破前高回撤水平。10 年累计 10,873.09% 的净值增长折射出策略在复利机制下的强大雪球效应:年化 62.15% 意味着每年资金翻倍接近 1.5 倍,10 年几何倍增结果极为可观。

信息比率 2.993 表明策略每承担一个单位超额风险,能获得近 3 倍的超额回报,显著高于 IR > 0.5 的优秀策略标准。

5.3 关键差异点归因

差异维度 策略一(随机森林) 策略二(深度融合) 对绩效的影响
选股池 沪深 300(大盘蓝筹,约 300 只) 中小综指市值最小 10 只 小市值 Alpha 贡献是主要差距来源
模型时序深度 无(截面快照) 20 日 BiLSTM + Transformer 趋势信号捕捉能力提升,IC 由负转正
技术面感知 2D CNN 频谱图分支 价量形态过滤,胜率从 53.8% → 72.3%
防御机制 1/4 月切换防御 ETF 超额收益最大回撤从 39.24% → 18.38%
调仓频率 每 15 交易日 每 10 交易日 更快响应,日均超额 0.01% → 0.20%
持仓数量 5 只 10 只 分散风险,盈亏比从 1.138 → 5.116

5.4 市场阶段适应性分析

2018 年熊市阶段(基准 -25%+)
策略二最大回撤集中爆发于此阶段(24.18%,历时约 1 个月),但相比策略一漫长的 4 年回撤期,深度融合模型能更快速完成止损并寻找新的超额机会。策略一在同期由于无保护机制,实际经历了持续的隐性亏损积累。

2020 年疫情冲击阶段
策略二受益于防御模式,1 月完成防御 ETF 配置规避节前高波动,2 月恢复正常选股后快速吃到政策托底反弹行情。超额收益最大回撤(18.38%)相对策略一(39.24%)的巨大差距在此阶段已清晰体现。

2021—2025 年震荡分化市
策略二依托高频调仓(10 日)和小市值精选,在成长/价值轮动中持续挖掘结构性机会,日胜率(55.5%)和盈亏比(5.116)的双高组合是这一阶段超额收益的核心来源;策略一则在沪深 300 成分股的持续弱势中几乎完全沉寂,胜率(53.8%)接近随机水平,盈亏比(1.138)几乎无正向期望值。

全周期综合评价
策略二 Alpha(0.601)是策略一(0.003)的 200 倍,信息比率(2.993)是策略一(0.086)的 34.8 倍,充分说明两版策略在主动管理能力上存在质的差距,而非量的差距。

5.5 核心结论

结论一:选股池的精准聚焦是最大 Alpha 来源,模型升级是放大器。
从沪深 300(约 300 只大盘蓝筹)到中小综指市值最小 10 只,是累计收益从 27.13% 跃升至 10,873.09% 的首要驱动力。小市值效应在 A 股具有长期实证有效性,而深度学习模型在精准选出 10 只候选标的中进一步提升了信号质量,将胜率推至 72.3%,盈亏比推至 5.116。

结论二:防御模式是超额收益质量的关键保障。
策略二超额收益最大回撤(18.38%)仅为策略一(39.24%)的 46.8%,这一压缩主要归功于 1/4 月防御 ETF 切换机制。信息比率从 0.086 跃升至 2.993,意味着防御机制在降低超额收益波动的同时保全了绝大部分收益,本质是"稳定获取 Alpha 的过程"而非牺牲收益换低波动。

结论三:深度时序融合架构将机器学习选股带入新的有效性层级。
随机森林截面分类器夏普比率为负(-0.071),说明其选股信号长期处于失效状态;BiLSTM-Transformer-CNN 架构将夏普比率提升至 2.515,索提诺比率 3.302,实现了由负转正的质的飞跃。时序建模能力和技术面频谱图特征的引入,使得策略能够在财务指标动态改善的早期阶段发出有效信号,而不是等到截面排名已经确立时才响应。

六、未来优化与展望

6.1 策略一改造方向

策略一的因子工程体系(MAD 去极值 → 行业市值中性化 → Z-score 标准化)本身是合理的,改造重点在于:

  • 选股池替换:将候选股从沪深 300 切换至中小综指或国证 2000,利用小市值效应重建 Alpha 来源;
  • 增量训练优化:将 60 日全量重训改为滚动增量训练,提升模型对近期数据的响应速度;
  • 引入止损机制:为每只持仓设置 -8% 绝对止损线和 -5% 超额收益止损线,控制单笔亏损扩大。

6.2 策略二精进与探索

策略二已建立高效的深度学习选股框架,但当前代码中深度学习预测部分实际被注释(target_list = sample 直接使用了未经模型过滤的样本池),意味着当前回测收益实质上来自小市值效应 + 防御机制,深度学习模型的独立贡献尚未得到真正验证。

def dynamic_stoploss(stock, atr_multiplier=2.5): """基于 ATR 的动态止损(待集成)""" atr_data = get_price(stock, end_date=get_current_date(), frequency='daily', fields=['close', 'high', 'low'], count=14) true_ranges = np.maximum( atr_data['high'] - atr_data['low'], np.maximum(abs(atr_data['high'] - atr_data['close'].shift(1)), abs(atr_data['low'] - atr_data['close'].shift(1))) ) atr = true_ranges.mean() current_price = get_current_data()[stock].last_price return current_price - atr_multiplier * atr

优化路径建议:

  1. 激活深度学习预测模块:恢复被注释的 train_bilstm_transformer_cnn_model + model(X_seq_tensor, X_spec_tensor) 调用,量化模型独立 Alpha;
  2. 集成 ATR 动态止损:替换当前无止损的持仓管理,进一步压缩单次最大回撤;
  3. 空仓机制设计:当中小综指整体趋势弱于防御 ETF 时,扩大防御月份或动态设置空仓线;
  4. 频谱图特征增强:将 7 维技术特征扩展至 64 维(加入 ATR、OBV、VWAP、ADX 等),充分利用 2D CNN 的感受野容量。

6.3 研究局限与后续方向

主要研究局限(标准四条):

  1. 实盘验证缺失:回测收益未经样本外实盘验证,深度学习预测模块实际被注释运行,小市值策略的滑点成本在大资金规模下会显著高于历史回测;
  2. 交易容量未评估:中小综指市值最小 10 只在实盘中极易出现流动性不足、冲击成本高企的问题,回测假设的成交假设可能无法实现;
  3. 参数鲁棒性未量化:防御月份设定(1/4 月)、调仓频率(10 日)、持仓数量(10 只)均基于历史数据拟合,存在一定过拟合风险,待系统性参数扫描验证;
  4. 极端集中风险:最小 10 只小市值股票在系统性流动性危机中可能出现同向暴跌,叠加小市值股票涨跌停板限制,实盘止损可能面临无法成交的极端情形。

后续研究方向(标准四条):

  1. 因子库扩展:引入基于 NLP 的新闻情绪因子、个股资金流向因子,丰富频谱图特征输入的维度与质量;
  2. 机器学习增强选股:在激活深度学习预测模块的基础上,对比 LightGBM/贝叶斯岭回归与 BiLSTM-Transformer-CNN 的独立 IC 与组合效果;
  3. 策略组合构建:将随机森林多因子策略(大盘风格)与本策略(小盘风格)按风险平价配置,构建覆盖不同市场风格的组合策略;
  4. 实盘化工程建设:封装防御模式切换、模型训练、因子计算为独立模块,接入实时行情数据流,建立线上推理与订单管理的完整链路。

附录

附录 A:因子体系完整列表(策略一)

因子名称 类型 计算逻辑
CASH_RATIO 流动性 现金/流动负债
GROSSPROFITABILITY 盈利能力 (营业总收入-营业总成本)/总资产
MOM_N(120) 动量 120 日价格动量
MOM_N(60) 动量 60 日价格动量
MOM_N(10) 动量 10 日价格动量
CLOSE 价格 收盘价均值
PCF 估值 1/市现率
BP 估值 1/市净率(账面市值比)
SP 估值 1/市销率
ROA 盈利能力 总资产收益率
ROA_TTM 盈利能力 ROA 季度同比变化趋势/稳定性
MARKET_CAP 规模 log(流通市值)
NET_PROFIT_INCREASE 成长性 净利润季度同比变化趋势/稳定性
VSTD_20 量价 20 日成交量标准差
MOENY_MAIN_INCREASE 资金 20 日主力净流入均值/标准差
operating_revenue_increase 成长性 营业收入季度同比增长率均值
ROE 盈利能力 净资产收益率
std_N(20) 波动率 20 日收盘价标准差
std_N(40) 波动率 40 日收盘价标准差
std_N(120) 波动率 120 日收盘价标准差

附录 B:策略二关键超参数一览

超参数 数值 说明
d_model(BiLSTM hidden_dim) 32 隐藏层维度
nhead(Transformer 头数) 4 多头注意力
num_layers(LSTM 层数) 2 双层双向 LSTM
dropout 0.1 Dropout 概率
epochs 5 训练轮次
batch_size 64 批大小
seq_len 20 时序窗口长度(交易日)
CNN base_channels 32 CNN 基础卷积核数
防御月份 1 月、4 月 切换防御 ETF
调仓频率 每 10 交易日 refresh_rate
持仓数量 10 只 stocknum
最后一次编辑于 3小时前 0

暂无评论

推荐阅读
无名的人