Quant System for Stock Analysis:我的 A 股量化研究系统

对 Quant_System_for_Stock_Analysis 的完整项目介绍:数据、因子、模型、回测、准入、监控与横截面研究路线。

项目地址

项目仓库:https://github.com/lmx-071028/Quant_System_for_Stock_Analysis.git

Quant_System_for_Stock_Analysis 是我最近整理的一套 A 股量化研究系统。它不是一个简单的“预测明天涨跌”的脚本,而是把数据下载、数据审计、特征构造、离线训练、回测、模型准入、实验管理和实时监控串成一条完整链路。

更准确地说,这个项目当前的定位是 research preview:重点不是证明某个策略已经可以实盘赚钱,而是先把量化研究中最容易混乱的部分工程化。数据要能追踪,模型要能复现,回测要能解释,准入要有理由。

为什么要做这个系统

早期写量化脚本时,最常见的问题不是“模型不够高级”,而是研究流程本身不稳定:这次训练用了哪份数据,标签是怎么构造的,是否有未来函数,回测有没有考虑交易成本,某个模型为什么被使用,实验之间能不能比较。

所以这个项目没有只堆模型,而是先搭了一条可复核的链路:

下载数据 -> manifest 追踪 -> 数据审计 -> 离线训练 -> 模型注册
-> simple / walk-forward 回测 -> per-symbol 指标 -> 模型准入
-> sweep / leaderboard 实验比较 -> monitor 加载 approved 模型

这样做的好处是,后续如果结果不好,不会只停留在“再调一下参数”。我可以继续追问:问题出在数据质量、标签构造、因子表达、交易成本、回测口径、市场状态漂移,还是模型本身没有预测力。

项目整体结构

项目已经从早期单体脚本迁移成包化结构,核心代码都在 quant/ 下:

quant/
├── data/           # 数据源、缓存、manifest、质量检查
├── factors/        # 12D 因子、GARCH、正交化、市场状态
├── models/         # 决策引擎、共形预测、漂移检测、Kelly 仓位、registry
├── backtest/       # broker、portfolio、strategy、engine、metrics、reports
├── xsec/           # 横截面数据集、模型、回测、指标
├── validation/     # 时序 + 截面双重 OOS 验证
├── experiment/     # 实验 ID 与产物管理
├── runtime/        # 实时监控状态管理
├── ui/             # 终端界面
├── cli/            # download/train/backtest/audit/sweep/leaderboard/monitor
├── ai/             # LLM 接入
├── config.py       # 集中配置,支持 TOML 覆盖
└── log.py          # 日志

scripts/            # PowerShell 自动化脚本
configs/            # 配置模板和股票池
tests/              # 单元测试
artifacts/          # 回测、审计、实验报告等运行时产物

根目录下还保留了 core.pydownload.pytrain_only.py 这类兼容入口,方便从旧版本平滑迁移。

数据层:先保证样本可追踪

量化系统的第一层是数据。项目支持读取股票池、下载 A 股日线行情、标准化字段并写入本地缓存。每次缓存都会进入 manifest.json,里面记录股票代码、数据源、时间范围、行数、文件路径和 checksum。

数据下载之后不会直接进入训练,而是先通过 audit_data 做质量审计,例如:

  • 行数是否足够;
  • 日期范围是否完整;
  • 缺失率是否可接受;
  • 成交量是否异常;
  • 价格是否有异常跳变;
  • 涨跌停、停牌等情况是否被记录;
  • 是否生成稳定的 dataset_id

这一步的意义很朴素:如果不知道模型到底基于哪份数据训练,后面的收益曲线再好看也不可靠。

因子层:用市场状态描述行情

项目没有把原始 OHLCV 直接丢给模型,而是构造了一组更可解释的市场状态因子。核心是 12D 因子向量,覆盖趋势、偏离、量能、流动性、波动、动量分化和价量结构等维度。

其中包括:

  • ts:趋势分数;
  • ss:拉伸分数;
  • vs:量能分数;
  • illiq:Amihud 非流动性;
  • ivol:特质波动率;
  • vol_state:当前波动率相对近期的位置;
  • mom_div:短中期动量分化;
  • amt_conc:成交额集中度;
  • MAX21:近 21 日极端收益;
  • smart_money:日内与隔夜收益结构;
  • pv_corr:价量相关;
  • gk_ratio:Garman-Klass 波动率与收盘波动率的差异。

同时,项目也保留了 MA、MACD、KDJ、RSI、BOLL、ADX 等传统技术指标,主要用于终端展示和辅助观察。

模型层:单票模型与横截面模型

项目里有两条研究路线。

第一条是单票决策引擎。DecisionEngine 会把 12D 因子、QRF 分位预测、保形区间、漂移检测和 Kelly 仓位管理合在一起。它输出的不是一句简单的买卖建议,而是包含市场状态、模型预期、置信区间、仓位上限和风险提示的一组决策信息。

