跳到正文

订单簿冲击与事前成本估计

事前成本估计的四个成分,按「能直接算」到「只能建模猜」排一条谱。谱的哪一端在主导你的估计,决定了它可信到什么程度。

第 2 篇 · 共 12 篇 约 11 分钟

你需要买 100000 股。你看簿:卖一 $50.01 上有 5000 股,下一档 $50.03 上 8000 股,第三档 $50.06 上 12000 股。

这要花多少钱?

天真答案:50.01×100000=50.01 × 100000 = 5,001,000,再加扫簿的冲击。聪明答案取决于你用什么模型。事前成本估计就是在承诺之前把这个数猜对的手艺:猜对了,PM 批单、TCA 报告好看;猜错了,要么预算报高单子根本不发生,要么预算报低单子比预期贵。

Harris(2003,第 23 章)把这件事的难处拆得很准:成本估计同时是三个东西的函数——订单簿的当前状态、那个状态在执行期间的预期演化、以及其他市场参与方对你订单的预期响应。第一个可观测,第二个半可测,第三个纯靠模型。这条从”能算”滑向”只能猜”的谱,就是这篇文章的主线:四个成本成分正好按这条谱排开,你的估计有多可信,取决于哪一端在主导。

四个成分,一条谱

标准拆法把总成本分成四块。点差成本:跨簿时付的半点差,可成交单避不开。显示冲击:从最优价往外扫显示层付出的价格让步。隐藏冲击:你的单被探测到、触发隐藏单和知情响应带来的让步。时机成本:执行窗口内的价格漂移。写在一起:

C^=s2⏟点差+∑i(pi−p0)qi⏟显示冲击+IH(Q,V,σ)⏟隐藏冲击+σT⏟时机\hat{C} = \underbrace{\frac{s}{2}}_{\text{点差}} + \underbrace{\sum_i (p_i - p_0) q_i}_{\text{显示冲击}} + \underbrace{I_H(Q, V, \sigma)}_{\text{隐藏冲击}} + \underbrace{\sigma \sqrt{T}}_{\text{时机}}

其中 ss 是点差,pip_i、qiq_i 是第 ii 层的价格和规模,IHI_H 是隐藏冲击函数,QQ 是订单规模,VV 是日成交量,σ\sigma 是波动率,TT 是执行水平期。

注意排列顺序不是随便的:从左往右,可观测性递减。点差直接读得到,显示冲击从簿上算得出,隐藏冲击只能靠标定过的模型,时机成本本质上是个随机变量。下面按这个顺序一个个过。

点差成本:直接读出来

最简单的成分。买单跨卖价成交,付半点差:

Cspread=Ask−Bid2C_{\text{spread}} = \frac{\text{Ask} - \text{Bid}}{2}

开头例子里点差 1 美分,点差成本 0.5 美分每股,整单 $500。

这是即时性的价格,付给挂出内部报价的做市商。它不是浪费——做市商靠提供流动性挣这笔钱——但你想立刻成交,它就不可省。有耐心挂限价单的人可以反过来赚这半个点差,代价是接下时机风险和填不到的风险。这个权衡后面会反复出现。

显示冲击:从簿上算出来

订单比最优价上的显示量大,你就要扫过多层,每往外一档付一次价差。对扫开头那个簿的 100000 股买单:50.01吃5000,50.01 吃 5000,50.03 吃 8000,$50.06 吃 12000,继续往外走。扫过 $n$ 个显示层的总让步是:

Cdisplay=∑i=1nqi(pi−p0)C_{\text{display}} = \sum_{i=1}^{n} q_i (p_i - p_0)

其中 p0p_0 是内部价——你要是能停在第一档会付的价。

簿深度是可观测的,所以这个成分不需要模型,逐层走一遍就行:

def display_impact(buy_size, asks):
    """算扫过显示卖价层的成本。"""
    remaining = buy_size
    total_cost = 0
    for price, size in asks:
        fill = min(remaining, size)
        total_cost += fill * price
        remaining -= fill
        if remaining <= 0:
            break
    avg_price = total_cost / buy_size
    return avg_price - asks[0][0]

100000 股的单在典型流动名字上大约要扫 8–10 层;按合理深度走完,平均填价在 $50.04 附近,显示冲击相对内部价约 3 美分每股。

但”可观测”在这里已经开始打折:你看到的簿是快照,你的单到场时有些层已经没了。现实的估计给每层挂一个成交概率——第一层也许 70% 能全拿到,第二层 50%,第三层 30%,往外递减。谱从这里开始向”猜”倾斜。

