-
Notifications
You must be signed in to change notification settings - Fork 163
06_Backtest_Methodology
youngcan edited this page May 25, 2026
·
1 revision
回测的目标是验证"策略方向是否有效",而不是预测实盘收益。本篇解释回测怎么跑、有什么限制。回测指标和偏差术语定义统一见主仓库 GLOSSARY.md。
这套回测是日线级别的方向验证工具:
- 不模拟盘口深度和撮合排队
- 不模拟滑点
- 不考虑涨跌停无法成交的情况
- 市值/行业映射使用当前截面(有偏差,见第 6 节)
| 参数 | 含义 |
|---|---|
--start / --end |
回测时间区间 |
--hold-days |
持有多少个交易日后卖出 |
--top-n |
每日最多持有几只 |
--sample-size |
股票池采样数量(0 = 全量) |
--snapshot-dir |
使用哪个快照目录的数据 |
--exit-mode |
离场方式:close_only 或 sltp
|
--stop-loss |
止损阈值(如 -7 表示 -7%) |
--take-profit |
止盈阈值(如 18 表示 +18%,0 = 不止盈) |
--regime-filter |
是否启用大盘水温仓位控制 |
持有 N 天后按收盘价卖出,不做中间干预。适合做策略方向验证。
在持有期内每天检查是否触发止盈或止损:
- 触发了 → 当天按阈值价离场
- 持有期结束都没触发 → 按最后一天收盘价离场
更接近真实操作逻辑。
为了找到最优参数组合,系统跑 18 组参数的并行回测:
hold_days = [5, 10, 15]
stop_loss = [-6, -7, -8]
take_profit = [0, 18]
架构分三阶段:
| 阶段 | 做什么 | 为什么 |
|---|---|---|
| Phase 1:fetch | 1 个 job 拉全量行情数据 | tushare 限制最多 2 个 IP |
| Phase 2:grid | 18 个 job 并行回测 | 读本地快照,不做网络请求 |
| Phase 3:notify | 汇总结果推送飞书 | — |
启用 --regime-filter 后,每天根据大盘状态裁剪开仓数量。具体水温定义和实证依据见 板块轮动与大盘水温。
| 水温 | 开仓比例 | 含义 |
|---|---|---|
| NEUTRAL | 100% | 正常选股 |
| RISK_ON / PANIC_REPAIR | 50% | 过热或恐慌修复,减半 |
| RISK_OFF | 30% | 趋势转弱 |
| CRASH | 0% | 不开新仓 |
这里保留表格是为了说明回测参数如何影响仓位,不重复展开水温方法论。
市值和行业仍有当前截面依赖,历史回测可能高估策略表现。
股票池不包含已退市公司,历史样本的安全性会被高估。
结论:回测结果适合做"参数方向验证",不适合做"实盘收益承诺"。
要对比两次回测结果,必须确保以下条件相同:
- 同一份快照数据
- 同一种 exit_mode
- 同一个 top_n 和 sample_size
- 每次只改一个变量
- 保留变更日期、数据源、代码版本和关键参数
否则结果不可比。你对比的不是策略差异,而是口径差异。
# 止盈止损口径
python -m scripts.backtest_runner \
--start 2025-10-01 --end 2026-04-03 \
--hold-days 30 --top-n 3 --board all --sample-size 0 \
--snapshot-dir data/funnel_snapshots/full_fetch_20260403 \
--exit-mode sltp --stop-loss -7 --take-profit 0 --sltp-priority stop_first
# 简单持有口径(历史对照)
python -m scripts.backtest_runner \
--start 2025-10-01 --end 2026-04-03 \
--hold-days 30 --top-n 3 --board all --sample-size 0 \
--snapshot-dir data/funnel_snapshots/full_fetch_20260403 \
--exit-mode close_only