滑点度量与建模:从理论到实战

做配对交易这些年,我踩过最大的坑就是滑点。说实话,很多策略在回测里跑得漂漂亮亮,一上实盘就变脸,十有八九是滑点没算对。今天咱们就来聊聊滑点的度量与建模,把这块硬骨头啃下来。

滑点的数学定义:信号价格 vs 实现价格

先问个问题:你下单时看到的价格,和你实际成交的价格,是一回事吗?

当然不是。这中间的差值,就是滑点。

用数学语言说:

滑点 = 实现价格 - 信号价格

信号价格,就是你策略发出交易指令时参考的价格。比如你的配对模型告诉你,价差偏离了2个标准差,该开仓了,这时候的价差对应的价格就是信号价格。

实现价格,是订单真正成交的价格。这中间有网络延迟、订单排队、市场冲击……各种因素。

我习惯把滑点分成两类:

  • 正向滑点:实现价格比信号价格更有利(比如买入时成交价更低)
  • 负向滑点:实现价格比信号价格更不利(这是常态)

嗯,这里要注意:滑点不一定是坏事。但做配对交易,我们通常假设它是成本,所以默认按负向处理。

核心公式:实际收益率 = 理论收益率 - 滑点成本

这个公式我每次做回测都会贴在屏幕旁边,提醒自己别太乐观。

滑点的统计分布:正态分布?别天真了

很多人一开始假设滑点服从正态分布。为什么?因为方便啊,均值方差一算,蒙特卡洛模拟走起。

但我在实盘中发现,滑点分布有个特点:厚尾

什么意思?就是极端值出现的概率,比正态分布预测的要高得多。比如某天市场突然闪崩,你的滑点可能是平时的10倍。正态分布会说这种事几乎不可能发生,但做交易的人都知道,这种事隔三差五就来一次。

我给大家看个对比:

分布类型 特征 对交易的影响
正态分布 对称、薄尾 低估极端滑点风险
厚尾分布(如t分布) 尖峰、厚尾 更符合实际,但参数估计难
混合分布 多个正态叠加 能拟合不同市场状态

我个人习惯用t分布来建模滑点。自由度设低一点(比如3-5),尾部就够厚了。你想想看,如果滑点真是正态分布,那做配对交易也太简单了——可惜现实不是。

实战技巧:用历史数据的95%分位数来估算最坏情况下的滑点,比用标准差靠谱得多。

使用历史数据估算滑点

理论讲完了,来点干货。怎么用历史数据算滑点?我介绍两种最常用的方法。

Roll's Spread:一个经典但有限的方法

Roll在1984年提出的方法,思路很巧妙:利用价格序列的自协方差来估算有效价差。

公式长这样:

Roll's Spread = 2 * sqrt(-Cov(ΔP_t, ΔP_{t-1}))

其中ΔP是价格变化。如果协方差为负,说明价格在来回震荡,价差就大。

我曾经用这个方法算过沪深300成分股的滑点,结果发现:

  • 流动性好的股票,Roll's Spread大概在0.01%-0.05%之间
  • 小盘股就惨了,能到0.3%以上

但这个方法有个硬伤:它假设市场是有效的,而且没有考虑订单流方向。说白了,它算的是「平均」滑点,不是「你实际要付」的滑点。

避坑指南:Roll's Spread在协方差为正时无法计算(开根号里是负数)。我曾经遇到这种情况,一开始还以为代码写错了,后来才发现是数据频率太低导致的。

Effective Spread:更贴近实战

Effective Spread是我现在主要用的方法。它直接比较成交价和买卖报价的中点:

Effective Spread = 2 * |成交价 - 买卖中点|

为什么乘以2?因为这是双边成本。你买入时付了溢价,卖出时又付了折价,一来一回就是两倍。

用Python实现很简单:

import pandas as pd
import numpy as np

def calc_effective_spread(trades, quotes):
    """
    trades: 成交数据,包含price, time
    quotes: 报价数据,包含bid, ask, time
    """
    # 对齐时间
    merged = pd.merge_asof(trades, quotes, on='time')
    
    # 计算买卖中点
    merged['mid'] = (merged['bid'] + merged['ask']) / 2
    
    # 有效价差
    merged['eff_spread'] = 2 * np.abs(merged['price'] - merged['mid'])
    
    return merged['eff_spread'].mean()

这段代码我用了好几年,核心就三步:对齐时间、算中点、算价差。简单但有效。

实际使用时,我建议按时间段分组计算。比如:

  • 开盘半小时滑点通常最大,单独算
  • 盘中流动性好,滑点小
  • 收盘前又变大

这样分段建模,比用一个平均值要精确得多。

我的经验值:对于A股配对交易,Effective Spread通常在0.02%-0.15%之间。如果你回测时假设滑点是0.01%,那实盘大概率要亏钱。

知识体系总览

说了这么多,咱们用一张图把滑点度量的知识串起来:

滑点度量与建模知识体系 滑点 = 实现价格 - 信号价格 统计分布:厚尾特征 > 正态分布 Roll's Spread 基于价格自协方差 Effective Spread 基于成交价与买卖中点 实战应用 分段建模 · 厚尾处理 · 压力测试 从定义到分布,从估算到实战,环环相扣

这张图把滑点度量的四个层次串起来了。从上到下,从理论到实战。你每次做回测前,可以对照着检查一下:定义搞清楚了没?分布用对了没?估算方法选合适了没?

最后说一句:滑点建模没有银弹。不同市场、不同品种、不同时间段,滑点特征都不一样。我的建议是,多试几种方法,找到最适合你策略的那一种。

小贴士:做配对交易时,我习惯把滑点成本直接加到价差阈值里。比如理论阈值是2个标准差,加上滑点后变成2.1个。这样虽然少了几次交易机会,但实盘表现稳得多。

好了,滑点的度量与建模就聊到这儿。记住一句话:回测里忽略滑点,实盘里就会流泪。这是我用真金白银换来的教训。