隐藏冲击:只能建模猜

隐藏冲击是你的单被探测到之后、其他参与方的响应带来的价格让步。这是四个成分里最不确定的一个,也是模型味最重的一个。

标准模型是 Almgren-Chriss 风格的平方根冲击:

IH=ησQVI_H = \eta \sigma \sqrt{\frac{Q}{V}}

直觉:冲击随订单规模 QQ 增长、随日成交量 VV 减小、随波动率 σ\sigma 增长;平方根意味着订单翻倍冲击只增 2\sqrt{2} 倍。套开头的例子——Q=100,000Q = 100{,}000,V=5,000,000V = 5{,}000{,}000(ADV 500 万股),σ=2%\sigma = 2\%(日),η=0.142\eta = 0.142(一个典型标定):

IH=0.142×0.02×100,0005,000,000=0.142×0.02×0.141=0.0004=4 bpI_H = 0.142 \times 0.02 \times \sqrt{\frac{100{,}000}{5{,}000{,}000}} = 0.142 \times 0.02 \times 0.141 = 0.0004 = 4 \text{ bp}

对 $50 的股价,4 bp 就是 2 美分每股,整单 $2,000。对一笔占 ADV 2% 的流动名字订单,这个量级说得过去。

平方根形式是经验观察,理论动机通常归到信息泄露:你交易得越多泄露越多,但每新增一股泄露的边际信息递减。测过的备选不少——线性冲击(IH=ηQ/VI_H = \eta Q / V)简单但在大规模上对不上数据;幂律冲击(IH=η(Q/V)αI_H = \eta (Q/V)^\alpha)更灵活,α≈0.6\alpha \approx 0.6 拟合一些数据集;Kyle 的 lambda 给出市场特定的单位订单流价格冲击。实操结论:平方根在 Q/V∈[0.001,0.1]Q/V \in [0.001, 0.1](ADV 的 0.1% 到 10%)这个区间管用,出了这个区间要换模型。

时机成本:连模型都只能给分布

最后一个成分不是数,是随机变量。你在 30 分钟里干活、股票日波动率 2%,这 30 分钟内价格变动的标准差(假设零漂移、纯扩散):

σT=σT=0.02×30390≈0.0055=55 bp\sigma_T = \sigma \sqrt{T} = 0.02 \times \sqrt{\frac{30}{390}} \approx 0.0055 = 55 \text{ bp}

而期望的绝对变动是平均绝对偏差:

E[∣r∣]=σT2π≈44 bpE[|r|] = \sigma \sqrt{T} \sqrt{\frac{2}{\pi}} \approx 44 \text{ bp}

也就是说 30 分钟里典型会看到 44 bp 上下的价格波动。时机成本的期望是零——涨跌等概率——但你暴露给的波动幅度是实打实的 44 bp。股票在你买的时候向上走,时机成本为正;向下走,为负。它不是冲击意义上的”成本”,是风险。

风险厌恶的交易员用快速成交压缩这个方差,风险中性的交易员接受方差换更低的冲击。Almgren-Chriss 的最优轨迹(后面讲)就是在这两头之间找平衡。

合起来:一个数,和它的脾气

把四块对开头的例子(100000 股、30 分钟水平期)加总:

成分计算成本(美分/股)
点差0.5 美分0.5
显示冲击扫 8 层3.0
隐藏冲击4 bp × 50.002.0
时机成本期望0(零均值)
总求和5.5 美分/股

约 11 bp 的期望成本;$5M 的单就是 $5,500。

记住这个数的脾气:它是期望,不是实现。实际成本有时低很多(股票在你买时下行),有时高很多(股票跳空向上)。把期望当预测用,是事前估计最常见的误用——正确用法在文章最后。

标定:让模型认你的数据

平方根模型里的参数(η\eta 一类)不能抄行业均值,要标定到你自己的交易模式。标准做法是拿历史成交做回归,实现冲击对预测冲击:

Irealized=α+β⋅Imodel+ϵI_{\text{realized}} = \alpha + \beta \cdot I_{\text{model}} + \epsilon

β≈1\beta \approx 1 且 α≈0\alpha \approx 0,模型标得好。β>1\beta > 1,模型系统性低估;β<1\beta < 1,高估。大多数 shop 发现的模式是:对不太流动的股票低估、对流动的高估——修法是按 ADV(或市值、点差)分桶,每桶单独标定。

