滑点度量与建模:从理论到实战
做配对交易这些年,我踩过最大的坑就是滑点。说实话,很多策略在回测里跑得漂漂亮亮,一上实盘就变脸,十有八九是滑点没算对。今天咱们就来聊聊滑点的度量与建模,把这块硬骨头啃下来。
滑点的数学定义:信号价格 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%,那实盘大概率要亏钱。
知识体系总览
说了这么多,咱们用一张图把滑点度量的知识串起来:
这张图把滑点度量的四个层次串起来了。从上到下,从理论到实战。你每次做回测前,可以对照着检查一下:定义搞清楚了没?分布用对了没?估算方法选合适了没?
最后说一句:滑点建模没有银弹。不同市场、不同品种、不同时间段,滑点特征都不一样。我的建议是,多试几种方法,找到最适合你策略的那一种。
小贴士:做配对交易时,我习惯把滑点成本直接加到价差阈值里。比如理论阈值是2个标准差,加上滑点后变成2.1个。这样虽然少了几次交易机会,但实盘表现稳得多。
好了,滑点的度量与建模就聊到这儿。记住一句话:回测里忽略滑点,实盘里就会流泪。这是我用真金白银换来的教训。