| name | model-train-infer-backtest-report |
| description | 模型训练-推理-组合回测-专业报告 全流程 — 提交T+N周期模型训练、批量推理全年、自定义组合策略回测(分数阈值+大盘MA+止损)、导出研报级MD+PDF报告。在 QuantBot / Claude Code 中训练模型、推理历史、回测策略、对比T+N周期、出专业分析报告时使用。触发词:训练模型、推理全年、回测策略、T+3、T+5、周期对比、止损、大盘过滤、出报告、效益分析 |
模型训练-推理-回测-报告(全流程)技能
覆盖 QuantMind 量化策略的完整闭环:训练模型 → 推理历史 → 组合回测 → 专业报告。用于验证"改个参数(周期/阈值/风控)收益会不会更好"这类问题,用数据说话而不是猜。
架构总览
① 训练模型 (run-training API)
├─ T+N 周期选择 (T+1/T+3/T+5...)
├─ 特征 (75~182 个来自 QuantDB)
| └─ 训练 2023-2025 → 推理 2026
② 推理历史 (批量推理 API)
├─ 单日 /models/inference/run
└─ 批量 range 模式 推理全年逐个交易日
③ 组合回测 (自定义脚本)
├─ backtest_l2_top20.py 基本 Top20 每日滚动
├─ backtest_l2_year.py 全年严格版 (滑点+T+1+涨跌停+ST剔除)
└─ backtest_l2_optimized.py 优化版 (分数阈值+大盘MA+止损5%)
④ 专业报告 (report_l2_optimized.py)
└─ 回测数据 → 研报级 MD → md_to_pdf_report.py → PDF
认证
BASE=http://localhost:8000
TOKEN=$(curl -s -X POST $BASE/api/v1/auth/login -H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123","tenant_id":"default"}' \
| python3 -c "import sys,json; print(json.load(sys.stdin).get('access_token',''))")
AUTH="Authorization: Bearer $TOKEN"
CT="Content-Type: application/json"
① 训练模型(提交 T+N CatBoost/LGB 等)
1.1 从现有模型复刻(推荐:保特征,只改周期)
训练参数模型在 admin_training_jobs.request_payload。要训练 T+3 版本对比已有 T+5,复制 T+5 的 payload 只改 target_horizon_days,保证特征/时间/数据完全一致,只变量周期。
已有可复用脚本:scripts/submit_t3_training.py(从 T+5 复制改 T+3)
docker cp scripts/submit_t3_training.py quantmind:/tmp/
docker exec quantmind python3 /tmp/submit_t3_training.py
核心逻辑(复制 payload):
async def get_t5_features():
async with get_session() as s:
r = await s.execute(text(
"SELECT request_payload FROM admin_training_jobs WHERE id='train_XXXX'"))
return json.loads(r.fetchone()[0])
t3 = get_t5_features()
t3["target_horizon_days"] = 3
t3["job_name"] = "L2_catboost_2023_2025T3"
t3["display_name"] = "L2 CatBoost T+3 (2023-2025训练)_CN"
1.2 训练提交后轮询状态
curl -s -H "$AUTH" "$BASE/api/v1/models/training-runs/<runId>" \
| python3 -c "import json,sys; d=json.load(sys.stdin)['data']; print(d['status'], d['progress'])"
docker ps | grep qm-train
docker exec quantmind python3 -c "
import asyncio
from backend.shared.database_manager_v2 import get_session
from sqlalchemy import text
async def m():
async with get_session() as s:
r = await s.execute(text(\"SELECT logs FROM admin_training_jobs WHERE id='<runId>'\"))
print(str(r.scalar_one())[-500:])
asyncio.run(m())"
1.3 训练完成 → model 注册
训练完成 status=completed,模型注册为 mdl_cn_train_<runId>。查模型 ID:
curl -s -H "$AUTH" "$BASE/api/v1/research/models" | python3 -c "
import json,sys
for m in json.load(sys.stdin)['data']:
print(m['modelId'], '|', m.get('name'))"
1.4 T+N 周期选择建议(来自实际回测)
| 周期 | 特点 |
|---|
| T+1 | 最灵敏,但噪音大、换手高、滑点损耗大 |
| T+3 | 平衡:比T+5敏锐,噪音可控(推荐首选尝试) |
| T+5 | 稳定,低频 |
| 判断 | 需要真实回测对比,不能凭感觉 |
② 批量推理历史(全年)
训练完成后,要对历史全年推理出每日分数(回测需要)。
2.1 批量推理 API(mode=range,全年逐日)
curl -s -X POST -H "$AUTH" -H "$CT" "$BASE/api/v1/models/inference/batch" \
-d '{
"model_id": "<T+3_model_id>",
"mode": "range",
"start_date": "2026-01-06",
"end_date": "2026-08-19",
"top_k": 500,
"reuse_existing": true
}'
2.2 轮询批量推理进度
curl -s -H "$AUTH" "$BASE/api/v1/models/inference/batch/<batch_id>" \
| python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('status'), d.get('progress_done'), '/', d.get('progress_total'))"
2.3 验证推理结果(分数已写入 engine_signal_scores)
docker exec quantmind python3 -c "
import asyncio
from backend.shared.database_manager_v2 import get_session
from sqlalchemy import text
async def m():
async with get_session() as s:
r = await s.execute(text(\"SELECT MIN(trade_date),MAX(trade_date),COUNT(DISTINCT trade_date) FROM engine_signal_scores e WHERE e.run_id IN (SELECT run_id FROM qm_model_inference_runs WHERE model_id='<model_id>')\"))
print(r.fetchone())
asyncio.run(m())"
注意:批量推理 range 模式耗时较长(每交易日全市场),耐心等待或后台跑。
③ 组合回测(自定义策略脚本)
3.1 脚本家族(scripts/)
| 脚本 | 用途 | 规则 |
|---|
backtest_l2_top20.py | 基本版 | Top20每日滚动+每只100股+涨跌停禁买卖 |
backtest_l2_year.py | 严格版 | 全年+滑点0.2%+T+1+涨跌停+ST剔除+资金分配 |
backtest_l2_optimized.py | 优化版(推荐) | 分数阈值+大盘MA20过滤+止损5%+ST剔除+滑点+T+1 |
3.2 优化版策略规则(实测最有效)
BUY_THRESHOLD = 0.015
SELL_THRESHOLD = 0.005
STOP_LOSS = 0.05
MA_WINDOW = 20
SLIPPAGE = 0.002
三大风控(把 -40% 扭转到 +32%):
- 分数阈值:只买 ≥0.015 高分(胜率 82-92%),<0.005 卖出
- 大盘 MA 过滤:上证 <MA20 时空仓(躲开系统性下跌,回撤 51%→11%)
- 止损 5%:单票亏 5% 止损(控制单票风险)
3.3 运行回测(拷贝进容器,数据在 /data)
docker cp scripts/backtest_l2_optimized.py quantmind:/tmp/
docker exec quantmind python3 -c "
import sys; sys.path.insert(0,'/tmp')
import backtest_l2_optimized as b
b.MODEL_ID = '<target_model_id>'
b.signals = b.load_signals() # 自动读该模型全部信号
# ...然后 run_backtest + report
"
3.4 解读回测指标
| 指标 | 说明 |
|---|
| 累计收益 / 年化 | 年化短周期外推参考 |
| 最大回撤 | 流动性/风险核心,优化版目标 <15% |
| 夏普 / 索提诺 | 风险调整后收益 |
| 止损笔数 + 贡献 | 止损控风险的成本 |
| 大盘MA空仓天数 | 躲过多少系统性下跌 |
| 资金利用率 | 目标 >80%(资金没闲置) |
| 卖出胜率 | 单笔胜率(低是因为止损主动卖在-5%) |
④ 专业报告(MD → PDF)
4.1 报告生成器
docker cp scripts/report_l2_optimized.py quantmind:/tmp/
docker cp scripts/backtest_l2_optimized.py quantmind:/tmp/
docker exec quantmind python3 -c "
import sys; sys.path.insert(0,'/tmp')
from report_l2_optimized import main; main()
"
4.2 MD → PDF(研报级排版)
docker cp "docs/xxx_report.md" quantmind:/tmp/rep.md
docker exec quantmind python3 /app/backend/scripts/md_to_pdf_report.py /tmp/rep.md "/tmp/xxx_report.pdf"
docker cp quantmind:/tmp/xxx_report.pdf "docs/xxx_report.pdf"
4.3 报告结构(9 部分)
- 核心业绩指标:收益/年化/回撤/夏普/索提诺/止损/空仓天数/资金利用
- 阶段对比:优化版 vs 基础版 vs 原严格版(体现改进)
- 净值曲线:逐日净值+日收益
- 月度收益:各月涨跌
- 周度收益:各周涨跌
6-7. Top20 盈利/亏损股:个股贡献
- 交易明细:买卖/价格/盈亏/原因
- 策略规则说明
5. 完整工作流示例(对比 T+3 vs T+5)
docker exec quantmind python3 /tmp/submit_t3_training.py
curl -s -X POST -H "$AUTH" -H "$CT" "$BASE/api/v1/models/inference/batch" \
-d '{"model_id":"<T+3_id>","mode":"range","start_date":"2026-01-06","end_date":"2026-08-19"}'
6. 常见问题排查
| 问题 | 处置 |
|---|
| 训练进度卡住 | docker ps 看 qm-train 容器,docker logs 看 train.py 输出 |
| 推理慢/超时 | range 批量后台跑,耐心等;reuse_existing=true 断点续跑 |
| 回测无买入 | 检查 MODEL_ID 是否对、分数是否 ≥0.015(分数太低自然空仓) |
| 报告收益异常 | 确认 klines 覆盖区间、涨跌停/停牌处理、cron 时间 |
| asyncio 冲突 | 混用 load_signals(asyncio) 和 psycopg2 时,加载函数统一用 psycopg2 同步 |
| 年化离谱 | 短周期外推失真,看累计收益和回撤,别信年化 |
7. 相关技能
- [[backtest-center]] — Qlib 单策略回测/专家模式/参数优化(不同的回测层面)
- [[batch-inference-analysis]] — 分析推理结果选股(本技能的重心是验证策略收益)
- [[quantmind-operations]] — 模型训练/模型管理的运营操作
- [[ai-ide-strategy-writing]] — AI 写策略并执行
8. 相关脚本
scripts/submit_t3_training.py — 复刻 T+5→T+3 训练提交
scripts/backtest_l2_optimized.py — 优化版组合回测(分数阈值+MA+止损)
scripts/backtest_l2_year.py — 全年严格版
scripts/backtest_l2_top20.py — 基础版
scripts/report_l2_optimized.py — 研报级 MD 生成
backend/scripts/md_to_pdf_report.py — MD→PDF 研报排版