Files

8.9 KiB
Raw Permalink Blame History

好的,我把从项目启动到现在的全部版本迭代、核心发现和关键转折点,按时间线梳理清楚。


网格交易选股模型 — 全版本历史总结

第一阶段:原型搭建(v1.0 ~ v3.6)

v1.0:从零开始

核心目标:验证“用机器学习预测网格匹配次数”是否可行。

做了什么

  • 用 180 天沪深主板个股历史数据,按 [1,2,...,11] 元网格模拟交易
  • 计算每只股票在历史区间内的网格成交次数作为标签
  • 用随机森林(RandomForestRegressor)训练,预测“未来 60 天匹配次数”
  • 在 278 只股票上做了初步验证

关键发现:机器学习预测网格匹配次数是可行的。但 278 只股票的样本量太小,模型泛化能力有限。


v2.0 ~ v2.1.1:扩大规模 + 引入市值因子

核心目标:从 278 只扩展到全市场 1404 只,验证策略在全市场是否成立。

做了什么

  • 扩展到全市场股票(5~15 元区间),训练样本约 30,000 条
  • 引入 3 个市值因子(流通市值对数、市值波动交互、小市值溢价)
  • 在模型协同上做了第一次尝试:把 Rank 模型的预测值作为 Top 模型的输入特征

关键发现

  • 市值因子有效——小市值股票确实更有弹性,触发网格的概率更高
  • “让 Top 站在 Rank 肩膀上”这个协同思路第一次被验证

v3.0 ~ v3.6:特征消融与精简

核心目标:从 36 个特征逐步消融,找到最精简有效的特征集。

做了什么

  • 每轮消融删除重要性最低的几个特征,看 Spearman 是否下降
  • 引入负向指标(流动性枯竭、价格呆滞等),让模型学会“识别不适合网格的标的”
  • 最终精简到 34 维基础特征,Spearman 稳定在 0.53 附近

关键发现

  • 特征不是越多越好。34 维中最后 6 个重要性极低的特征被删除后,Spearman 反而微升
  • 负向指标中只有“流动性枯竭”被模型充分吸收,其他几个效果有限

第二阶段:架构升级(v4.0 ~ v5.4)

v4.0 ~ v4.1:三模型协同架构确立

核心目标:从单模型升级为 Rank → Top → Stacking 三层协同。

做了什么

  • Rank(回归):全市场排序,预测匹配次数
  • Top(分类):识别头部 5% 的特等契合标的
  • Stacking(融合):综合 Rank 和 Top 的输出,产出最终评分
  • Top 模型的训练标签从“全市场 P95”改为“同 period 内 P95”,更公平

关键发现

  • 三层协同比单模型显著提升——Top 模型 PR-AUC 0.34,命中率 100%
  • Stacking 层能有效融合两个上游信号

v5.0 ~ v5.3:情绪因子探索

核心目标:引入恐慌/贪婪情绪因子,让模型感知市场环境。

做了什么

  • 构造恐慌期弹性因子(恐慌日振幅放大比、反弹强度)
  • 构造贪婪期独立因子(贪婪日相对涨幅、振幅比)
  • 多次调整阈值(从极端阈值放宽到温和阈值)

