深度图解析:深度图的构建、累积深度曲线、买卖压力指标
好,咱们接着聊订单簿深度。上一章我们讲了原始数据长什么样,这一章,我们来动手把它变成一张能看懂、能分析的图——深度图。
说实话,我刚入行那会儿,盯着订单簿的原始数据看,眼睛都快瞎了。几千条买单卖单堆在一起,根本看不出市场到底在哪个位置有支撑、哪个位置有阻力。后来我师父甩给我一张深度图,我一看就明白了——原来数据可视化这么重要。
一、深度图的构建:从原始数据到可视化
深度图,说白了就是把订单簿里的限价单,按价格从低到高(或从高到低)排列,然后累加成交量,画成一条曲线。
构建过程其实很简单,就三步:
- 提取数据:从订单簿的快照中拿到所有买单和卖单的
[价格, 数量]对。 - 排序:买单按价格从高到低排(因为买单是出价,越高的越优先成交),卖单按价格从低到高排。
- 累积:从最优价格开始,依次累加每个价格档位的成交量。
我习惯用Python来做这件事,代码大概长这样:
import pandas as pd
import numpy as np
def build_depth(bids, asks, levels=100):
"""
bids: [[price, volume], ...] 买单数据
asks: [[price, volume], ...] 卖单数据
"""
# 买单:从高到低排序,累积成交量
bids_sorted = sorted(bids, key=lambda x: -x[0])
bid_prices = [b[0] for b in bids_sorted[:levels]]
bid_volumes = np.cumsum([b[1] for b in bids_sorted[:levels]])
# 卖单:从低到高排序,累积成交量
asks_sorted = sorted(asks, key=lambda x: x[0])
ask_prices = [a[0] for a in asks_sorted[:levels]]
ask_volumes = np.cumsum([a[1] for a in asks_sorted[:levels]])
return bid_prices, bid_volumes, ask_prices, ask_volumes
嗯,这里要注意一点:深度图的横轴是价格,纵轴是累积成交量。买单曲线从左到右是价格递减,卖单曲线从左到右是价格递增。两条曲线在中间交汇的地方,就是当前的市场价格。
关键点:深度图的形状直接反映了市场的流动性分布。陡峭的区域说明流动性差,一点点成交量就能把价格推得很远;平缓的区域说明流动性好,大单也能被消化。
二、累积深度曲线:看穿市场的真实厚度
累积深度曲线,其实就是深度图本身。但我想强调一个更实用的用法——按固定金额或固定数量来切分。
举个例子。你想想看,如果你要买入100个BTC,你不能只看最优卖单的价格。你得把从最优卖单开始,一直到能凑够100个BTC的所有卖单都吃掉。这个过程中,平均成交价是多少?滑点有多大?
这就是累积深度曲线的价值所在。我们可以这样算:
def calc_market_impact(ask_prices, ask_volumes, target_volume):
"""
计算买入 target_volume 的市场冲击成本
"""
cum_volume = 0
total_cost = 0
for price, vol in zip(ask_prices, ask_volumes):
if cum_volume + vol <= target_volume:
total_cost += price * vol
cum_volume += vol
else:
remaining = target_volume - cum_volume
total_cost += price * remaining
cum_volume = target_volume
break
avg_price = total_cost / target_volume
impact = (avg_price / ask_prices[0] - 1) * 100 # 百分比
return avg_price, impact
我在做高频做市商策略时,经常用这个函数来估算订单簿的「真实深度」。有时候表面上看卖单挂了很多,但仔细一算,大部分都是散户的几手小单,真正的大单藏在后面。累积曲线能帮你把这些「虚胖」的流动性过滤掉。
我的小技巧:我习惯把累积深度曲线画成「百分比形式」——横轴显示价格偏离当前价的百分比,纵轴显示累积成交量。这样不同价格的品种之间可以直接对比。
三、买卖压力指标:量化多空力量对比
光看图还不够,我们需要一个数字来量化「现在买方强还是卖方强」。这就是买卖压力指标。
最常用的指标有两个:
| 指标名称 | 计算公式 | 含义 |
|---|---|---|
| 订单簿不平衡 (OBI) | (买盘总量 - 卖盘总量) / (买盘总量 + 卖盘总量) | 正值表示买方占优,负值表示卖方占优 |
| 深度加权压力 (DWP) | ∑(买价×买量) / ∑(卖价×卖量) | 考虑了价格权重,更精确 |
我个人更常用的是深度加权压力。为什么?因为OBI太容易被操纵了。我曾经见过一个做市商,在卖单侧挂了一大堆小单,把OBI指标拉得很低,诱导散户做空,然后他偷偷在下面吃单。如果你只看OBI,就被骗了。
DWP的计算方式考虑了价格因素——同样数量的买单,挂在靠近市价的位置,权重更高;挂在远离市价的位置,权重更低。这样更真实。
def depth_weighted_pressure(bids, asks, depth=10):
"""
计算深度加权买卖压力
"""
# 取前depth档
top_bids = sorted(bids, key=lambda x: -x[0])[:depth]
top_asks = sorted(asks, key=lambda x: x[0])[:depth]
bid_pressure = sum(p * v for p, v in top_bids)
ask_pressure = sum(p * v for p, v in top_asks)
return bid_pressure / ask_pressure if ask_pressure != 0 else None
避坑指南:我曾经在回测中直接用DWP指标做交易信号,结果发现它在横盘震荡市里频繁假信号。后来我加了一个阈值——只有当DWP大于1.05或小于0.95时才触发交易,效果好了很多。记住,任何单一指标都有局限性。
四、一张图看懂本章知识体系
下面这张SVG图,把深度图的核心逻辑串起来了:
你看,从原始数据到深度图,再到累积曲线和压力指标,其实是一个层层递进的过程。我刚开始做的时候,总想一步到位,直接拿指标去跑策略,结果吃了不少亏。后来才明白,先把图看明白,再谈量化指标,这才是正确的路径。
总结一下:深度图是订单簿的「X光片」,累积深度曲线是「CT扫描」,买卖压力指标是「诊断报告」。三者结合,你才能对市场的流动性状况有一个完整的判断。
好了,这一章就到这里。下一章我们会聊一个更实战的话题——如何用深度数据预测短期价格走势。到时候我会分享一些我踩过的坑和总结的经验。
公众号:蓝海资料掘金营,微信deep3321