第 2 章 · 03 回测如何工作


文档摘要

第 2 章 · 03 回测如何工作 本节摘要:回测(backtest)不是预测器,而是历史模拟器——它的价值是让你在投入真实资金前,先看清一套规则在历史数据里经历过什么:赚了多少、最大亏了多少、交易频率多高、是否被手续费吃掉、是否只在某一年有效。本节先给回测入口命令,让你能亲手跑一次;然后讲本章的重头戏——为什么不同市场必须走不同引擎:A 股要处理 T+1、涨跌停、一手 100 股、佣金、印花税;加密 7×24、T+0;期货有保证金和交割。最后点破一个残酷现实:「信号准不准」和「落到真实规则后能否赚钱」是两回事,很多看起来漂亮的短线策略,一加入滑点和费用就失效。 内容来源:原项目中文入门教程(第 5 章「回测如何工作」)与英文文档 合并改写。

第 2 章 · 03 回测如何工作

本节摘要:回测(backtest)不是预测器,而是历史模拟器——它的价值是让你在投入真实资金前,先看清一套规则在历史数据里经历过什么:赚了多少、最大亏了多少、交易频率多高、是否被手续费吃掉、是否只在某一年有效。本节先给回测入口命令,让你能亲手跑一次;然后讲本章的重头戏——为什么不同市场必须走不同引擎:A 股要处理 T+1、涨跌停、一手 100 股、佣金、印花税;加密 7×24、T+0;期货有保证金和交割。最后点破一个残酷现实:「信号准不准」和「落到真实规则后能否赚钱」是两回事,很多看起来漂亮的短线策略,一加入滑点和费用就失效。

内容来源:原项目中文入门教程(第 5 章「回测如何工作」)与英文文档 core-concepts/backtesting 合并改写。

学习目标

阅读完本节,你应当能够:

  1. 用一句话说清回测的本质(历史模拟器,证历史不证未来)。
  2. 用 CLI 命令跑通一次回测,并理解 agent 生成 run dir 后调用 backtest 工具的流程。
  3. 解释为什么不同市场必须走不同引擎,列举股票市场需要处理的特殊规则(T+1、涨跌停、一手股数、佣金、印花税、滑点)。
  4. 列举项目支持的七大引擎(China A-share、global equity、crypto、China futures、global futures、forex、composite)及其适用场景。
  5. 理解支持的bar 周期(1m/5m/15m/30m/1H/4H/1D)对回测结果的影响。
  6. 解释「信号准不准」与「能否成交、成本多高、仓位是否过度集中」之间的现实差距。

一、回测的本质:历史模拟器

很多人对回测有一个误解——以为回测好的策略未来就能赚钱。这是错的。

回测的本质:回测不是预测器,而是历史模拟器。它的价值是让你在投入真实资金前,先看清一套规则在历史数据里经历过什么:赚了多少、最大亏了多少、交易频率多高、是否只是某一年有效、是否被手续费吃掉。它只能证明历史表现,不能证明未来收益

为什么历史好不代表未来好?至少有三个原因:

  1. 市场风格切换:一个动量策略在牛市可能很灵,在震荡市可能持续亏损。
  2. 过拟合:策略参数是按历史优化的,天然「适配」历史,但未来不是历史的复制。
  3. 不可重复事件:历史里的某些极端行情(如 2008 金融危机、2020 疫情)可能不会以同样方式重演。

所以回测的正确用法是证伪而非证实——它帮你淘汰「在历史里就不行」的策略,但不能保证「在历史里行」的策略未来一定行。

⚠️ 所有回测结果均不构成投资建议。历史表现不代表未来收益。

二、回测入口:一条命令跑通

最直接的回测入口是 CLI:

vibe-trading run -p "Backtest a momentum strategy on a broad equity universe from 2020 to 2025. Include benchmark comparison, drawdown, turnover, and a short explanation."

这条提示背后发生的事:

关键步骤:

  1. agent 规划:决定用什么因子、数据源、引擎。
  2. 生成 run dir:产出 config.jsoncode/signal_engine.py(详见第 2 章 02)。
  3. 调用 backtest 工具:这个工具会先校验 config.jsonsignal_engine.py 的合法性(字段齐不齐、代码能不能跑),再运行。
  4. 运行 runner:调用 agent/backtest/runner.py,根据 config.engine 选择对应的市场引擎。
  5. 产出结果:净值曲线、回撤、turnover、benchmark 对比、报告。

💡 为什么先校验再运行:config.json 字段缺失或 signal_engine.py 有语法错误,会让回测跑到一半失败。先校验能在早期暴露问题,节省时间。

三、为什么市场引擎很重要:不同市场不是同一套规则

这是本节的核心。很多人以为「回测就是按信号买卖,所有市场都一样」,这是大错。

不同市场有完全不同的交易规则。 项目为此维护了多个引擎,每个引擎封装了对应市场的规则:

agent/backtest/engines/ china_a.py # A 股 global_equity.py # 全球股票 crypto.py # 加密 china_futures.py # 中国期货 global_futures.py # 全球期货 forex.py # 外汇 composite.py # 组合市场 options_portfolio.py # 期权组合

以 A 股(china_a)和全球股票(global_equity)为例,规则差异极大:

规则 A 股(china_a) 全球股票(global_equity)
交收制度 T+1(今天买,明天才能卖) 可能 T+0
涨跌停 有(主板 ±10%,创业板/科创板 ±20%) 通常无
一手股数 100 股(买入须是 100 的整数倍) 可买 1 股甚至小数股
做空 受限(融券) 通常支持
佣金 有,可协商
印花税 卖出单边征收 部分市场有
交易时间 固定时段 各市场不同