第二条是横截面模型,这也是后续更值得重点推进的方向。单票模型更像“每只股票各自预测自己的未来收益”,横截面模型则是“把所有股票放到同一天比较,给它们排序,然后选择 Top N”。这种路线更贴近选股问题本身。

横截面模块的主要流程是:

多股票历史数据 -> 每日 12D 因子 -> future_return -> 横截面 rank label
-> RandomForestRegressor 训练排序模型 -> Rank IC / top-bottom spread 评估
-> Top N 调仓回测

它的训练指标包括 rank_ic_meanrank_ic_irpositive_ic_ratetop_quantile_returnbottom_quantile_returntop_bottom_spread。这些指标比单纯看预测误差更适合判断“模型有没有把强弱股票排出来”。

回测层:验证交易行为,而不只是预测误差

项目的回测系统不是只看模型预测准不准,而是把信号放进交易约束里测试。当前已经覆盖:

  • 佣金、印花税、滑点;
  • 手数约束;
  • T+1 交易逻辑;
  • 停牌、无法成交等情况;
  • simple 和 walk-forward 两种模式;
  • 信号消失退出;
  • 最大持有期退出;
  • 止损退出;
  • per-symbol 级别指标;
  • 成交记录、净值曲线、Markdown 报告输出。

其中 walk-forward 是比较关键的一环。它把时间切成训练窗口、隔离窗口和测试窗口,模型只允许用过去数据训练,再到后续测试区间交易。这样可以降低未来函数和过拟合带来的虚假繁荣。

横截面回测里还进一步区分了 signal day 和 trade day:信号日在收盘后产生分数,真正成交使用下一个交易日的开盘价。这一点看起来细,但对回测可信度非常重要。

模型准入:不是跑出来就能用

项目里有 model_registry.json 作为模型生命周期记录。模型不会因为“训练完成”就自动进入监控侧,而是要经过准入检查。

准入会结合回测结果、交易次数、Sharpe、最大回撤、per-symbol 表现等指标,给每个模型写入:

approved: true / false
approved_at: 时间戳
approval_reason: 通过或拒绝原因
backtest: 回测摘要

这个设计我很喜欢,因为它让模型管理从“感觉这个不错”变成了“这次为什么可以用、为什么不可以用,都有记录”。

自动化入口

项目提供了 PowerShell 脚本和 Python CLI 两套入口。常用命令如下:

.\scripts\bootstrap.ps1
.\scripts\check_env.ps1

.\scripts\download.ps1 -Universe configs\smoke_universe.txt -Adjust qfq -Bars 300 -Workers 5
.\scripts\audit_data.ps1 -Manifest data_cache\manifest.json -Output artifacts\data_audit\latest.json
.\scripts\train.ps1 -Horizons "5" -Workers 1 -PreferBars 300 -Seed 42
.\scripts\backtest.ps1 -Universe configs\smoke_universe.txt -Start 2025-04-01 -End 2026-04-30 -Limit 5
.\scripts\monitor.ps1

横截面模型则可以使用:

.\scripts\train_xsec.ps1 -Universe configs\hs300_universe.txt -Horizon 5
.\scripts\backtest_xsec.ps1 -Universe configs\hs300_universe.txt -Mode walk_forward -TopN 20

如果要做正式研究,smoke 样本不够,应该切换到更长历史和更大股票池,例如:

HS300 / ZZ500 + 1500 bars + h=5/10/20 + walk-forward + leaderboard

当前状态与下一步

当前项目已经具备完整工程骨架:数据、因子、模型、回测、准入、实验和监控都已经有对应模块,测试也覆盖了不少关键路径。smoke 数据可以用于验证链路是否跑通。

但这并不等于策略已经有效。项目文档里也明确写了:小样本 smoke 回测只能证明代码能运行,不能证明收益有稳定性。下一阶段更应该做的是:

  • 用更大股票池和更长 K 线重新验证;
  • 继续收紧 walk-forward 会计口径;
  • 对横截面模型做全市场基准测试;
  • 用 leaderboard 横向比较实验;
  • 在确认基础口径可靠后,再考虑 LightGBM、深度模型或更复杂的组合优化。

小结

这个项目对我来说,更像是从“写一个能跑的量化脚本”走向“搭一套可复核的量化研究系统”的过程。

它现在最有价值的地方不在于给出一个神奇预测结果,而在于把量化研究拆成了一个个可以验证、可以回放、可以迭代的环节。后续无论是继续做 A 股选股、因子研究,还是做策略回测框架,这套工程底座都可以继续扩展。

最后再强调一次:本项目仅用于量化研究、工程验证和学习交流,不构成任何投资建议。历史回测不代表未来收益,实盘交易需要自行评估风险。