2026年八月25日 · 研究

你的回测有 100 笔交易,为什么平均成交价还是个猜测?

你的回测有 100 笔交易,为什么平均成交价还是个猜测?

100 笔交易。0.04% 的 taker 费率。0.02% 的滑点假设。这些数字会让回测看起来有据可依,但最让人意外的是最后一个:单一的滑点率几乎说明不了你的订单能否以那些价格成交。

滑点取决于你交易什么、何时交易,以及订单规模相对于当时可用流动性有多大。基于 K 线构建的回测,通常只能粗略了解前两项,对第三项则一无所知。如果把平均成交价当成事实,策略得到的执行记录可能是它根本不曾实现过的。

为什么 OHLCV 无法告诉我平均成交价?

一根 K 线记录的是某个时间区间内的价格范围和总成交量,但它不会告诉你成交量如何分布在不同价格上、最佳买价和卖价上挂了多少量,也不会说明你的订单是在打出这根 K 线最低价的交易之前还是之后到达的。某个低价只由一笔小额交易打出,和低价处有持续成交量承接,在 OHLC 数据里看起来完全一样。

设想一根 1 分钟 K 线的成交额为 $200,000,你要以市价买入 $50,000。这笔订单相当于该 K 线成交额的 25%。这并不能证明它会让市场价格变动 25%,也不能证明它能按 K 线开盘价成交。但这说明,相对于该 K 线的成交量,订单规模已经大到足以让人怀疑零冲击假设。如果同一笔订单仅占成交量的 0.2%,顾虑就小一些,不过光凭成交量仍然看不出订单簿深度或流动性补充情况。

所以,“滑点是 2 个基点”是模型设定,而不是某个交易品种本身的属性。它可以作为有用的基准,但不能当作放之四海而皆准的答案。

如何用 K 线数据估算市场冲击?

先从数据能够支持的尺度入手。对每笔订单,计算参与率:订单名义金额除以该 K 线的成交名义金额。然后观察策略结果在不同参与率区间下如何变化。下面是一个刻意简化的示例;其中的冲击值是压力测试输入,并非对某个交易场所执行情况的估算。

订单 / K 线名义金额单边冲击示例值需要思考的问题
0.2%1 bp价差和 taker 费率是否已经高于这个数?
2%5 bp扩大价差、降低成交速度后,策略优势还能维持吗?
20%25 bp这么高的参与率本身会改变价格走势吗?

1 个基点等于 0.01%。如果策略在买入和卖出方向各有 $100,000 的换手量,那么双边各 5 bp 的冲击,往返成本约为 $100,尚未计入费用。这个算术很简单;要判断 5 bp 是否合理,则需要更多证据。如果你的信号恰好在成交量飙升时交易,用整根 K 线的成交量作分母,甚至可能让参与率显得比订单实际到达那几分钟里的情况更安全。

滑点压力测试应包含哪些内容?

不要把执行不确定性藏进一个全组合平均值里。让会影响结果的各个维度清晰可见:

至少运行基准情景和更严苛的情景。例如,将假设的价差和市场冲击加倍,再检查哪些交易和时段造成了变化。如果策略只有在最平静、最容易成交的情况下才有效,这是一个研究发现。最好在模拟交易前就发现这一点。

将费用、价差和市场冲击分开列示。费用取决于账户的费率表;价差和冲击则取决于执行方式。把它们合在一起,就看不出究竟是哪项假设在支撑结果。

什么时候需要订单簿数据?

如果策略优势与价差相当、交易频繁,或依赖短暂出现的流动性,就应使用成交和报价数据。如果队列位置、部分成交或订单簿被吃空会决定信号能否执行,就应使用深度快照或事件级订单簿数据。即便如此,历史回放也无法完美重现你自己的市场冲击;记录下来的市场流动性并未包含你假设中的订单。

对于较慢的策略,K 线数据仍然可以用来筛选想法。让持仓规模相对于观察到的成交量保持较小,披露你假设的冲击曲线,并测试合理幅度的变化是否会抹去策略收益。这是粗略成交模型的一种站得住脚的用法。把它称为精确的平均成交价就不合适了。

实际目标不是猜出唯一正确的滑点数值,而是找出策略从何时开始失去意义,再看你的数据和订单规模是否让你离那条界线足够远。如果不是,下一项有用的研究工作就是获取更好的执行数据,而不是在回测报告里再多加一位小数。

市场冲击滑点执行回测流动性
← 全部文章