【开源】A 股 AI 量化全链路系统技术拆解:分层架构、双引擎验证与低换手实盘闭环
摘要
abq 是一套面向沪深 A 股的分层量化系统(自研核心约 5k 行 Python),覆盖:
L0 数据 → L1 LLM 因子 → L2 Qlib 研究 → L3 Backtrader/UMP 验证 → L4 执行对账 → L5 运维看板
设计原则:层间 CSV 契约解耦、回测与执行口径一致、双引擎交叉验证、低换手控成本、AI 因子漏斗防过拟合。
- GitHub :github.com/abell12134/abq
- 在线演示 :http://43.159.136.65:8000

⚠️ 本仓库为量化研究 / 学习项目,不构成任何投资建议。历史回测不代表未来收益。
1. 分层架构与 CSV 契约
系统刻意避免「大单体」,各层仅通过 CSV 文件 + schema 校验 通信(quant/contracts/schemas.py),可独立替换升级:
┌─────────────────────────────────────────────────────────────────────────┐
│ L5 运维 run_daily · compute_nav · monitor · FastAPI 看板 :8000 │
├──────────────────── CSV 契约 ───────────────────────────────────────────┤
│ L4 执行 make_trade_plan → record_fills / simulate_fills → reconcile │
├──────────────────── 信号 score ─────────────────────────────────────────┤
│ L3 验证 replay_backtrader · ump_judge │
├──────────────────── 因子/模型 ──────────────────────────────────────────┤
│ L2 研究 Qlib Alpha158+LGBM · predict_daily │ L1 LLM→准入→因子库 │
├──────────────────── Qlib bin ───────────────────────────────────────────┤
│ L0 数据 investment_data · baostock 增量 · quality_check │
└─────────────────────────────────────────────────────────────────────────┘
关键契约文件(按数据流):
| 文件 | 产出层 | 消费层 | 含义 |
|---|---|---|---|
data/signals/latest_pred.csv |
L2 | L3/L4 | 每日截面 score |
orders/<day>.csv |
L4 | 人工/模拟 | 调仓指令(先卖后买) |
fills/<day>.csv |
L4 | L4/L5 | 实际/模拟成交 |
nav/holdings.csv |
L4 | L5 | 持仓 + 盯市价 |
nav/daily.csv |
L5 | L5/看板 | 净值、收益、超额、换手 |
账户数据按 data/accounts/<account>/ 物理隔离,研究线与实盘线共用信号源、独立账本。
2. 研究层:Plan C 基线与「换手率是生命线」
2.1 生产口径
| 项 | 值 |
|---|---|
| 标的池 | 中证500(csi500) |
| 基准 | SH000905 |
| 模型 | Alpha158 + LightGBM Plan C |
| 组合 | TopK50 / n_drop3 / hold_thresh=10 |
| 标签 | 5 日开盘价收益(非 1 日) |
| 样本外 IR | 1.0459 (recorder 826b98ae) |
| 年化净超额 | ~+11.2% |
| 切分 | 训练 2010--2021 / 验证 2022--2023 / 测试 2024--至今 |
Plan C = 降学习率 + 加强 L1/L2 + 更长 early-stop,缓解 valid l2 过早恶化。
2.2 换手与成本的实证
| 场景 | 净超额 IR |
|---|---|
| 毛超额(无成本) | 0.6 ~ 0.8 |
| 每日全量调仓(1 日标签) | −0.17(成本吃光 alpha) |
| 5 日标签 + hold_thresh=10 | ~1.04 |
| Plan C 超参(2026-08) | 1.05 |
结论 :A 股个人量化,控换手比堆因子更重要 。execution/make_trade_plan.py 与研究层 TopkDropoutStrategy 共享同一套 hold_thresh 逻辑,保证实盘(路线一)与回测口径一致。
2.3 门禁机制
run_baseline.py 样本外 IR < 0.8 不晋升:
- 不写
latest_pred.csv - recorder 隔离到
research/mlruns_rejected/ predict_daily.py不会误用未过关模型
3. 验证层:Backtrader 独立复演
Qlib 向量化回测快,但容易忽略微观约束。阶段 2 用 Backtrader 事件驱动做第二套独立实现:
强制建模:T+1 · 涨跌停 9.5% · 停牌 · 整手 · 佣金万2.5(最低5)· 卖出印花税 0.05% · 可配滑点 · 次日开盘价成交(cheat-on-open)
验收门槛(Plan C 已通过):
| 指标 | 结果 | 门槛 |
|---|---|---|
| 复演 vs Qlib 年化差异 | −2.70pct | ≤ 3pct |
| 0.2% 滑点年化超额 | 7.86% | ≥ 5% |
| 日历对齐 | 624 交易日 | --- |
bash
cd quant
../quant-venv/bin/python validation/replay_backtrader.py
../quant-venv/bin/python validation/replay_backtrader.py --start 2025-07-01 --compare-ump
复演略保守(整手现金拖累 + 显式滑点)是预期行为------真钱下限看 astock+0.2% 滑点行,勿按 Qlib 纸面数字承诺。
4. UMP 裁判:信号二次否决
借鉴 abu UMP 思想,自研 LightGBM 拦截器(无 abu 运行时依赖):
- 输入特征:市场状态(基准动量/波动)、个股波动(vol20/区间位置)、信号分位(score/z)
- 任务:预测该笔买入持有期内是否跑输基准
- 样本外 A/B :超额 IR 0.21 → 0.48
bash
../quant-venv/bin/python validation/ump_judge.py train
evening 流水线加 --ump 开关,否决信号不进入 orders/。
5. L1:LLM 因子挖掘与五道准入
自研轻量 RD-Agent 式闭环(factor_lab/),不是 LLM 说什么就入库:
LLM 提议 → ①初筛 → ②去重 → ③样本外 → ④经济逻辑 → ⑤组合增量
↓ ↓ ↓ ↓ ↓
rejected rejected rejected rejected passed_auto
↓
paper_tracking(1~3 月)
↓
live 并入模型
3 轮迭代、15 个候选,2 个过全部关卡------漏斗有效拦截 AI 过拟合。
bash
cp configs/secret.env.example configs/secret.env # LLM API,gitignore
../quant-venv/bin/python factor_lab/run_iteration.py --iters 3 --k 5
6. 执行层:路线一每日闭环
6.1 时序
22:30 evening(自动)
update_daily → predict_daily → make_trade_plan(UMP) → orders/
[可选] sentiment_veto / sentiment_memory
次日 9:30~10:00(人工)
同花顺照 orders/ 或 orders_exec/ 下单
收盘后(人工)
record_fills --template → 改实际价/量 → --apply
23:30 postclose(自动)
reconcile → compute_nav → snapshot_positions → daily_report → 看板
研究线 research_sim_100k:simulate_fills 按次日开盘价自动成交。
实盘线 live_manual_10k:record_fills 人工回填,reconcile.py 输出滑点统计。
6.2 record_fills 幂等设计
- 成交应用后写
account.json.last_fill_date - 同日重复
--apply默认拒绝(防重复扣账) - 确需修账才用
--force
6.3 对账报告示例
结论: 对账通过(零错配)
滑点(1 笔,均值 -0.704%,不利 0 笔)
| SZ002244 | BUY | 参考价 8.52 | 成交价 8.46 | -0.704% |
7. 双线账户与执行偏差度量
| 账户 | 资金 | 模式 | 用途 |
|---|---|---|---|
research_sim_100k |
10 万 | simulated | 理想执行基准 |
live_manual_10k |
~2 万 | manual | 真实人工执行 |
shadow_ctrl_sim |
--- | simulated | TA 对照(无否决) |
shadow_ta_sim |
--- | simulated | TA 否决影子线 |
同一信号源、隔离账本 → ops/review_accounts.py 可量化日收益差、滑点、漏单。
TA 否决仅影子线 :门禁未 PASS 前 不上 live。
8. 舆情 overlay(实盘增强)
| 模块 | 路径 | 作用 |
|---|---|---|
sentiment_veto |
evening | Cursor Agent 联网检索,否决 BUY 硬伤票 → orders_exec/ |
sentiment_memory |
evening | 东财/财联社/新浪采集 → LLM 摘要 → 本地向量库 → 看板「舆情跟踪」 |
fail-open 设计:舆情步骤异常不阻断出单。
9. L5 运维:编排与看板
9.1 run_daily 两阶段
bash
# 晚间:信号 + 调仓清单
../quant-venv/bin/python ops/run_daily.py --stage evening --account live_manual_10k --ump
# 收盘后:对账 + 净值 + 日报
../quant-venv/bin/python ops/run_daily.py --stage postclose --account live_manual_10k \
--day <成交日> --order-day <订单日>
monitor.py 在 postclose 前检查 Qlib 日历是否落后于目标日,数据滞后则 CRIT 阻断。
9.2 Web 看板
FastAPI + APScheduler 内置定时,与 ops/crontab.example 二选一:
bash
bash webapp/serve.sh start 8000
页面:总览(多账户净值)· 舆情跟踪 · 操作清单(次日先卖后买)。
10. 数据层
| 来源 | 用途 |
|---|---|
investment_data 社区包(仓库分卷) |
历史底座 |
baostock 增量(update_incremental.py) |
每日补数,后复权 + factor |
quality_check |
质检不过即阻断下游 |
bash
../quant-venv/bin/python data_pipeline/update_daily.py # 全量编排
../quant-venv/bin/python data_pipeline/update_incremental.py # 仅补缺口
../quant-venv/bin/python quant/ops/ensure_qlib_data.py # 首次解压
11. 目录与配置速查
quant/
├── data_pipeline/ # L0
├── factor_lab/ # L1
├── research/ # L2
├── validation/ # L3
├── execution/ # L4
├── ops/ # L5 编排
├── webapp/ # L5 看板
├── contracts/ # schemas.py
└── configs/
├── global.yaml # 标的池、费率、风控
└── accounts/*.yaml # 分账户 topk、模式
| 配置 | 说明 |
|---|---|
research/workflow_baseline.yaml |
Qlib 训练/回测/组合完整配置 |
configs/secret.env |
LLM API(gitignore) |
configs/accounts/live_manual_10k.yaml |
实盘线 profile |
12. 阶段进度
| 阶段 | 内容 | 状态 |
|---|---|---|
| 1 | 数据 + Qlib 基线 IR≥0.8 | ✅ |
| 2 | Backtrader 复演 + 滑点敏感性 | ✅ |
| 2b | UMP 裁判 | ✅ |
| 3 | LLM 因子 + 五道准入 | ✅ |
| 4 | 路线一闭环 + 舆情 overlay | 🛠 实盘中 |
| 5a | Web 看板 + 双线 | 🛠 运行中 |
| 5 | miniQMT 全自动(vn.py) | 📋 规划中 |
13. 快速复现(开发者)
bash
git clone https://github.com/abell12134/abq.git && cd abq
python3 -m venv quant-venv && quant-venv/bin/pip install -r quant/requirements.txt
quant-venv/bin/python quant/ops/ensure_qlib_data.py
cd quant
../quant-venv/bin/python research/run_baseline.py # 研究基线
../quant-venv/bin/python validation/replay_backtrader.py # 独立复演
../quant-venv/bin/python ops/backfill.py --days 6 # 看板数据
bash webapp/serve.sh start 8000
贡献前请确保:不提交 secret.env / data/;新 CSV 走 schemas.py;三层调仓逻辑保持一致。
14. 上游致谢
15. 结语
如果你关心的是「回测数字怎么落到真钱口径」「AI 因子怎么防过拟合」「个人量化怎么不用券商 API 也能闭环」,欢迎 Star 和交流:
👉 https://github.com/abell12134/abq