加密(crypto)又是另一套:7×24 交易、T+0、可加杠杆、无涨跌停、手续费率因交易所而异。期货(china_futures / global_futures)还要处理保证金、每日盯市、交割月。期权(options_portfolio)要处理行权、Greeks、组合保证金。

四、引擎选错会怎样:规则错配

如果引擎选错,回测结果会和真实交易差距巨大,甚至完全不可信。举几个典型错配:

  • global_equity 跑 A 股:不会处理 T+1,你以为今天买今天就能卖,实盘根本做不到;不处理涨跌停,你以为能买到涨停板的股票,实际买不到;不扣印花税,成本被低估。
  • china_a 跑加密:加密 7×24 交易,A 股引擎按固定时段处理会丢掉大量数据;加密没有「一手 100 股」概念,强制整数化会很奇怪。
  • 用单市场引擎跑跨市场策略:你的策略同时持有股票和加密,单一引擎无法处理,必须用 composite 让不同市场由不同子引擎协作。

💡 引擎选择原则:引擎必须和你的标的市場匹配。A 股用 china_a,美股/港股用 global_equity,加密用 crypto,跨市场用 compositeconfig.jsonengine 字段就是干这个的。

五、bar 周期:日 vs 分钟

除了引擎,config.jsonbar 字段(回测的 K 线周期)也会显著影响结果。项目支持的周期包括:1m5m15m30m1H4H1D(是否可用取决于数据源)。

  • 日级(1D):适合中长线策略,数据量小,回测快。
  • 分钟级(1m/5m/15m):适合短线、日内策略,数据量大,回测慢,但对成交细节刻画更精细。

⚠️ 分钟级回测的陷阱:分钟级数据更精细,但也会放大「过拟合」风险——你能在更细的粒度上找到「恰好适配历史」的参数,但这些参数往往在样本外失效。除非你的策略本身就是分钟级,否则建议从日级开始。

六、信号准 ≠ 能赚钱:现实差距

理解了引擎和成本,你就能看破一个常见幻觉:「我的信号很准,所以策略一定赚钱」。未必。

「信号准」只代表你判断对了方向(比如预测某只股票会涨,它确实涨了)。但从「判断对方向」到「实际赚到钱」,中间还有几道关:

  1. 能否成交:A 股涨停板你买不进去,跌停板你卖不出来;停牌的股票根本不能交易。信号触发了不代表能成交。
  2. 成本多高:每笔交易有佣金、滑点、印花税。短线策略交易频繁,累计成本可能吃掉全部超额收益。
  3. 仓位是否过度集中:满仓一两只股票,即使方向判断对,一次黑天鹅就足以清零。
  4. 市场规则约束:T+1 让你今天买错了也无法立刻止损;涨跌停让你的止损单无法成交。
你的判断(信号): 某股会涨 ✓(信号准) │ ▼ 实际交易: - 能买到吗?(涨停/停牌) - 成本多少?(佣金/滑点/印花税) - 仓位合理吗?(集中度) - 能及时退出吗?(T+1/流动性) │ ▼ 最终盈亏:可能赚、可能亏、可能只是打平

💡 残酷现实:很多看起来漂亮的短线策略,一加入滑点和费用就失效。这是因为它们的「超额收益」本来就薄,被成本一吃就没了。这也是为什么回测必须按真实市场规则跑——用对的引擎、扣对的成本。

七、一个真实回测命令

把本节内容串起来,看一条覆盖多资产的回测命令:

vibe-trading run -p "Backtest an equal-weight SPY and BTC-USDT momentum rotation strategy for 2024 with benchmark comparison"

这条命令会:

  • 标的:SPY(全球股票)+ BTC-USDT(加密)——跨市场。
  • 引擎:agent 会选 composite,让股票部分走 global_equity、加密部分走 crypto
  • 信号:动量轮动(谁强持有谁)。
  • 验证:挂上 benchmark 对比。
  • 产出:净值曲线、回撤、turnover、报告、run card。

⚠️ 即使回测结果很好看,也不构成投资建议。SPY 和 BTC-USDT 都是真实标的,任何实盘交易前必须经过你自己的判断、券商确认、模拟盘验证。

本节要点回顾

  1. 回测的本质:历史模拟器,证历史不证未来——用法是证伪(淘汰历史不行的),不是证实(保证未来一定行)。
  2. 回测入口:vibe-trading run -p "...",agent 生成 run dir → 调用 backtest 工具 → 校验 → 运行 runner.py → 选引擎 → 产出。
  3. 七大引擎:China A-share、global equity、crypto、China futures、global futures、forex、composite(加 options_portfolio 是期权组合)。
  4. A 股特殊规则:T+1、涨跌停、一手 100 股、佣金、印花税、结算费、滑点。
  5. bar 周期:支持 1m/5m/15m/30m/1H/4H/1D;分钟级精细但易过拟合,建议从日级开始。
  6. 引擎必须匹配市场:错配会让回测和真实交易差距巨大(如用 global_equity 跑 A 股会漏 T+1/涨跌停/印花税)。
  7. 信号准 ≠ 能赚钱:还要看能否成交、成本多高、仓位是否集中、市场规则约束——很多短线策略一加成本就失效。

⚠️ 本节所有回测命令与结果均不构成投资建议。历史表现不代表未来收益。

下一节,我们将讲验证工具与回测陷阱——基准对比、蒙特卡洛、Bootstrap、Walk-Forward、run card 的作用与局限,以及 lookahead(偷看未来)与违反 PIT(点在时间)这两类回测常见错误的识别与规避。


发布者: 作者: HKUDS 转发
评论区 (0)
U