← 首页

量化交易

你的回测为什么一上线就失效

回测失效通常不是运气不好,而是样本、成本、成交、市场环境和监控规则在实盘前就没有被认真处理。

回测曲线进入实盘后被成本、成交和环境变化压低的示意图

很多策略在回测里像一台稳定印钞机,一上线就开始漏水。研究阶段的资金曲线顺滑,最大回撤可控,胜率也漂亮;到了实盘,滑点比预期大,订单成交不完整,信号频率变了,连续亏损来得比报告里更快。最后研究者往往把原因归结为“市场变了”或者“运气不好”。

但多数回测失效并不是突然发生的。它们在上线前已经埋好了,只是回测报告没有把问题暴露出来。回测不是为了证明策略会赚钱,而是为了尽早发现策略在哪些条件下不该被交易。如果回测只输出收益率、胜率和一张资金曲线,它就没有完成真正的工作。

一套策略上线后失效,通常不是因为未来不可预测,而是因为过去被研究者处理得太干净。

回测默认成交,实盘先考成交

回测里最危险的假设之一,是信号出现后可以按理想价格成交。很多框架默认下一根 K 线开盘价、当前收盘价或固定滑点成交,这会让策略看起来比真实交易稳定得多。实盘里,成交价格不是一个输入参数,而是策略结果的一部分。

市价单有冲击成本,限价单有不成交和逆向选择。止损单在剧烈波动中可能滑出很远,突破单可能在盘口最薄的时候追进去。一个策略如果每笔交易只赚很薄的边际,执行误差稍微放大,就能把正收益变成负收益。

尤其是短周期策略,理论优势常常小到只剩几个基点。回测里少算一半手续费、低估一档价差、忽略部分成交,都会制造虚假的稳定性。看起来是策略能力,实际可能只是执行成本没有被扣干净。

实盘前至少要问四个问题:信号触发时盘口深度够不够,目标仓位需要吃掉多少档价格,限价单不成交时是否追价,止损触发后最大可接受滑点是多少。如果这些问题没有答案,收益曲线再好也只是纸面结果。

样本内调参会让策略记住历史

很多回测不是在验证假设,而是在寻找历史上最舒服的参数。均线周期试几十组,止损比例试几十组,过滤条件不断加减,最后挑一组收益最高、回撤最低的配置。这个过程看起来严谨,其实是在让策略记住过去。

过拟合最麻烦的地方,是它不一定长得很夸张。有些过拟合策略也有合理解释,也能通过一部分样本外测试。但只要研究者反复查看结果再修改规则,所谓样本外就会被污染。你看到的不是策略适应未来,而是研究流程把未来数据也纳入了训练。

一个简单检查是参数邻域。如果参数从 48 改到 50,策略还可以接受;从 50 改到 52,也没有立刻崩掉,说明它可能依赖某种稳定结构。反过来,如果只有一个精确参数赚钱,相邻参数都亏损,那更像历史噪声的窄点。

另一个检查是规则数量。入场、过滤、止损、止盈、交易时段、标的筛选、波动率条件、成交量条件,每一层都是自由度。自由度越多,越需要更严格的反证测试。否则策略不是在捕捉市场结构,而是在捕捉研究者的选择路径。

成本假设太乐观,会吞掉全部优势

很多策略的回测收益来自很薄的平均单笔利润。比如一笔交易平均赚 0.12%,看起来年化很高,但只要手续费、价差、滑点和资金费率合计多出 0.08%,真实收益就会完全变形。策略越高频,成本建模越不能含糊。

成本不应该只写一个固定百分比。不同市场状态下,真实成本会变化。波动率升高时价差扩大,流动性下降时冲击成本上升,消息行情中止损滑点放大,杠杆合约还会受到资金费率影响。固定成本假设只能作为起点,不能作为上线依据。

更保守的做法是做成本压力测试。手续费按真实账户等级计算,滑点至少测试 1 倍、1.5 倍和 2 倍,成交率要测试低于预期的情形,资金费率要加入极端阶段。如果策略只在最乐观成本下盈利,它的优势就不应该被当成可交易优势。

成本压力测试的结论也要变成动作。例如:滑点翻倍后收益转负,就限制订单类型和交易频率;成交率低于 70% 后回撤失控,就设置最低成交率监控;资金费率进入极端分位数时收益变差,就把它写进过滤器。

信号可能偷看了未来

前视偏差不一定是明显错误。更常见的是一些看起来合理的细节:使用未完成 K 线的收盘价,按当日收盘后才知道的数据在当日开仓,用完整样本计算分位数后再回测历史,筛选今天还活着的标的池,或者用事后确认的趋势段训练策略。

这些问题不会让代码报错,也不会在资金曲线上留下标记。它们只会让策略看起来更聪明。实盘里,信号只能使用当时已经确定的信息;回测里只要多知道一点未来,胜率、回撤和入场位置都会被美化。

时间戳是第一道防线。信号生成时间、数据可得时间、下单时间、成交时间必须分清楚。日线策略不能默认在收盘价确认之前就按收盘价交易,分钟策略不能把当前还在变化的 K 线当成已完成数据,因子策略不能使用回测时才整理好的未来标的池。

