只用成交价回测永续合约,漏掉强平的最直接原因是:交易所触发强平用的是标记价格,不是最新成交价。你的回测如果只加载了 K 线里的成交价(Last Price),就根本没有复现交易所强平引擎实际监控的那个价格序列。一笔在实盘中会被强平的仓位,在只基于成交价的回测里可能显示"止损正常触发、安全退出",因为成交价没有触及你设定的止损,但标记价格已经跌穿了强平线。
强平看的是标记价格,不是你在图表上看到的成交价
Bybit 的帮助中心对此有明确说明:默认情况下,K 线图显示的是最新成交价(LTP)的历史走势,但强平是由标记价格触发的,不是由最新成交价触发。只有当标记价格达到仓位的强平价格时,强平引擎才会接管。
这制造了一个回测里很难察觉的错位。举例来说(假设案例),你开多,强平价 12,000,止损设在 12,030,止损以成交价为触发参考。实盘中可能出现:标记价格已经跌到 12,000 触发强平,而最新成交价还在 12,050,你的止损根本没被触发。回测如果只看成交价 K 线,会看到价格最低只到 12,050,判定止损未触发、仓位安全,完全漏掉了实盘中已经发生的强平。
CoinAPI 的回测指南把这个问题说得更直白:如果回测仅基于成交价来触发止损或强平,就会错误地建模强平概率。标记价格通常由指数价格衍生,指数价格聚合了多个场所的现货报价;在压力时期,成交价可能过度偏离,标记价格可能滞后或平滑,指数构建会过滤掉薄弱的成交打印。你的回测数据源里如果没有标记价格,就等于用一把错误的尺子去量强平线。
止损触发也不等于仓位被平掉
即便回测里正确判断了止损会被触发,还有一个独立的误差来源:触发止损和完成平仓是两件事。
XTester 的回测分析指出了这个区别。止损触发后,交易所还需要创建并执行一笔平仓订单。止损市价单提交的是市价单,通常能平掉仓位,但成交价取决于订单簿;在剧烈波动中,实际成交价可能远差于止损价。止损限价单则有另一种失败模式:假设触发价 92、卖出限价 91.8,市场从 92.1 直接跳到 89,止损触发了,限价单也挂出去了,但可能没有买家愿意在 91.8 或以上接货,仓位仍然开着。回测如果简单地把"触及止损价"记为"已按止损价成交",就高估了保护性订单的有效性,尤其对使用紧止损和高杠杆的策略,这种假设格外有利。
K 线本身也藏不住顺序信息
一根 OHLC K 线只记录开盘、最高、最低、收盘,不记录这些价格出现的先后顺序。一根一分钟 K 线可以显示市场触及过某个价位,但无法告诉你流动性在那停留了多久、成交了多少量、订单有没有时间成交、以及同一秒内标记价格走到了哪里。当几个相互依赖的事件落进同一根 K 线时,它们发生的顺序需要靠更细的数据或模拟器的规则来还原,而不是由 K 线自动提供。
回测把周期从小时降到分钟,能减少不确定性,但消除不了。对于止损、强平这类执行敏感的机制,至少需要成交价和标记价格两套独立序列。如果连这个条件都不具备,回测报告里那个"止损出场"或"未被强平"的结论,就应该被标记为不确定,而不是被当成可依赖的结果。
回测里应该怎么补
如果你的策略涉及杠杆和强平线,至少要做两件事。第一,拿到标记价格的历史序列,用它来判断强平是否触发,而不是用成交价 K 线的最低/最高点去近似。第二,把"触发"和"成交"分开建模,止损触发后按当时的订单簿深度或一个保守的滑点假设来估算成交价,而不是直接按止损价记账。缺少这两步,回测对高杠杆策略的结果会系统性地偏乐观:它展示的是一个没有标记价格、没有滑点、止损永远能按设定价成交的市场,那个市场在交易所里不存在。



