6、订单簿深度:深度图的构建、深度指标、深度与市场冲击成本
说到订单簿深度,我脑子里第一个蹦出来的画面,就是那个像峡谷一样的深度图。很多人看盘只看价格K线,其实深度图才是真正反映市场「底气」的东西。说白了,深度就是市场能吃掉多少单子而不让价格剧烈波动。
深度图的构建:把订单簿可视化
深度图其实不复杂。就是把买单和卖单的累积量,按价格画成两条曲线。左边是买单,右边是卖单,中间那个尖尖的地方就是当前市价。
我习惯用Python来画这个图。代码其实很直接:
import matplotlib.pyplot as plt
import numpy as np
# 假设我们从交易所拿到了订单簿快照
bids = [(100.0, 500), (99.9, 800), (99.8, 1200), (99.7, 2000)] # (价格, 数量)
asks = [(100.1, 600), (100.2, 900), (100.3, 1500), (100.4, 2500)]
# 计算累积深度
bid_prices, bid_volumes = zip(*bids)
bid_cumsum = np.cumsum(bid_volumes[::-1])[::-1] # 从高价往低价累积
ask_prices, ask_volumes = zip(*asks)
ask_cumsum = np.cumsum(ask_volumes) # 从低价往高价累积
# 画图
plt.figure(figsize=(10, 6))
plt.step(bid_prices, bid_cumsum, where='post', label='买单深度', color='green')
plt.step(ask_prices, ask_cumsum, where='post', label='卖单深度', color='red')
plt.axvline(x=100.0, color='gray', linestyle='--', alpha=0.5)
plt.xlabel('价格')
plt.ylabel('累积数量')
plt.title('订单簿深度图')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
嗯,这里要注意一点。实际生产环境中,订单簿的数据量可能很大,尤其是高频行情。我建议用增量更新的方式,而不是每次都全量重绘。我在做回测系统时就踩过这个坑——全量重绘导致性能瓶颈,后来改成只更新变化的部分,速度提升了十几倍。
核心要点:深度图的斜率越陡,说明该价格区间流动性越差。斜率越平缓,说明流动性越好。说白了,平缓的曲线意味着「大单子砸进去,价格波动小」。
深度指标:量化市场的「厚度」
光看图不够,我们还需要量化指标。我个人常用的深度指标有这么几个:
- 市场深度(Market Depth):某个价格区间内的总挂单量。比如买一到买五的总量。
- 深度比率(Depth Ratio):买单深度 / 卖单深度。大于1说明买方力量强,小于1说明卖方占优。
- 价格冲击系数(Price Impact Coefficient):每成交一定数量,价格移动的幅度。
- 订单簿不平衡(Order Book Imbalance):最近几档的买卖量之差。
举个例子,我在监控一个山寨币的深度时,发现它的深度比率突然从1.2掉到0.6。我当时就觉得不对劲,果然几分钟后价格暴跌。你想想看,深度比率其实是个领先指标,比价格本身反应更快。
| 指标名称 | 计算公式 | 含义 |
|---|---|---|
| 市场深度 | ∑(价格档位 × 数量) | 衡量市场能承受的订单规模 |
| 深度比率 | 买盘深度 / 卖盘深度 | 买卖力量对比 |
| 价格冲击系数 | Δ价格 / 成交量 | 每单位成交量的价格影响 |
| 订单簿不平衡 | (买量 - 卖量) / (买量 + 卖量) | 短期方向性信号 |
实战技巧:我一般会同时监控多个时间尺度的深度指标。比如1秒级的微观深度变化,和1分钟级的宏观深度趋势。两者结合,能过滤掉很多噪音。
深度与市场冲击成本
市场冲击成本,说白了就是你下单时「推」动价格的那部分成本。深度越浅,冲击成本越高。这个道理很直观——你想买100个比特币,但卖一只有10个,那你只能一路往上吃,把价格越推越高。
冲击成本的计算公式其实不复杂:
def calculate_impact_cost(order_book, side, quantity):
"""
计算买入或卖出的市场冲击成本
side: 'buy' 或 'sell'
"""
if side == 'buy':
levels = order_book['asks']
else:
levels = order_book['bids']
remaining = quantity
total_cost = 0
avg_price = 0
for price, volume in levels:
if remaining <= 0:
break
trade_volume = min(remaining, volume)
total_cost += trade_volume * price
remaining -= trade_volume
if quantity > 0:
avg_price = total_cost / quantity
# 冲击成本 = (实际成交均价 - 当前市价) / 当前市价
current_price = order_book['mid_price']
impact_cost = (avg_price - current_price) / current_price
return impact_cost * 100 # 返回百分比
我曾经在实盘中发现一个有趣的现象:有些交易对在深度图上看起来流动性不错,但实际冲击成本却很高。为什么?因为那些深度是「虚假深度」——很多挂单是机器人挂的,你一吃它就撤单。这就是所谓的「幽灵流动性」。
避坑指南:不要只看深度图表面的数字。我曾经因为轻信深度数据,在一个看似流动性很好的交易所下了大单,结果成交均价比预期高了0.3%。后来我学乖了,一定要用「吃单测试」来验证真实深度——小批量下单,观察实际成交价格和滑点。
深度图的实战应用
深度图不只是好看,它有很多实战用途:
- 识别支撑阻力位:深度图上买单密集区就是支撑,卖单密集区就是阻力。
- 判断市场情绪:深度比率持续偏离1,说明市场情绪在积累。
- 大单交易策略:根据深度分布,把大单拆分成小单,减少冲击成本。
- 套利机会识别:不同交易所的深度差异,可能带来套利空间。
我个人最常用的是第三种。比如我要买入100个ETH,我不会直接挂一个市价单。我会先看深度图,找到流动性最好的价格区间,然后拆成10-20个小单,每个单子只吃深度最好的那几档。这样冲击成本能降低50%以上。
最后说一句,深度分析不是万能的。有些市场深度很好,但价格照样剧烈波动——比如重大消息发布时,所有挂单瞬间撤光,深度图直接「塌方」。所以深度指标要结合其他信息一起看,别迷信单一指标。
总结一下:深度图是订单簿的可视化表达,深度指标是量化工具,冲击成本是实际交易中必须考虑的因素。三者结合,才能做出更好的交易决策。