2026年九月15日 · 研究

你的回测滑点模型,故意设错才更诚实

你的回测滑点模型,故意设错才更诚实

最诚实的滑点模型,往往是刻意设错的。用粗略的历史数据,却在回测中报告一个精确的执行成本,这等于声称数据根本无法支持的结论。

听起来像是在为粗糙的假设辩护,其实恰恰相反:采用一个简单、能解释清楚的模型,然后让它在不同情境下给出不同结果。如果策略只有在某个恰好有利的成交估值下才有效,那么这种不确定性本身就是结果的一部分。

为什么精确的滑点估值会产生误导?

假设你有 1 分钟 OHLCV K 线,并发送一笔买入 2,000 股的市价单。K 线能告诉你这一分钟内的价格区间和总成交量,却无法告诉你订单到达时的买卖报价、排在你前面的队列、成交量在这一分钟内的分布,或你的订单会消耗其中多少流动性。

你仍然可以给滑点设定一个数值。比如按下一根 K 线的开盘价加上固定的基点成本成交,或者根据订单规模与 K 线成交量之比来调整成本。这些都是有用的近似,但它们不是观测值。如果把结果写成“滑点:3.2 个基点”,就会把模型选择包装成测量结果。

来看一个具体例子:某策略每笔订单交易 $20,000,标的是一只下一根 K 线成交额为 $400,000 的股票。参与率为 5%。按 2 个基点收费的模型,每笔订单成本为 $4;按 10 个基点收费的模型,成本则为 $20。500 次完整买卖往返后,两者相差 $16,000,且尚未计入佣金。如果策略回测的毛利润为 $18,000,执行假设的影响几乎和信号本身一样大。

5%订单规模占下一根 K 线成交量的比例
$16,000500 次完整买卖往返中,按 2 个与 10 个基点计费的成本差额

构建反映数据可观测范围的区间

先设定一个基准情境,使之符合策略的订单类型和数据分辨率。市价单需要考虑价差和市场冲击。限价单则需要规定订单是否成交;假设价格只要触及限价就一定成交,是另一种执行误差。

然后,在少数几个明确的情境下运行同一回测。固定信号、仓位规模和时间戳,这样你就能把结果变化归因于执行:

情境执行假设检验内容
有利基准价差,低市场冲击策略对良好交易条件的依赖程度有多高?
基准典型价差,市场冲击随参与率调整当前选定的工作假设会带来怎样的结果?
不利价差更大、市场冲击更高,且成交延迟在合理可能出现的困难市场中,策略优势还能维持吗?

除非经过统计校准,否则这些不是置信区间,而是情境测试。应在报告中说明各情境的含义;如果没有概率依据,也不要把它们平均成一个凭空捏造的“预期滑点”。

让模型随订单变化

对于小额订单,按固定基点收费可以作为合理的初步估算;但随着参与率上升,这种说法就不再可靠。至少要记录订单名义金额、可用的 K 线成交量和参与率。如果策略交易期货,要记录合约价值和相关成交量单位;如果交易现货加密货币,要明确报价币种和交易场所。

简单的市场冲击曲线可以揭示容量压力,而不必假装能还原订单簿。例如,把成本定义为基准价差费用加上一个随参与率平方根增长的市场冲击项。只有在你拥有合适的执行数据时,才拟合曲线参数;否则就调整这些参数,展示结果会多快恶化。

同时,别让成交模型悄悄替策略解围。急剧上涨后才出现的做多信号,不应该仅仅因为价格落在 K 线区间内,就按该 K 线的最低价成交。采用符合因果关系的成交规则,然后对成交价格进行压力测试,并加入延迟。如果订单延迟后错过了行情,那就是执行结果,不是需要平滑掉的噪声。

一个实用的问题是:价差、市场冲击、延迟或参与率达到什么水平时,净收益会降至零?与单一的回测 Sharpe 相比,这个盈亏平衡点往往更能指导行动。

通过模拟交易缩小区间

模拟交易无法揭示你在真实撮合引擎中本来会获得怎样的成交。但它仍能告诉你,回测中的订单流是否符合系统实际作出的决策:何时生成订单、订单规模多大,以及订单在多长时间内仍可执行。

将模拟订单价格与同期报价或模拟系统记录的其他市场数据进行比较。按交易品种、时段、订单规模和订单类型跟踪差距。这些观测可以缩小该设置下的假设范围,但不能自动套用到其他交易场所、市场环境或更大规模的订单。

批评者指出,悲观情境可能是任意设定的,这一点没错。刻意严苛的模型和有利模型一样,都可能扭曲结论:前者会否决可行策略,后者会美化表现薄弱的策略。因此,不要把最严苛的情境奉为真相。公开假设、展示敏感度,并收集所需数据,以便用校准后的估值取代猜测。

回测无法从一根 K 线得知历史上的排队位置。但它可以展示:当执行条件变差,而现有数据又无法排除这些情况时,这个想法是否仍然合理。这比多报一位小数更有用。

滑点市场冲击回测执行模拟交易
← 全部文章