回测约 9 分钟

手续费和滑点会让回测结果改变多少?

手续费、价差和滑点都可能改变回测结论。本文说明如何各计一次、怎样公平比较不同假设,以及如何正确理解结果。

核心观点: 交易成本假设应写进模型和报告;比较时要透明、每个成本只计一次,并把敏感性分析视为条件分析,而不是对未来执行情况的预测。 标签: 回测 · 交易成本 · 滑点

本文仅供教育用途,不构成投资建议、交易推荐或行情预测。示例仅用于说明;市场状况和执行结果可能不同。

一列抽象色块依次穿过三道几何闸门,间距随之改变。
不同的摩擦成本假设会改变模型结果;此图为概念示意。

回测结果看上去可能很整齐,直到交易成本出现:一列是毛结果,另一列扣除费用,最后一行给出剩余部分。计算本身也许没有错,但结论仍可能很脆弱,因为当模型中的优势很窄时,价差或滑点稍有变化就可能产生影响。

真正有用的问题不是回测要不要计入成本,而是它计入了哪些成本、如何应用这些成本,以及结果在多大程度上依赖这些选择。成本模型描述的是模拟过程中的假设,不是实际经纪商的成交单据。

报价就代表成交了吗?

历史K线可以呈现价格变化,却无法显示订单执行的所有细节。市价单通常追求成交,而不保证价格。美国金融业监管局 FINRA 解释过,实际成交价可能与下单时看到的报价不同,尤其是在价格快速变化或存在延迟时。如果回测把每个信号价都当成可成交价格,它其实已经作出了执行假设,只是报告没有明说。

因此,成本不只是最后统一扣掉的一项数字。所选入场价、出场价、下单时点和成本口径都会影响模拟结果。美国的订单执行披露会区分报价价差、有效价差和实现价差;美国证交会 SEC 的 Rule 605 材料将有效价差与订单收到时的中间价联系起来。这些术语有助于精确比较执行情况,但不会让基于K线的模拟变成对某个交易者实际成交的还原。

每种成本只命名和计算一次

先列出测试实际建模的成本组成。不同市场和品种的费用表与计算口径并不相同,所以仅用“交易成本”这样的统称,可能掩盖更多信息。每项成本只放在一个地方,并说明它是按单边、每笔订单,还是按完整往返交易计算。

  • 显性费用:佣金、交易场所收费或服务方收取的其他金额。写清计量单位,以及是否同时包含进场和出场费用。
  • 价差:可成交买价与卖价之间的差额。说明模拟成交是否已经跨过价差,还是另行扣除了价差成本。
  • 滑点:假设成交价与选定参考价或成交假设之间的差异。定义参考价,并说明测量的是哪个时点或事件。
  • 市场冲击或其他持仓成本:只有在与研究问题相关时才纳入,并说明市场冲击是否已经包含在滑点或实施差额估算里。

记账规则很简单:同一项摩擦成本不要扣两遍。如果入场已按卖价建模、出场已按买价建模,那么部分价差成本可能已经反映在价格里。再扣一次完整价差可能会高估成本。反过来,如果成交价按K线中间价模拟,之后再扣手续费也不会让这个价格假设变得真实。先定义成交口径,再补上该口径尚未涵盖的成本。

先搭建公平的比较,再做计算

有用的成本比较会改变一项明确说明的假设,同时让测试其余部分保持清晰。这样,审阅者就能看出结论取决于正在研究的规则、数据,还是附加的执行模型。之后需要修正时,也更容易留下记录。

  • 固定观察事件集合和规则版本。比较成本假设时,不要悄悄改变哪些观察被纳入。
  • 写清单位。说明品种或抽象单位、规模口径、单边或往返交易成本,以及部分成交或未成交订单的处理方式。
  • 拆分毛结果与净结果。保留扣成本前的结果,再按声明的口径展示每项成本和扣除成本后的结果。
  • 根据理由选择基准和替代情景。有可用的费用资料或执行记录时就使用;如果数字只是探索性假设,应明确说明,别称其为典型值。
  • 一致地应用成本。纳入亏损与盈利的观察,并说明缺失价格、被拒订单以及本来不会成交的交易如何处理。

