3、市场微观结构:订单簿深度、流动性分析、滑点模型

做TWAP算法,说白了就是在跟市场微观结构打交道。

我刚开始接触这个领域时,觉得只要把大单拆成小单,按时发送就行了。结果第一次实盘就被市场狠狠教育了一顿——订单簿深度不够,滑点直接吃掉了我一半的预期收益。嗯,从那以后,我再也不敢忽视微观结构了。

3.1 订单簿深度:你的对手盘在哪里?

订单簿(Order Book)是市场的实时快照。它告诉你:

  • 谁想买,出什么价,买多少
  • 谁想卖,要什么价,卖多少

我个人习惯把订单簿分成三层来看:

层级 深度范围 典型特征
表层 盘口1-5档 流动性好,但容易被吃掉
中层 盘口6-20档 真实挂单,反映市场意图
深层 20档以外 可能有冰山订单,需谨慎

为什么表层流动性不可靠?因为很多做市商会在这里挂虚假订单,引诱你入场。我在项目中遇到过好几次,明明看到买一有100个BTC,结果我这边一卖,那100个瞬间撤单了——这就是典型的“钓鱼单”。

核心指标:订单簿斜率

斜率 = (价格变化) / (累计深度变化)

斜率越大,说明越容易滑点。我一般设定斜率超过0.3就暂停TWAP执行。

3.2 流动性分析:别被表面数据骗了

很多人只看“24小时成交量”来判断流动性。其实这远远不够。

你想想看,一个交易对如果大部分成交量来自机器人对倒,那它的真实流动性可能只有表面数据的十分之一。我建议从三个维度评估:

  1. 价差宽度:买卖价差越小,流动性越好。BTC/USDT通常只有0.01%的价差,但一些小币种可能高达1%以上。
  2. 深度衰减速度:从盘口第1档到第10档,深度下降得越快,说明市场越脆弱。
  3. 订单簿恢复时间:一个大单吃掉后,订单簿多久能恢复原状?恢复越快,流动性越好。

我的经验公式

有效流动性 = 盘口前5档深度之和 × 0.7 + 盘口6-10档深度之和 × 0.3

这个公式帮我过滤掉了不少虚假流动性。

我曾经在某个新上线的DEX上做TWAP,表面看深度不错,但实际上一笔5000U的单子就把价格打穿了3%。后来复盘发现,那个交易对的流动性池子只有20万U,而且大部分是项目方自己锁定的——说白了就是假流动性。

3.3 滑点模型:量化你的交易成本

滑点,就是你的预期成交价和实际成交价之间的差值。TWAP的核心目标之一就是控制滑点。

我常用的滑点模型分三部分:

3.3.1 瞬时滑点模型

当你的一笔订单进入市场,它会立即吃掉订单簿上的对手盘。这个滑点可以精确计算:

def calculate_instant_slippage(order_book, side, amount):
    """
    计算瞬时滑点
    :param order_book: 订单簿数据
    :param side: 'buy' 或 'sell'
    :param amount: 交易数量
    :return: 滑点百分比
    """
    levels = order_book['asks'] if side == 'buy' else order_book['bids']
    cumulative = 0
    weighted_price = 0
    
    for level in levels:
        price = level[0]
        volume = level[1]
        
        if cumulative + volume <= amount:
            cumulative += volume
            weighted_price += price * volume
        else:
            remaining = amount - cumulative
            weighted_price += price * remaining
            cumulative = amount
            break
    
    if cumulative < amount:
        raise ValueError("订单簿深度不足")
    
    avg_price = weighted_price / amount
    mid_price = (order_book['asks'][0][0] + order_book['bids'][0][0]) / 2
    
    slippage = abs(avg_price - mid_price) / mid_price
    return slippage

3.3.2 时间滑点模型

TWAP执行过程中,市场价格本身在波动。这部分滑点跟你的执行时长直接相关。

我个人习惯用这个公式估算:

time_slippage = volatility * sqrt(execution_time / 24h)
# 例如:BTC日波动率2%,执行1小时
# time_slippage = 0.02 * sqrt(1/24) ≈ 0.004 = 0.4%

注意:这个公式假设价格波动是随机的。如果遇到趋势行情,实际滑点可能翻倍。

3.3.3 市场冲击模型

这是最容易被忽视的部分。你的订单本身会影响市场价格,尤其是大单。

我常用的模型是Almgren-Chriss的改进版:

market_impact = alpha * (trade_volume / total_volume)^beta
# alpha和beta是经验参数
# 对于BTC,我通常取 alpha=0.1, beta=0.5

举个例子:你想在1小时内交易100个BTC,而该交易对24小时成交量是10000个BTC。

market_impact = 0.1 * (100 / 10000)^0.5
              = 0.1 * 0.1
              = 0.01 = 1%

也就是说,光市场冲击就会带来1%的额外成本。这还没算瞬时滑点和时间滑点。

3.4 综合滑点预估

在实际项目中,我会把三种滑点加起来,得到一个总滑点预估:

滑点类型 预估范围 影响因素
瞬时滑点 0.01% - 0.5% 订单簿深度、订单大小
时间滑点 0.1% - 1.0% 波动率、执行时长
市场冲击 0.05% - 2.0% 相对成交量、市场情绪

实战建议

总滑点预估超过2%时,我建议放弃TWAP,改用VWAP或者干脆等流动性改善后再执行。

3.5 知识体系总览

下面这张图总结了市场微观结构的核心逻辑:

市场微观结构知识体系 订单簿深度 流动性分析 滑点模型 表层/中层/深层分析 订单簿斜率计算 冰山订单识别 价差宽度评估 深度衰减速度 订单簿恢复时间 瞬时滑点计算 时间滑点模型 市场冲击模型 TWAP执行策略 三者共同决定TWAP的执行效果与成本

这张图把三个核心模块串起来了。订单簿深度告诉你“现在能交易多少”,流动性分析告诉你“市场是否可靠”,滑点模型则帮你量化“交易要花多少成本”。三者缺一不可。

一句话总结

做TWAP之前,先花30秒扫一眼订单簿深度和价差。如果深度不够或者价差太大,直接放弃执行——这是我在亏了六位数之后才学会的教训。


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