3、市场微观结构:订单簿深度、流动性分析、滑点模型
做TWAP算法,说白了就是在跟市场微观结构打交道。
我刚开始接触这个领域时,觉得只要把大单拆成小单,按时发送就行了。结果第一次实盘就被市场狠狠教育了一顿——订单簿深度不够,滑点直接吃掉了我一半的预期收益。嗯,从那以后,我再也不敢忽视微观结构了。
3.1 订单簿深度:你的对手盘在哪里?
订单簿(Order Book)是市场的实时快照。它告诉你:
- 谁想买,出什么价,买多少
- 谁想卖,要什么价,卖多少
我个人习惯把订单簿分成三层来看:
| 层级 | 深度范围 | 典型特征 |
|---|---|---|
| 表层 | 盘口1-5档 | 流动性好,但容易被吃掉 |
| 中层 | 盘口6-20档 | 真实挂单,反映市场意图 |
| 深层 | 20档以外 | 可能有冰山订单,需谨慎 |
为什么表层流动性不可靠?因为很多做市商会在这里挂虚假订单,引诱你入场。我在项目中遇到过好几次,明明看到买一有100个BTC,结果我这边一卖,那100个瞬间撤单了——这就是典型的“钓鱼单”。
核心指标:订单簿斜率
斜率 = (价格变化) / (累计深度变化)
斜率越大,说明越容易滑点。我一般设定斜率超过0.3就暂停TWAP执行。
3.2 流动性分析:别被表面数据骗了
很多人只看“24小时成交量”来判断流动性。其实这远远不够。
你想想看,一个交易对如果大部分成交量来自机器人对倒,那它的真实流动性可能只有表面数据的十分之一。我建议从三个维度评估:
- 价差宽度:买卖价差越小,流动性越好。BTC/USDT通常只有0.01%的价差,但一些小币种可能高达1%以上。
- 深度衰减速度:从盘口第1档到第10档,深度下降得越快,说明市场越脆弱。
- 订单簿恢复时间:一个大单吃掉后,订单簿多久能恢复原状?恢复越快,流动性越好。
我的经验公式
有效流动性 = 盘口前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之前,先花30秒扫一眼订单簿深度和价差。如果深度不够或者价差太大,直接放弃执行——这是我在亏了六位数之后才学会的教训。
公众号:蓝海资料掘金营,微信deep3321