- 9/3/2026
- 9/3/2026
- 9/3/2026
- 9/3/2026
回测结果与实盘交易存在差异,是因为回测是一种模拟,而非对精确执行环境的重现。差异通常源于历史数据质量、不切实际的成交假设、点差与滑点、延迟、市场机制变化、过拟合、交易成本以及人为干预。通过样本外测试、前向分析、现实的成本建模、模拟验证以及小规模实盘部署,可以缩小这一差距。
这是简短的回答。本文的其余部分将逐一分析每个原因,并提供一些实用的工具、偏差检查清单、分阶段验证框架以及诊断表,帮助你弄清楚究竟是哪个具体的差距影响了你的策略,而不是将其视为一个模糊的谜团。我曾有过完全相同的经历:一个在测试中看起来非常强大的策略,在实盘第一个月表现却极其挣扎。事实证明,这是两三个因素叠加在一起的结果,而不是单一的剧烈失败,这实际上比人们预期的更常见。
数据与 K 线内序列
这通常是分歧开始悄然发生的地方,甚至在进行第一笔实盘交易之前就已经开始了。
跳动数据(Tick Data)与 K 线数据(Bar Data)
许多回测是基于 K 线数据(每根蜡烛的开盘价、最高价、最低价、收盘价)运行的,而不是基于逐跳(tick-by-tick)的价格运动。这是一种极大的简化。一根波动范围较大的分钟 K 线,在从开盘到收盘的过程中可能会经历无数种路径,而仅使用 K 线四个数据点的回测必须假设某种 K 线内顺序,通常是开盘、最低、最高、收盘,或者类似的惯例。如果你的策略进场或止损取决于哪个极端值先被触及,那么这种假设可能会让一笔盈利交易变成亏损交易,而这仅仅是基于回测引擎默默做出的一个猜测。
跳动数据减少了价格变化序列的不确定性,但它并不能自动重现实盘市场中存在的流动性、队列位置、路由和成交条件。它是对 K 线数据的显著改进,但并非完整的解决方案。跳动数据记录了来自特定数据源的单个报价或交易更新,比 OHLC K 线提供更多细节,但其完整性和代表性仍取决于数据源。零售经纪商的跳动数据反映的是该特定经纪商或供应商的报价变化,并不一定代表整个更广泛市场的每一笔交易或报价,它可能仍然会忽略完整的订单簿深度、隐藏流动性、队列位置以及其他参与者的实际成交概率。
历史数据缺口与质量问题
除了跳动数据与 K 线数据的区别外,历史数据本身并不总是干净的。数据源可能会出现缺口,尤其是在流动性较低的时段或供应商停机期间,不同的数据供应商可能会对同一金融工具显示出显著不同的历史价格,因为每个供应商都是从略有不同的来源进行汇总的。一个值得采用的习惯是:通过第二个独立的来源,对你历史数据集中的一些日期进行抽样检查。如果价格高度吻в合,那是令人放心的。如果价格在已知的波动事件前后出现显著分歧,这便是一个信号,表明你的回测结果可能建立在比看似完美的净值曲线更不稳固的基础上。
执行与成交假设
这是最令交易者感到意外的部分,因为除非回测引擎专门对其进行建模,否则在回测中它是不可见的。
并非所有回测都同样简单
简化的回测通常假设在观察到的价格或下一个可用价格处立即成交,没有延迟、没有拒绝,也没有部分成交。更高级的模拟器可以模拟延迟、买卖价差、部分成交、队列位置和可变交易成本,但其真实性完全取决于提供给它们的数据和假设。如果喂给高级模拟器的是不切实际的假设,它产生的误导性结果与简单模拟器一样严重,因此,引擎本身的能力并不如你是否真正配置了它来反映真实情况重要。
执行的重要性取决于你的策略
执行差异通常是分歧的主要来源,特别是对于像剥头皮或高频系统这类短周期策略,其中精确到跳动(tick)的入场时机会切实改变结果。对于持仓数小时或数天的慢速系统,主要问题可能在于过拟合、机制变化、前瞻偏差或其他本文后文涵盖的因素。这些因素的相对重要性取决于系统的持仓周期、订单类型、换手率以及特定的市场,因此请将执行视为众多潜在原因之一,而不是自动将其视为唯一答案。
Demo Trading Isn’t the Same as Real Execution
这种区别比大多数交易者意识到的要重要得多。在模拟账户上进行前测(Forward testing)可以让策略接触到未见的实时价格和操作条件,这确实很有用,但成交(fills)仍可能是模拟的。模拟环境通常使用其自身的内部假设来模拟成交、滑点、流动性、拒绝和订单优先级,这些环境可能会使用实时价格,但无法复制实盘账户实际经历的执行环境。通常需要进行小规模实盘测试,用真实的资金进行适度规模的交易,以衡量特定经纪商的滑点和执行行为,模拟交易可以近似这些行为,但无法完全复制。
回测中忽略的成本
交易摩擦远不止点差和佣金,令人惊讶的是,许多回测完全忽略了其中的几项。
除了显而易见的点差和佣金,实盘结果可能因外汇隔夜持仓产生的隔夜利息(rollover)或掉期费用(swap charges)、保证金利息、股票借贷费用以及空头头寸的难借限制、股息调整、交易所费用、数据馈送订阅成本和平台费用而产生差异。这些都不是异类,而是实际运行策略时的常规成本,然而,如果回测仅围绕点差和固定佣金估算进行,可能会大幅低估真实的交易成本,尤其是对于持仓过夜或交易有借贷限制工具的策略。
回测中内置的滑点假设(如果存在的话)往往也过于乐观。增加几个固定的点数作为粗略估计,可能在平静的交易时段近似了滑点,但在快速波动的时段则会严重低估它。一个合理的修正方法是将滑点建模为一个范围而非固定数值,在已知的波动窗口和新闻发布前后设定较宽的范围,在平静且流动性好的时段设定较窄的范围。
可能使结果看起来比实际更好看的回测偏差
除了执行和成本差距外,几种众所周知的偏差可能会使历史表现看起来比任何实盘策略实际能达到的表现都要强。
| 偏差 | 其作用 |
| 未来函数偏差(Look-ahead bias) | 使用了交易时并不存在的信息 |
| 生存者偏差(Survivorship bias) | 仅测试目前仍然存在的工具/品种 |
| 数据挖掘偏差(Data snooping) | 反复搜索直到偶然出现的模式看起来具有显著性 |
| 选择偏差(Selection bias) | 在看到结果后选择有利的市场或时期 |
| 成交逻辑错误 | 假设订单在实盘流动性可能不支持的情况下仍能成交 |
| 公司行为错误 | 在数据中错误处理拆股、股息或退市 |
| 时区错误 | K线、交易时段或新闻时间戳对齐错误 |
任何一个偏差都可能在交易者察觉不到的情况下悄悄夸大回测结果,因为从表面上看,净值曲线依然看起来干净且合理。特别是未来函数偏差很容易在无意中引入,例如使用全天的数据计算指标,然后测试时却假设该值在当天开始时就已知。在信任标题数据之前,值得对照此列表检查你自己的回测逻辑。
市场机制变化
即使是一个在完美数据基础上构建、并考虑了所有偏差的完美执行的回测,也面临着最后一个问题:它所测试的市场并不是你现在正在交易的市场。
每一次回测都是针对特定的历史时期进行的,而那个时期有其自身的特征,无论是趋势行情还是震荡行情,是剧烈波动还是平稳运行,或者是特定的宏观环境。一个针对该机制调优的策略在条件转变后可能会表现不佳,而市场确实会发生转变,有时是渐进的,有时是突发的。例如,一个通过强趋势年份的回测的趋势追踪策略,其表现优异可能更多归功于那一年本身,而非策略本身的优势。这并不完全是回测的缺陷。这是利用过去进行测试以预测尚未发生的未来的真实局限性。
过拟合与参数不稳定
一个相关且更隐蔽的问题是过拟合,即策略规则被如此精确地针对历史数据进行调优,以至于它们捕捉的是该特定时期的噪声,而非真正的、可重复的优势。一个过拟合的策略在回测中可能看起来非常出色,但在实盘中几乎会立即崩溃,因为正是那种使其看起来表现良好的特殊性,实际上成为了问题所在。
参数不稳定性是它的近亲。如果对策略参数进行微小的改变(例如略微不同的移动平均线长度或略微不同的止损距离)就会产生截然不同的回测结果,那么这种不稳定性就是一个警告信号。一个真正稳健的优势往往能在微小的参数调整下表现得相当好。如果稍微调整一个设置就会导致崩溃,那么它很可能是拟合了特定的历史噪声,而非真实的、可重复的模式。
仓位规模与市场影响
如果你只测试过小规模交易,这是一个很容易被完全忽视的因素:一个策略在小规模时可能与回测高度吻合,但随着规模增加,表现会明显恶化。
大多数回测都假设在显示的报价下具有无限流动性,即在报价水平上立即成交任何规模的订单。但在实际市场中,一旦你的订单规模相对于可用流动性显著增加,情况就会发生变化。较大的订单可能会消耗多个价格水平,而不仅仅是成交于单一价格,或者需要更长的成交时间,或者以某种方式向市场暴露其存在,从而在订单完成前导致价格向不利于你的方向移动。这对于交易频率高且流动性薄弱的品种尤为重要,因为即使是头寸规模的微小增加,也可能开始侵蚀小型回测从未考虑过的优势。容量(Capacity)——即策略在表现下降之前能够吸收多少规模——应该与策略的核心逻辑分开进行测试,而不是假设它能永远线性扩展。
人为干预
即使是完全自动化的策略也并非完全没有人为因素,而这个差距经常被忽视。
交易摩擦包括在真实资金面临真实回撤时的心理不适,这可能会诱使交易者进行干预、暂停系统,或在回撤过程中调整参数,而这些行为在纯粹、无情绪的回测运行中是永远不会发生的。回测完全不包含这个变量,因为当数据在几个月前就已经发生时,不存在产生反应的心理不适。即使是自动化交易,通常也会有人在观察,而那个人可能会在压力下通过偏离策略来悄悄破坏策略的优势。我也曾经历过这种情况,看着实盘净值曲线跌破了回测显示的正常回撤水平,并感到一种想要“为了安全起见”而关闭系统的冲动。在进入情绪化时刻之前,预先设定好何时才真正需要暂停或覆盖规则,是应对这种现象最可靠的防御手段。
分阶段验证框架
回测、样本外测试、前向行走测试、模拟前向测试以及小资金实盘测试并不是可以互换的步骤,它们各自回答不同的问题。如果直接从回测跳到全额实盘规模,就会完全跳过其中的好几个步骤。
| 阶段 | 目的 |
| 样本内回测 | 开发假设 |
| 样本外测试 | 检查其是否能推广到未见数据 |
| 前向行走测试 | 测试随时间推移的重复重新校准 |
| 模拟前向测试 | 实时验证逻辑和运行稳定性 |
| 小规模实盘部署 | 衡量实际成交、滑点、费用和经纪商行为 |
| 规模化部署 | 仅在实盘假设保持稳定后增加规模 |
每个阶段的存在是因为前一个阶段无法回答下一个问题。样本内回测告诉你该假设值得追求,但它不能告诉你是否具有泛化能力,而这正是样本外测试和前向行走测试的任务。模拟交易验证了逻辑的运行情况,但它无法衡量你特定经纪商的真实滑点,而这正是小规模实盘部署的任务。跳过阶段并不能节省时间,反而会将问题的发现推迟到修复成本更高的时刻。
如何衡量差距是否可以接受
与其期望实盘结果与回测完全一致,或者在出现分歧时感到恐慌,不如将实盘表现与一个范围进行比较,而不是单一的线条。
在回测和实盘之间进行跟踪和比较的有用指标包括:交易次数差异、成交率差异、平均滑点、平均点差、期望值、利润因子、胜率、平均盈亏规模、最大回撤、交易持续时间、错过信号率以及订单拒绝率。将实盘结果与置信区间进行比较,而不是单一的回测线。跟踪实盘交易频率、平均成本、期望值和回撤是否仍处于样本外测试和蒙特卡洛测试产生的分布范围内,而不是期望它们完全匹配某一个特定的历史曲线。
为什么蒙特卡洛分析在此处有所帮助
单次回测会产生一个特定的交易序列,且顺序固定。蒙特卡洛模拟通过反复重新洗牌该交易序列,或在多次运行中改变成本假设,可以产生一系列合理的可能结果,而非单一结果。这很重要,因为许多交易者误将单一的历史交易序列视为预期的未来净值路径,而实际上,该序列仅仅是策略可能采取的众多路径之一。如果实盘结果落在蒙特卡洛分析认为正常的范围内,则说明策略运行符合预期,即使它们与原始回测曲线并非点对点完全匹配。
诊断特定差距
如果你在实盘交易中看到特定的症状,在假设整个策略失效之前,这里有一个缩小可能原因的起点。
| 实盘交易中的症状 | 可能的原因 | 测试内容 |
| 交易次数少于回测 | 数据馈送或信号时间差异 | 比较时间戳和输入数据 |
| 入场价格变差 | 滑点或延迟 | 记录决策价格和成交价格 |
| 限价单很少成交 | 不切实际的回测成交逻辑 | 模型触及与成交概率对比 |
| 回撤更深 | 成本低估或机制变化 | 在计算实际成本后重新计算期望值 |
| 表现立即崩溃 | 过拟合或未来函数泄露 | 重新运行样本外测试 |
| 随着规模扩大,结果恶化 | 市场冲击或流动性限制 | 测试更小的规模和深度 |
| 模拟运行正常,实盘失败 | 模拟成交或特定经纪商执行 | 运行一个小额实盘账户 |
| 人工修改损害表现 | 人为干预 | 预定义暂停和覆盖规则 |
值得保留的执行日志
为了真正收集此表所要求的数据,记录每笔交易并附带足够的细节以重建发生的过程是非常有帮助的。一份有用的日志应追踪信号时间戳(确认策略实际行动的时间)、预期入场价(作为衡量滑点的基准)、提交的订单类型、成交时间戳(用于衡量延迟)、成交价格(用于衡量执行成本)、提交时的点差(以捕捉市场状况)、订单状态(包括任何拒绝或部分成交)、使用的经纪商或交易场所、策略版本(因为比较不同代码版本之间的结果会使分析变得混乱),以及当时大盘机制的说明。这些都不需要复杂的软件。每笔交易后更新一份电子表格即可,它能将模糊的“实盘感觉不对”转化为实际的、可诊断的模式。
常见问题
回测与实盘结果之间的差异在什么范围内属于正常?
没有统一的标准数字,因为这取决于策略、市场以及回测对真实情况的建模精细程度。与其期待完全一致,不如将实盘交易频率、平均成本、期望值和回撤与样本外测试及蒙特卡洛测试所产生的范围进行比较,而不是仅对比单一的历史权益曲线。如果差异超出了该预期范围且无法解释,那才是真正的警示信号,而不仅仅是微小的差距。
回测能否完全预测实盘表现?
不能,无论回测构建得多么精细,都不应期望能做到这一点。回测是针对过去测试一个假设,而实盘交易则是针对尚未发生的条件展开,包括未来的新闻、流动性变化以及特定经纪商的执行特性。一个好的回测目标不是完美的预测,而是通过合理的建模估算,并结合阶段性验证、样本外测试、模拟交易和小型实盘部署,从而捕捉到历史测试无法发现的问题。
自动化交易是否比手动交易更能缩小回测与实盘结果之间的差距?
部分可以,但不能完全消除。自动化消除了执行时的手动输入延迟和情绪犹豫,这确实有所帮助。但它无法消除滑点、数据质量问题、规模扩大后的容量限制,也无法消除市场环境自回测期间发生变化的风险。此外,在压力巨大的回撤期间,监管人员仍可能暂停或修改自动化系统,这又重新引入了回测从未建模的人为因素。
我是否应该怀疑显示出极强表现的回测结果?
不应直接怀疑,但应将异常强劲的结果视为需要深入观察的理由,而非立即庆祝。极强的表现有时是前瞻性偏差、生存者偏差、数据窥探或不切实际的成交假设的迹象,而非真正的优势。请检查成本是否经过了现实建模,测试是否跨越了多个市场周期,以及微小的参数变化是否会导致结果崩溃,因为这种不稳定性通常指向过拟合而非可重复的模式。
为什么策略在模拟账户上有效,但在实盘账户上失败?
这通常归因于执行而非逻辑。模拟环境通常使用其内部假设来模拟成交、滑点和订单优先级,这可能与特定经纪商在实盘账户上的实际成交方式有显著差异。策略的决策逻辑可能完全符合预期,但仅仅是因为在模拟环境下成交情况比实盘更好。进行小规模实盘测试(即使是极小规模)通常是衡量实际经纪商执行行为的唯一可靠方法。
最终检查清单
在信任回测并进行大规模实盘交易之前,值得运行以下简短清单:
- 数据质量和缺口是否已检查?
- 成交和成本是否经过了现实建模,而非假设为即时且免费?
- 策略是否经过了样本外测试以及跨越多个市场周期的测试?
- 参数稳定性是否已检查?
- 在规模增加时,容量是否已与逻辑分开进行测试?
- 是否通过模拟运行验证了操作稳定性?
- 在扩大规模之前,是否通过小规模实盘部署测量了实际经纪商的执行情况?
这些都不能保证策略在实盘中表现完全一致。但这意味着,如果之后出现任何差距,你可以利用上表进行实际诊断,而不是只能靠猜测。
回测和前测是研究工具,而非未来表现的保证。无论建模多么精细,历史结果永远无法保证策略在实盘市场中的表现,且市场状况可能会发生变化,从而使之前可靠的优势失效。请使用你可以承受损失的资金进行交易,并将每一次回测视为通过分阶段测试进行验证的初始假设,而非最终结论。

Petko Aleksandrov