def calibrate_impact(trades):
    """把平方根冲击模型拟合到历史成交。"""
    realized = []
    predicted = []
    for trade in trades:
        realized.append(trade.slippage_bps)
        predicted.append(
            trade.volatility * (trade.size / trade.adv) ** 0.5 * 10000
        )
    # OLS 回归:realized = alpha + beta * predicted
    beta = covariance(realized, predicted) / variance(predicted)
    alpha = mean(realized) - beta * mean(predicted)
    return alpha, beta

这是玩具。生产系统用加权回归(近期成交权重更高)、分桶模型、贝叶斯收缩(把极端桶往均值拉)。标定要定期重做——市场在变,参数在漂,每季度一次是常见节奏。

模型错在哪:一张诚实的清单

标定得再好,事前模型还是会错,因为输入本身是噪声。值得挨个认清楚。

簿状态是快照,你的单到时层已增减,每层的成交概率取决于你不确切知道的排队位置。其他参与方会响应:你的单改变簿,他们看到之后的反应取决于他们的模型、库存和信息——这没法精确建模。信息事件会作废一切:事前估计默认执行期间没新闻,新闻一来估计就不相关了。波动率输入是历史的,前向波动率可能完全是另一回事——财报日、FOMC、排期数据都会改它。流动性有日内节奏,10:30 的簿比 12:00 深,用单张快照的估计看不到这个。最后还有自冲击:你之前的单已经移了价,模型不知道你今天在同一个名字上还有别的单。

大多数事前模型处理其中几条,没有模型全处理。诚实的读法:事前估计是预算工具和基线,不是精确预测。

Almgren-Chriss:从成本到轨迹

有了成本结构,就能问下一个问题:给定这些成本,最优的执行节奏是什么?Almgren 和 Chriss(2000)在特定假设下给出了闭式答案:暂时冲击线性(h(v)=η∣v∣h(v) = \eta |v|),永久冲击线性(g(v)=γvg(v) = \gamma v),价格走无漂移的算术随机游走,然后对成本的方差加二次惩罚。从初始仓位 X0X_0 到清零、水平期 TT 的最优轨迹是:

x∗(t)=X0⋅sinh⁡(κ(T−t))sinh⁡(κT)x^*(t) = X_0 \cdot \frac{\sinh(\kappa(T-t))}{\sinh(\kappa T)}

其中 κ=λσ2/η\kappa = \sqrt{\lambda \sigma^2 / \eta},λ\lambda 是风险厌恶参数。

λ\lambda 高(风险厌恶),κ\kappa 大,轨迹前端偏置——快速成交压时机风险。λ\lambda 低(接近风险中性),κ\kappa 小,轨迹趋近线性——匀速成交,平衡冲击和时机。轨迹不唯一,它由风险厌恶参数化,交易员按自己的风险偏好选 λ\lambda。这就是执行算法的数学根基。

放进文献脉络看:Bertsimas 和 Lo(1998)先把最优执行框成动态规划问题,解出的最优策略取决于对价格动态、冲击函数和风险厌恶的信念,一般对时间非线性;Almgren-Chriss 加上方差的二次惩罚换来了闭式解,从此成了执行算法设计的标准参考。后续工作把模型推向多资产(篮子交易)、离散时间与离散量、随机波动率、信息效应(你的单泄露你的信息本身引起的冲击)——每一步推广都用可处理性换真实性。实操上,标定过的简单 Almgren-Chriss 通常就够了。

排队位置:簿没告诉你的那件事

显示簿告诉你每层的价和量,不告诉你你的单在那一层的排队位置。

你在 $50.00 挂 5000 股买单,现有买价上已经有 10000 股——你排在它们后面。显示量看着是你的 5000,但你前面压着 15000 股的队。你的成交概率取决于市场吃掉的量够不够先清掉前面的队。市价单不在乎这个(跨簿直接拿显示量),但对被动挂单,排队位置就是一切:队首高概率成交,队尾几乎不成交。

零售交易员基本忽略排队位置,因为确切知道几乎不可能。高级执行算法会估:按排队位置、时段、最近成交流估计成交概率。实操含义是个两难:touch 上挂太多规模泄露意图,挂太少填不到——最优挂单规模在成交概率和信息泄露之间找平衡,大多数寻流算法内建了这个。

波动率:模型的适用边界

冲击对波动率的依赖写在平方根模型里:

IH=ησQ/VI_H = \eta \sigma \sqrt{Q/V}

波动率翻倍,冲击翻倍。直觉也顺:价格动得快时你的单更显眼,市场响应更强。平静日冲击小、价格快速回复;新闻日冲击大、价格可能不回复。

