深度图解析:深度图的构建、累积深度曲线、买卖压力指标

好,咱们接着聊订单簿深度。上一章我们讲了原始数据长什么样,这一章,我们来动手把它变成一张能看懂、能分析的图——深度图。

说实话,我刚入行那会儿,盯着订单簿的原始数据看,眼睛都快瞎了。几千条买单卖单堆在一起,根本看不出市场到底在哪个位置有支撑、哪个位置有阻力。后来我师父甩给我一张深度图,我一看就明白了——原来数据可视化这么重要。

一、深度图的构建:从原始数据到可视化

深度图,说白了就是把订单簿里的限价单,按价格从低到高(或从高到低)排列,然后累加成交量,画成一条曲线。

构建过程其实很简单,就三步:

  1. 提取数据:从订单簿的快照中拿到所有买单和卖单的[价格, 数量]对。
  2. 排序:买单按价格从高到低排(因为买单是出价,越高的越优先成交),卖单按价格从低到高排。
  3. 累积:从最优价格开始,依次累加每个价格档位的成交量。

我习惯用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图,把深度图的核心逻辑串起来了:

深度图解析知识体系 深度图构建 提取订单簿数据 按价格排序 累积成交量 累积深度曲线 横轴:价格 纵轴:累积成交量 计算市场冲击成本 买卖压力指标 订单簿不平衡(OBI) 深度加权压力(DWP) 量化多空力量 实际应用场景 订单簿流动性评估 | 交易成本估算 | 做市策略设计 三个模块层层递进:从原始数据 → 可视化曲线 → 量化指标 最终服务于交易决策和风险管理

你看,从原始数据到深度图,再到累积曲线和压力指标,其实是一个层层递进的过程。我刚开始做的时候,总想一步到位,直接拿指标去跑策略,结果吃了不少亏。后来才明白,先把图看明白,再谈量化指标,这才是正确的路径。

总结一下:深度图是订单簿的「X光片」,累积深度曲线是「CT扫描」,买卖压力指标是「诊断报告」。三者结合,你才能对市场的流动性状况有一个完整的判断。

好了,这一章就到这里。下一章我们会聊一个更实战的话题——如何用深度数据预测短期价格走势。到时候我会分享一些我踩过的坑和总结的经验。


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