目标不是找到一个完美的滑点数字,而是说明一个有依据的假设变化后,结果会怎样变化。如果结论只在很窄的一种设定下看起来有利,这种依赖性应写在主要结论中,而不是藏在读者可能看不到的注释里。

一个假设性的往返交易计算

来看一个刻意设定的假设例子:20笔抽象的往返交易,每笔模拟毛结果平均为15美元,总计300美元。假设每笔的费用为2美元、价差为4美元、滑点为5美元。按照这个口径,每笔模拟成本为11美元,总成本220美元,模拟净结果为80美元。

现在只改变假设滑点:从每笔5美元提高到9美元。每笔模拟成本增至15美元,总成本300美元,模拟净结果变为零。底层价格历史没有任何变化。这个练习展示了汇总结果对执行成本输入有多敏感。这里的数字都是为演示算术而虚构的,并非市场数据、成本估计或交易建议。

把敏感性分析当作问题,而不是预测

只要有明确理由,一组假设通常比单一点估计更有信息量。低成本、基准成本和较高成本情景可以显示结果在哪些条件下发生实质变化。除非按置信区间的方式构建并解释,否则这些情景不是置信区间,也不代表未来成本发生的概率。

  • 每次改变一个成本组成,观察哪种假设对结果影响最大。
  • 如果多个成本有合理理由可能同时变化,再测试组合情景;说明它们之间的关系,不要把互不相关的极端情况简单叠加。
  • 在有帮助时,除了总额还可报告净结果、离散程度、回撤、换手或受影响观察数量;不同指标回答不同问题。
  • 在每个数字旁写明理由。如果它只是教学占位数,而非观测得到的估计值,就应明确标注。

单变量敏感性尤其适合查找模型里的盈亏平衡假设:在某种成本水平下,选定的汇总结果改变符号或失去某项属性。这只是模型内部的一条界线,不能说明预计会支付的最高成本,也不是证明某个方法适合任何人的门槛。

计入成本的回测仍然无法告诉你什么

基于K线的回测无法还原排队位置、精确订单簿、延迟,也看不到每笔交易在单根K线内部经历的完整路径。即使滑点模型说明得很清楚,它仍是简化。实际执行会随订单类型、规模、流动性、交易场所、时点和市场状况而变化。模型可能遗漏其中一些因素,也可能只能粗略表示它们。

这些限制不是省略成本的理由,而是说明模型范围并比较替代假设的理由。经过成本调整的历史或模拟结果取决于所用的数据、规则与执行假设。它不能说明未来下单会花费多少,也不能保证方法在另一组样本里仍会有相同表现。

另一类研究也提醒我们注意这一点。Novy-Marx 和 Velikov 对已发表的股票市场异象进行研究,发现交易成本会改变其样本中一些策略的盈利性判断,换手较高的想法面临更高的成本门槛。这只说明他们研究的论文和假设,不是适用于所有市场、产品或交易方法的普遍成本估计。

一个实用的下一步

把成本模型整理成简短的审计记录:列出成交口径,命名每一项成本,说明单位,展示基准与替代情景,并把毛结果和净结果放在一起。这样,其他人可以复算,并看出哪些假设还需要更多证据。

DayTradeDrill 的手动回测流程允许学习者在练习中设置价差、手续费和滑点假设。这些输入是训练假设;回放不是经纪商成交模型,也不能确定实际执行成本。以这种边界使用回放,可以帮助把假设呈现出来,而不把模拟结果说成对未来表现的判断。

好的回测报告未必拥有最复杂的成本引擎;它应该让假设易于检查、让每项摩擦只计算一次,并展示假设变化后结论如何改变。净结果固然重要,模型得到这个结果的过程也同样重要。

参考资料与延伸阅读