滑点模型构建:从理论到实战

滑点,说白了就是你想买的时候,价格已经跳上去了。我刚开始做高频交易那会儿,总觉得滑点是个小问题,直到有一次回测跑得漂漂亮亮,实盘一上去直接亏了三个点——嗯,从那以后我再也不敢小看滑点了。

滑点的定义与分类

滑点(Slippage)是指预期成交价格与实际成交价格之间的差异。你想想看,当你下单的那一刻,市场可能已经发生了变化。尤其是大单,一进去就把价格打穿了。

我个人习惯把滑点分成三类:

  • 市场冲击滑点:你的订单本身影响了市场价格。比如你买100万股,直接把卖单吃光了,价格自然往上跳。
  • 延迟滑点:从信号产生到订单到达交易所这段时间内,价格发生了变动。网络延迟、系统处理时间都会造成这个。
  • 流动性滑点:买卖盘口深度不够,你的订单只能部分成交,剩下的部分以更差的价格成交。

核心观点:滑点不是随机噪声,它是可建模、可预测的。忽略滑点的策略,实盘必死。

基于成交量的滑点模型:Almgren-Chriss模型

这个模型是我在实盘中最常用的。Almgren-Chriss模型,业内也叫AC模型,它把滑点拆成了两部分:

  1. 永久性冲击:你的交易改变了市场供需平衡,这个影响不会消失。
  2. 暂时性冲击:你的交易造成的瞬时价格偏离,过一会儿会恢复。

公式长这样:

永久冲击 = γ * σ * (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%):以波动率模型为主,因为市场冲击可以忽略
  • 中间情况:两个模型加权平均,权重根据订单大小动态调整

下面这张图展示了滑点模型的核心逻辑:

滑点模型构建流程 订单信息 数量、方向、时间 市场数据 成交量、波动率、价差 订单大小? 大单 小单 Almgren-Chriss模型 基于成交量冲击 波动率模型 基于波动率+价差 实时滑点预估 → 订单优化

你看,整个流程其实不复杂。关键是要根据订单大小动态选择模型,而不是一刀切。我见过太多人用一个固定滑点比例跑回测,结果实盘被市场教育得服服帖帖。

最后说一句:滑点模型不是一次建好就完事的。市场在变,参数在变,你的模型也得跟着变。我每周都会重新校准一次参数,用最近30天的数据做滚动回归。这样做虽然麻烦,但值得。


公众号:蓝海资料掘金营,微信deep3321