量化概念 18:实盘与回测的差距(滑点、成交不了、容量)
回测年化 30%,实盘跑一年可能只剩一半。一类原因是策略本身的问题——过拟合、因子失效;另一类更物理,是 回测的成交假设在实盘里不成立。回测里"想买就买、想卖就卖、成交价就是信号价",实盘里每一条都要打折扣。滑点、成交不了、容量,是回测到实盘之间的三座山。
回测的成交假设
回测引擎要撮合,必须先定假设。常见的口径是:T 日收盘出信号,T+1 开盘价成交,不设滑点、不限流动性。这个口径在回测里干净利落,但它隐藏了三个实盘必然发生的偏差。我自己的回测引擎滑点默认也是 0——回测做完了,要自己记得把这个假设拆掉。
差距一:成交价——滑点
回测假设 T+1 开盘价成交,实盘里你的委托很难正好成交在开盘价。开盘后价格立刻跳动,单子要排队、要穿透,成交价往往比开盘价差一点——这就是 滑点(slippage)。
滑点有多普遍?高开抢筹的票,挂开盘价买,可能排在别人后面,追到更高价;低开恐慌的票,挂开盘价卖,可能只成交一部分。日频策略一年换手几十次,每笔滑 0.1%–0.3%,一年就是几个百分点,直接吃掉超额收益的大头。
差距二:成交不了——涨停买不进,跌停卖不出
回测里"有信号就成交",实盘里有些时刻根本成交不了。
一字涨停:开盘就封在涨停价,买单排在几千手之后,大概率轮不到你——回测里这笔买入已经算进去了。一字跌停相反,卖单砸不出去。还有停牌:信号出了,股票停牌,复牌后走势早已变化。
更要命的是,好信号往往正是最买不进的时候:信号好意味着大家都在买,涨停的概率更高。回测默认成交,等于把最赚钱的那几笔当成全都买到了。

差距三:容量——资金一大,收益就摊薄
回测里买多少都不影响价格,实盘里大资金买入本身就是冲击。容量(capacity)指一个策略在不显著抬高成本的前提下,能承载的资金上限。
例子:一只日均成交额 5000 万的小盘股,买 50 万,占日成交的 1%,冲击成本约 0.5%;买到 250 万(占 5%),冲击成本可能到 1.5%;再往上,你的单子自己就把价格推高了——回测假设的那个"开盘价"根本不存在。回测年化 30% 的策略,可能只装得下几百万资金,规模再大,收益被冲击成本吃掉大半。

怎么在回测里预留这些差距
- **加滑点 **:撮合时给成交价加固定滑点(比如每笔 0.1%–0.2%),或者用"开盘价 ± 滑点"保守成交
- 成交率打折:涨停、跌停、停牌日不算成交,或按历史成交概率打折
- **估容量 **:持仓股按日均成交额排序,单票买入控制在日成交的 1%–2% 以内,超出就剔除
- 小资金先跑:回测通过后,用小资金实盘跑几个月,实际滑点和冲击成本会修正回测的乐观
常见误区
- 把滑点设成 0 觉得"干净":不是干净,是把实盘最大的成本藏起来了
- 用开盘价成交却忽略一字板:涨停买不进的那几笔,往往正是收益的大头
- 以为容量是以后的事:小资金阶段验证不了容量,等资金大了才发现装不下
- 把回测收益直接当实盘预期:先扣滑点、扣冲击、打折成交率,剩下的才是能拿到的
- 实盘比回测差就怪市场:先检查回测假设是不是过于理想——差距多数在这里,不在运气
小结
回测和实盘的差距,本质是成交假设的理想化:滑点让成交价变差,涨停跌停停牌让成交不了,容量让大资金买不动。回测里这三样都是"默认不存在",实盘里每一样都在发生。做法反过来:回测时主动加上滑点、打折成交率、估算容量,把最坏的情况先算进去。回测数字减去这些假设的水分,才是实盘真正能拿到的。
寒蝉 Hancic


