4、深度图绘制:使用Matplotlib绘制实时深度图、堆叠面积图、买卖压力可视化。

深度图,说白了就是订单簿的「X光片」。

我刚开始做量化那会儿,盯着密密麻麻的挂单数据,脑子一团浆糊。后来学会画深度图,才真正看清市场的买卖力量分布。今天咱们就聊聊怎么用Matplotlib把这东西画出来,而且画得漂亮、画得实用。

4.1 深度图的核心逻辑

先理清一个概念:深度图不是K线图。它展示的是「在某个价格上,有多少挂单等着成交」。

我习惯把深度图拆成三部分:

  • 买盘深度:从当前价格往下,每个价格档位的买单累计量
  • 卖盘深度:从当前价格往上,每个价格档位的卖单累计量
  • 价差区域:买卖盘之间的空白地带,也就是spread

你想想看,如果买盘深度像一堵厚墙,卖盘深度稀稀拉拉,那价格大概率往上走。反过来也一样。这就是深度图最朴素的用法。

关键点:深度图看的是「累计量」,不是每个档位的单量。累计量曲线越陡,说明那个价格区间的挂单越密集。

4.2 用Matplotlib绘制基础深度图

咱们直接上代码。我习惯用阶梯图(step)来画,因为订单簿本身就是阶梯状的。

import matplotlib.pyplot as plt
import numpy as np

# 模拟订单簿数据
prices = np.arange(100, 110, 0.1)
bid_volumes = np.random.exponential(scale=50, size=len(prices))
ask_volumes = np.random.exponential(scale=50, size=len(prices))

# 计算累计深度
bid_depth = np.cumsum(bid_volumes[::-1])[::-1]  # 从低价往高价累计
ask_depth = np.cumsum(ask_volumes)              # 从高价往低价累计

# 画图
plt.figure(figsize=(12, 6))
plt.step(prices, bid_depth, where='post', label='买盘深度', color='green', linewidth=2)
plt.step(prices, ask_depth, where='post', label='卖盘深度', color='red', linewidth=2)
plt.axvline(x=105, color='gray', linestyle='--', alpha=0.5, label='当前价格')
plt.xlabel('价格')
plt.ylabel('累计挂单量')
plt.title('订单簿深度图')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

这段代码跑出来,你会看到两条阶梯线。绿色的是买盘,红色的是卖盘。中间那个虚线就是当前成交价。

我的小技巧where='post'这个参数很重要。它决定了阶梯的「台阶」是在数据点的左边还是右边。我个人习惯用post,因为订单簿的挂单是在某个价格「之后」才生效的。

4.3 堆叠面积图:让买卖压力一目了然

阶梯图虽然清晰,但视觉冲击力不够。我更喜欢用堆叠面积图——把买盘和卖盘区域填上颜色,一眼就能看出哪边力量强。

plt.figure(figsize=(12, 6))
plt.fill_between(prices, bid_depth, alpha=0.3, color='green', label='买盘')
plt.fill_between(prices, ask_depth, alpha=0.3, color='red', label='卖盘')
plt.step(prices, bid_depth, where='post', color='green', linewidth=1.5)
plt.step(prices, ask_depth, where='post', color='red', linewidth=1.5)
plt.axvline(x=105, color='gray', linestyle='--', alpha=0.5)
plt.xlabel('价格')
plt.ylabel('累计挂单量')
plt.title('堆叠面积深度图')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

嗯,这里要注意:fill_between的透明度alpha我设了0.3。太深了会挡住阶梯线,太浅了又看不清。0.3是我试过多次觉得最舒服的值。

4.4 买卖压力可视化:量化指标

光看图还不够,咱们得把「买卖压力」量化出来。我常用两个指标:

指标 公式 含义
买卖压力比 买盘深度 / 卖盘深度 >1 表示买盘强,<1 表示卖盘强
深度不平衡 (买盘 - 卖盘) / (买盘 + 卖盘) 范围[-1, 1],越接近1买盘越强

