滑点模型构建:从理论到实战
滑点,说白了就是你想买的时候,价格已经跳上去了。我刚开始做高频交易那会儿,总觉得滑点是个小问题,直到有一次回测跑得漂漂亮亮,实盘一上去直接亏了三个点——嗯,从那以后我再也不敢小看滑点了。
滑点的定义与分类
滑点(Slippage)是指预期成交价格与实际成交价格之间的差异。你想想看,当你下单的那一刻,市场可能已经发生了变化。尤其是大单,一进去就把价格打穿了。
我个人习惯把滑点分成三类:
- 市场冲击滑点:你的订单本身影响了市场价格。比如你买100万股,直接把卖单吃光了,价格自然往上跳。
- 延迟滑点:从信号产生到订单到达交易所这段时间内,价格发生了变动。网络延迟、系统处理时间都会造成这个。
- 流动性滑点:买卖盘口深度不够,你的订单只能部分成交,剩下的部分以更差的价格成交。
核心观点:滑点不是随机噪声,它是可建模、可预测的。忽略滑点的策略,实盘必死。
基于成交量的滑点模型:Almgren-Chriss模型
这个模型是我在实盘中最常用的。Almgren-Chriss模型,业内也叫AC模型,它把滑点拆成了两部分:
- 永久性冲击:你的交易改变了市场供需平衡,这个影响不会消失。
- 暂时性冲击:你的交易造成的瞬时价格偏离,过一会儿会恢复。
公式长这样:
永久冲击 = γ * σ * (Q / V)^(1/2)
暂时冲击 = η * σ * (Q / V)^(3/2)
其中:
Q = 你的交易量
V = 市场总成交量
σ = 波动率
γ, η = 经验参数
我在项目中遇到过一个问题:参数γ和η怎么定?直接套用论文里的值肯定不行。我的做法是拿历史数据做回归,把实际滑点对(Q/V)做拟合。不同品种的参数差异很大,比如沪深300的γ大概在0.1左右,而一些小盘股能到0.5以上。
实战技巧:如果你没有足够的数据做回归,可以用一个保守的初始值:γ=0.2, η=0.1。然后根据实盘表现逐步调整。
基于波动率的滑点模型
波动率大的时候,滑点自然就大。这个道理很直观,但怎么量化呢?
我个人比较喜欢用这个简化模型:
滑点 = α * σ * √(T) + β * spread
其中:
σ = 当前波动率(用5分钟收益率计算)
T = 订单执行时间(分钟)
spread = 当前买卖价差
α, β = 经验系数
为什么用5分钟收益率?因为太短了噪声大,太长了反应不够灵敏。这是我试了十几种窗口长度后得出的结论。
还有一种更精细的做法——把波动率拆成日内模式。你想想看,开盘和收盘的波动率明显比中午高。我习惯用30分钟为一个窗口,计算每个时间段的波动率系数,然后做一张日内波动率曲线表:
| 时间段 | 波动率系数 | 典型滑点(bp) |
|---|---|---|
| 9:30-10:00 | 1.8 | 3-5 |
| 10:00-11:30 | 1.0 | 1-2 |
| 13:00-14:00 | 0.8 | 1-2 |
| 14:00-15:00 | 1.5 | 2-4 |
曾经踩过的坑:我曾经直接用日波动率来算滑点,结果发现午盘时段的滑点被严重高估。后来改成日内分段波动率,误差直接降了一半。记住,波动率不是一成不变的,它有自己的生物钟。
两种模型的融合使用
在实际系统中,我不会只用一种模型。我的做法是:
- 大单(超过日均成交量5%):以Almgren-Chriss模型为主,因为它考虑了市场冲击的持续性
- 小单(低于日均成交量1%):以波动率模型为主,因为市场冲击可以忽略
- 中间情况:两个模型加权平均,权重根据订单大小动态调整
下面这张图展示了滑点模型的核心逻辑:
你看,整个流程其实不复杂。关键是要根据订单大小动态选择模型,而不是一刀切。我见过太多人用一个固定滑点比例跑回测,结果实盘被市场教育得服服帖帖。
最后说一句:滑点模型不是一次建好就完事的。市场在变,参数在变,你的模型也得跟着变。我每周都会重新校准一次参数,用最近30天的数据做滚动回归。这样做虽然麻烦,但值得。
公众号:蓝海资料掘金营,微信deep3321