关键发现

  • 情绪因子对 Rank 有正向贡献(Spearman 从 0.50 提到 0.53
  • 但对 Top 模型始终没有产生增益——Top 做的是头部精选,情绪信号在头部样本上的区分度不够
  • 教训:情绪因子更适合做负向过滤(识别“该淘汰的”),不适合做正向精选(识别“该买的”)

v5.4-E:模型协同的突破

核心目标:让 Top 模型真正受益于 Rank 的排序信号。

做了什么

  • 把 Rank 模型的预测值(rank_predicted_rounds)作为 Top 模型的第 35 维输入特征
  • 分层标签 + 头部权重训练 Top 模型

关键发现

  • 这是 v5.x 系列最重要的突破——Top PR-AUC 从 0.30 提升到 0.33
  • “让 Top 站在 Rank 肩膀上”被反复验证有效

第三阶段:交易系统化(v6.0 ~ v6.3)

v6.0 ~ v6.1Stacking 融合 + 知识蒸馏

核心目标:用一个模型统一 Rank 和 Top 的能力。

做了什么

  • 尝试用 MLP 多任务学习同时做回归和分类(v6.0,失败)
  • 尝试用知识蒸馏让 MLP 学习 Teacher 模型(v6.1,效果不如 LightGBM

关键发现

  • MLP 在表格数据上不如 LightGBM——这是被反复验证的教训
  • 之后不再尝试深度学习替代树模型

v6.2 ~ v6.3:全系统收敛

核心目标:把最优特征集、最优模型架构、最优参数固化。

做了什么

  • 修复 total_share 数据源(4 个特征之前因为数据缺失被填 0,修复后恢复正常)
  • 回测收益 148%,夏普 1.74,最大回撤 -19.78%
  • v6.3 被确立为生产基线

关键发现

  • v6.3 的生产基线是在“旧规则训练数据(9.0-9.8)+ 三模型协同”这个体系下被验证稳定的

第四阶段:风控与仓位管理(v6.4 ~ v6.5)

v6.4Meta Ranker 的诞生

核心目标:用利润预测替代价格一刀切规则。

做了什么

  • 在 Stacking 之上新增 Meta Ranker:输入价格 + Stacking 评分 + Rank 预测轮数,输出预测利润
  • 跑 720 种参数组合的规则探索,找到最优配置
  • 训练样本 1288 条,Spearman 0.77

关键发现

  • Meta Ranker 是这个阶段最重要的突破——收益从 148% 提升到 152%,回撤从 -19.78% 降到 -10.10%,夏普从 1.74 提到 2.16
  • Meta Ranker 需要约 1000 条以上训练样本才能稳定
  • 它的成功高度依赖上游模型评分分布与策略边界的匹配

v6.5:叶子 Embedding 增强(进行中)

核心目标:用树模型的叶子节点编码作为 Embedding 特征,增强上游模型。

做了什么

  • 从 v6.3 Rank 模型的 500 棵树中提取叶子编号
  • 构造 20 组叶子编码特征(基于目标编码的交互特征)
  • 加入训练数据后,Rank Spearman 从 0.54 飙升到 0.74

关键发现

  • 叶子 Embedding 是最有效的特征增强方式——三列新特征包揽重要性前 3 名
  • 但 Meta Ranker 训练样本在 v6.5 的模型体系下反复不足,流程多次阻塞

第五阶段:收益导向重构(v7.0 探索中)

v7.0 的规划(尚未完成)

核心目标:把整条链路的训练目标从“匹配轮数(y_rounds)”改为“总回报(total_return_60d)”。

为什么要改

  • 当前体系前三层(Rank/Top/Stacking)都在预测“匹配轮数”,只有最后一层 Meta Ranker 预测“利润”
  • 这导致前后层目标错位——上游选的是“最活跃的”,但实盘需要的是“最赚钱的”

怎么做

  • 从零重建训练样本,标签改为 total_return_60d(已实现利润 + 期末持仓市值)
  • 全链路用新标签重训,让 Rank/Top/Stacking 都直接学习收益规律
  • 同时引入规模中性化特征(纠正大盘股成交额偏差)和三指数独立震荡特征(沪深300/中证500/中证1000

当前状态

  • 训练样本生成完成(约 4.9 万条,正回报占比约 11.6%)
  • 从零重建的数据源因 K 线时间范围(2020 年起)和股票覆盖(仅 600 开头)不足,无法复现 v6.3 的 1,799 只过滤后股票数
  • 当前卡点:数据源覆盖问题,需要 2018 年起、全市场(含深市和创业板)的 K 线数据

全版本关键教训

教训 来源版本 说明
情绪因子适合负向过滤,不适合正向精选 v5.x 对 Rank 有效,对 Top 无效
MLP 在表格数据上不如 LightGBM v6.0-v6.1 深度学习不是万能药
叶子 Embedding 是最强特征增强 v6.5 非线性的树结构编码,比 PCA 强 10 倍
Meta Ranker 是体系最关键一环 v6.4 用利润预测替代价格一刀切,夏普提升 24%
训练数据必须与策略边界匹配 v7.0 上游模型评分分布偏移会导致可买标的枯竭
从零重建比复用旧样本更难 v7.0 数据源时间范围和股票覆盖是关键约束
规则探索需要专门为每个模型体系做一次 v6.4/v6.5 同一参数在不同模型上效果截然不同

当前最优体系(v6.4 生产基线)

组件 版本 核心指标
Rank v6.3 原始 Spearman 0.5355
Top v6.3 原始 PR-AUC 0.3389
Stacking v6.3 原始 Spearman 0.6932
Meta Ranker v21288 条训练) Spearman 0.7663
整体回测 收益 152.15%,回撤 -10.10%,夏普 2.16

下一步方向

优先级 方向 预期收益 风险
1 v6.7:叶子 Embedding 增强 v6.4 上游 + 复用 Meta Ranker
2 v7.0:收益导向全链路重训(需先解决数据源问题)
3 市场风格 Embedding(大小盘/牛熊切换)