Skip to content

06_Backtest_Methodology

youngcan edited this page May 25, 2026 · 1 revision

回测方法学

回测的目标是验证"策略方向是否有效",而不是预测实盘收益。本篇解释回测怎么跑、有什么限制。回测指标和偏差术语定义统一见主仓库 GLOSSARY.md


1. 边界声明

这套回测是日线级别的方向验证工具

  • 不模拟盘口深度和撮合排队
  • 不模拟滑点
  • 不考虑涨跌停无法成交的情况
  • 市值/行业映射使用当前截面(有偏差,见第 6 节)

2. 关键参数

参数 含义
--start / --end 回测时间区间
--hold-days 持有多少个交易日后卖出
--top-n 每日最多持有几只
--sample-size 股票池采样数量(0 = 全量)
--snapshot-dir 使用哪个快照目录的数据
--exit-mode 离场方式:close_onlysltp
--stop-loss 止损阈值(如 -7 表示 -7%)
--take-profit 止盈阈值(如 18 表示 +18%,0 = 不止盈)
--regime-filter 是否启用大盘水温仓位控制

3. 两种离场方式

close_only(简单持有)

持有 N 天后按收盘价卖出,不做中间干预。适合做策略方向验证。

sltp(止盈止损)

在持有期内每天检查是否触发止盈或止损:

  • 触发了 → 当天按阈值价离场
  • 持有期结束都没触发 → 按最后一天收盘价离场

更接近真实操作逻辑。


4. 回测网格(GitHub Actions)

为了找到最优参数组合,系统跑 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 汇总结果推送飞书

5. 大盘水温仓位控制

启用 --regime-filter 后,每天根据大盘状态裁剪开仓数量。具体水温定义和实证依据见 板块轮动与大盘水温

水温 开仓比例 含义
NEUTRAL 100% 正常选股
RISK_ON / PANIC_REPAIR 50% 过热或恐慌修复,减半
RISK_OFF 30% 趋势转弱
CRASH 0% 不开新仓

这里保留表格是为了说明回测参数如何影响仓位,不重复展开水温方法论。


6. 已知偏差(必读)

前视偏差

市值和行业仍有当前截面依赖,历史回测可能高估策略表现。

幸存者偏差

股票池不包含已退市公司,历史样本的安全性会被高估。

结论:回测结果适合做"参数方向验证",不适合做"实盘收益承诺"。


7. 对比实验的规则

要对比两次回测结果,必须确保以下条件相同:

  • 同一份快照数据
  • 同一种 exit_mode
  • 同一个 top_n 和 sample_size
  • 每次只改一个变量
  • 保留变更日期、数据源、代码版本和关键参数

否则结果不可比。你对比的不是策略差异,而是口径差异。


8. 命令示例

# 止盈止损口径
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

Clone this wiki locally