但线性关系有边界。极端波动率下(闪崩一类),做市商退缩、深度抽薄,小单也能大幅移价,冲击远超线性模型的预测。假设正常波动率的事前模型在这些条件下会大幅低估成本。实操修正:用前向波动率而不是纯历史波动率缩放估计——今天是财报日或美联储公告日,前向波动率就高于尾部均值,用它。

自冲击:模型不知道你自己

一整天在同一只股票上干多笔订单时,每笔的冲击有一部分是你自己之前的单造成的。

早上买 XYZ 50000 股,价格上行 5 美分;下午卖 30000 股,面对的是已经被早上订单移过价的更薄的簿。下午那笔的事前模型不知道早上的事——它按当前状态估计,而当前状态已经吃进了早上的冲击——于是两笔加总的真实冲击被低估。

修法是跟踪自己的成交、相应上调后续估计:今天已经把股票移了 5 美分,下一单的预期冲击就高于模型说的。这是更广的”库存”问题的一角:你在一只股票上的净仓位影响执行成本,多库存让卖容易买难,空库存反过来。忽略库存的事前模型给的是有偏估计。

收盘:另一套定价机制

打算干到收盘竞价里的订单,事前估计要整个换算法,因为收盘竞价是一个有自己价格发现的特殊市场,清算价 16:00 才揭晓。拿最后连续成交价当基准的估计,在竞价成交离那个价很远时会大错。

对意在收盘的单,各成分重新记账:收盘价按不平衡、近期价差、近期成交流估计;点差成本记零(竞价成交不付点差);冲击记零或接近零(收盘竞价冲击低);时机成本按持有期算。但竞价有自己的风险清单——不平衡可以在最后 30 秒翻转,清算价可以离预期很远,大单自己就能移动清算价——所以置信区间要放得比平时宽。

多日执行:两个新账目

订单大到 ADV 的 10% 以上,单日干不完,必须跨日。事前估计要加两个成分:隔夜跳空风险和冲击的跨日残留。

隔夜跳空风险由隔夜波动率刻画。一种粗略的建模是给日波动率乘一个缩放因子:

σovernight=σdaily⋅ρ\sigma_{\text{overnight}} = \sigma_{\text{daily}} \cdot \rho

模型里 ρ\rho 常取 1.5 到 2.0 一类的值,但这个因子随标的和样本变化很大,要自己标定,别当常数背。跨三天干活,累计的隔夜风险已经不可忽略。

冲击残留更微妙。平方根模型假设冲击在日内衰减,但跨日执行时冲击会累积:经验证据显示今天的冲击有相当一部分(量级在几成上下,随市场与样本变化)明天还在。所以多日执行的事前估计应当包含:各日冲击估计之和、累计隔夜跳空风险、冲击残留的调整,再加上策略被跨日探测的惩罚项。加总下来,多日估计通常比同等总规模的单日估计高出几成到一倍。

估计怎么用:交易员的事前工作流

最后把估计放回它真实的位置。买方交易员的典型事前流程:

  1. 从 PM 收单(通过 OMS)。
  2. 看股票当前状态:簿、量、波动、最近新闻。
  3. 从 TCA 拉事前估计(或手动算)。
  4. 对比 PM 预算,超了就 flag。
  5. 选执行策略:VWAP、POV、IS、寻流。
  6. 设参数:参与率、最大冲击、截止时间。
  7. 发给 broker 或直接执行。
  8. 实时对基准跟踪。
  9. 实时成本显著超估计就调整。
  10. 完成后存档,做事后 TCA。

估计只是众多输入之一,交易员的经验和判断通常更重要。但估计是纪律:它是 PM 拿来对账的数,也是评估执行顺不顺利的基线。所以用它的正确姿势是这几条——别只报一个点估计,给区间(比如第 5 到 95 分位),波动名字上 ±30% 是常态,PM 应该知道这一点;模型按季重标;基准按用途选(节奏算法对 VWAP、寻流对到达价、绩效归因对 implementation shortfall);当天有财报、FOMC、排期数据就修正估计。事前估计不精确不是它的失败,把它当精确的才是。

参考文献

  • Harris, L. (2003). Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press. 第 19、23 章。ISBN: 978-0-19-514470-3.
  • Almgren, R., & Chriss, N. (2000). “Optimal Execution of Portfolio Transactions.” Journal of Risk, 3(2), 5-39.
  • Bertsimas, D., & Lo, A. W. (1998). “Optimal Control of Execution Costs.” Journal of Financial Markets, 1(1), 1-50.
  • Perold, A. F. (1988). “The Implementation Shortfall: Paper Versus Reality.” Journal of Portfolio Management, 14(3), 4-9.