一个实用原则是:每个字段都要回答“当时是否已经知道”。如果答案不确定,就按不知道处理。宁可让回测保守,也不要让策略带着未来信息上线。

策略只适合某一种市场环境

有些策略不是无效,而是适用区间很窄。趋势策略在强趋势里赚钱,在震荡里不断止损;均值回归策略在区间波动里稳定,在单边行情中承受尾部亏损;突破策略依赖波动收缩后的重新定价,在假突破密集的环境里会被反复消耗。

如果回测样本主要来自一种市场环境,策略上线后遇到另一个环境,失效就很正常。问题不在于市场变了,而在于研究报告没有说明策略依赖什么环境,也没有定义环境改变后的动作。

回测报告应该把收益按环境拆开。趋势强度高低、波动率分位、成交量变化、市场方向、相关性水平,都可以作为切片。策略不需要在所有环境都赚钱,但它应该在自己声称擅长的环境里赚钱,在不擅长的环境里少亏或少交易。

如果一个趋势策略的主要利润来自震荡阶段,研究者应该怀疑假设;如果一个均值回归策略的最大亏损全部来自单边突破阶段,止损和暂停条件就必须写清楚。环境拆解不是为了美化策略,而是为了知道什么时候不要让它工作。

利润可能集中在少数交易

总收益会掩盖很多问题。一个策略年化收益很高,但如果大部分利润来自三笔交易,或者来自某一个月份,它的稳定性就没有资金曲线显示得那么强。实盘不一定会复制那几笔极端盈利,却一定会复制交易成本和亏损波动。

上线前要看交易分布。去掉最大 1% 盈利交易后是否还赚钱,连续亏损长度是否在可承受范围内,不同月份收益是否过度集中,单笔亏损是否存在长尾,持仓时间是否和策略假设一致。这些比单一夏普比率更能暴露真实风险。

还可以做交易顺序扰动。保持每笔交易盈亏不变,随机打乱顺序,观察可能出现的最大回撤。如果原始回测的回撤明显小于多数扰动结果,说明历史顺序可能过于幸运。实盘不会保证盈利交易刚好出现在最需要的时候。

如果策略必须依赖少数大盈利才能成立,它不是不能交易,但仓位和预期都要降低。这样的策略需要更长验证期、更严格的止损、更明确的容量限制,而不是直接按漂亮年化去放大。

上线后没有失效监控,只能等亏损提醒你

很多策略上线时只有入场和出场规则,没有失效规则。亏损发生后,研究者才开始问:这是正常回撤,还是策略坏了?这是市场环境切换,还是执行质量下降?这是短期噪声,还是假设已经不成立?

没有失效监控,策略就会变成信仰。只要亏损没有大到无法忍受,研究者总能找到继续交易的理由。成熟的系统应该在异常刚出现时就降低风险,而不是等账户回撤替你做决定。

失效监控可以从四类指标开始。第一类是表现指标,例如最近 30 笔交易的胜率、盈亏比、最大连续亏损是否偏离历史区间。第二类是执行指标,例如滑点、成交率、拒单率、订单延迟。第三类是信号指标,例如信号频率、持仓时间、入场后最大不利波动。第四类是环境指标,例如波动率、相关性、趋势强度和流动性。

每个指标都要对应动作。滑点超过回测 95 分位数,仓位减半;连续两周信号频率低于历史 5 分位数,暂停新增仓位;实际回撤超过压力测试回撤的 1.25 倍,进入人工复核;订单连续失败,系统切换只减仓模式。

实盘前的最低检查清单

一套策略不需要完美才可以小资金验证,但至少要通过最低检查。这个清单不是为了拖慢上线,而是为了避免把明显脆弱的东西送进真实账户。

  • 假设检查:策略要解释为什么市场会给这个机会,以及什么情况说明假设失效。
  • 数据检查:时间戳、缺失值、未完成 K 线、未来数据、标的池选择都要可追溯。
  • 成本检查:手续费、价差、滑点、资金费率、成交率都要做压力测试。
  • 参数检查:相邻参数表现不能立刻崩掉,规则数量要和样本量匹配。
  • 分布检查:利润不能过度依赖少数交易、少数月份或单一市场状态。
  • 环境检查:收益要按趋势、震荡、波动率和流动性拆解。
  • 执行检查:订单类型、超时、部分成交、止损失败和接口异常要有处理规则。
  • 失效检查:上线前写清楚暂停、减仓、复核和恢复条件。

如果一套策略无法通过这些检查,问题不是它暂时不能上线,而是研究者还不知道它会在哪里坏掉。真正危险的不是策略有缺陷,而是缺陷没有被命名。

回测的价值是提前暴露失败

好的回测不会让策略看起来更完美,反而会让它看起来更受限制。它会告诉你哪些利润不可靠,哪些成本会吞掉优势,哪些环境不该交易,哪些执行条件必须满足,哪些异常出现后应该停手。

这听起来没有一条向右上方的资金曲线迷人,但它更接近真实交易。实盘不是回测的延续,而是回测假设接受检验的地方。上线前拆得越细,上线后越少用账户余额支付学费。

所以,“你的回测为什么一上线就失效”这个问题,答案通常不在上线之后,而在上线之前。策略早就告诉过你它脆弱,只是回测报告没有认真听。