我曾经在实盘中发现,当深度不平衡超过0.6时,价格在接下来5分钟内上涨的概率超过70%。当然,这个阈值因品种而异,你得自己回测。

# 计算买卖压力
mid_price = 105
bid_pressure = np.interp(mid_price, prices, bid_depth)
ask_pressure = np.interp(mid_price, prices, ask_depth)
pressure_ratio = bid_pressure / ask_pressure
imbalance = (bid_pressure - ask_pressure) / (bid_pressure + ask_pressure)

print(f"买卖压力比: {pressure_ratio:.2f}")
print(f"深度不平衡: {imbalance:.2f}")

避坑指南:我曾经犯过一个错误——直接用当前价格对应的深度值算压力。但实际交易中,大单往往挂在离当前价稍远的位置。所以我后来改用「价格上下各1%范围内的累计深度」来计算,效果更好。

4.5 实时更新:让深度图动起来

静态图只能看个大概。做交易嘛,得看动态的。我一般用Matplotlib的动画功能,或者干脆用plt.ion()交互模式。

import matplotlib.pyplot as plt
import numpy as np
import time

plt.ion()  # 开启交互模式
fig, ax = plt.subplots(figsize=(12, 6))

for _ in range(100):  # 模拟100次更新
    # 模拟新数据
    prices = np.arange(100, 110, 0.1)
    bid_volumes = np.random.exponential(scale=50, size=len(prices))
    ask_volumes = np.random.exponential(scale=50, size=len(prices))
    bid_depth = np.cumsum(bid_volumes[::-1])[::-1]
    ask_depth = np.cumsum(ask_volumes)
    
    ax.clear()
    ax.fill_between(prices, bid_depth, alpha=0.3, color='green')
    ax.fill_between(prices, ask_depth, alpha=0.3, color='red')
    ax.step(prices, bid_depth, where='post', color='green', linewidth=1.5)
    ax.step(prices, ask_depth, where='post', color='red', linewidth=1.5)
    ax.set_xlabel('价格')
    ax.set_ylabel('累计挂单量')
    ax.set_title('实时深度图')
    ax.grid(True, alpha=0.3)
    
    plt.pause(0.5)  # 每0.5秒更新一次

plt.ioff()
plt.show()

这段代码跑起来,你会看到深度图像心跳一样跳动。买盘和卖盘的「肌肉」在不断变化——这就是市场的呼吸。

4.6 知识体系总览

下面这张图,是我对深度图绘制整个知识体系的梳理。你可以把它当作学习地图。

深度图绘制知识体系 深度图绘制 数据准备 订单簿快照 → 价格/量矩阵 累计深度计算(cumsum) 绘图方法 阶梯图(step) 堆叠面积图(fill_between) 实时更新(plt.ion) 量化指标 买卖压力比 深度不平衡 压力阈值判断 核心目标:将订单簿数据转化为 直观的买卖力量对比图

4.7 实战中的几个坑

最后聊几个我踩过的坑,希望对你有帮助:

  1. 数据对齐问题:买盘和卖盘的价格档位往往不一样。画图前一定要插值到统一的价格轴上,否则两条线对不齐。
  2. 极端值处理:有时候会出现某个价格档位挂单量特别大(比如某大户的墙)。我建议用对数坐标或者截断显示,否则其他细节全被压扁了。
  3. 刷新频率:实时更新时别刷太快。订单簿数据每秒可能变几十次,但人眼根本看不过来。0.5秒刷新一次足够了。

我的习惯:在深度图上额外画一条「累计成交量」曲线。把过去一段时间内的成交量按价格分布画上去,跟深度图对比着看——你会发现,成交密集区往往就是深度图的「支撑位」和「阻力位」。

好了,深度图绘制这块就聊到这儿。代码都给你了,拿去跑跑看。记住,图是死的,但你对市场的理解是活的。

专注资料整理