
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.py、download.py、train_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_mean、rank_ic_ir、positive_ic_rate、top_quantile_return、bottom_quantile_return 和 top_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 股选股、因子研究,还是做策略回测框架,这套工程底座都可以继续扩展。
最后再强调一次:本项目仅用于量化研究、工程验证和学习交流,不构成任何投资建议。历史回测不代表未来收益,实盘交易需要自行评估风险。