11. 深度可视化:订单簿热力图、深度曲线图、三维深度曲面

做量化交易这些年,我越来越觉得:数据是死的,但可视化能让数据活过来

订单簿数据,说白了就是一堆价格和挂单量的组合。你盯着Excel表格看,眼睛看花了也看不出门道。但一旦画成图,市场的呼吸感就出来了。

今天咱们聊聊三种最实用的深度可视化方法:热力图、深度曲线图、三维深度曲面。这三种图,我几乎每天都会用。

11.1 订单簿热力图:一眼看穿资金博弈

热力图这东西,说白了就是把订单簿的挂单量用颜色深浅表示出来。红色越深,说明这个价位堆积的资金越多。

我个人的习惯用法:把买盘和卖盘分开,用冷暖色调对比。买盘用蓝色系,卖盘用红色系。这样一眼就能看出多空双方在哪些价位上重兵把守。

核心逻辑:热力图能直观展示「价格-挂单量-时间」三个维度的信息。横轴是价格,纵轴是时间(或订单簿层级),颜色深浅代表挂单量大小。

我在项目中遇到过这样一个场景:某只股票在10:30突然出现一个深红色的竖条,横跨好几个价位。我立刻意识到——有大资金在扫货。后来果然拉了一波行情。

热力图的关键参数

  • 颜色映射:建议用对数刻度,否则大单会把小单的颜色压得看不见
  • 时间窗口:我一般用5分钟滑动窗口,太短噪声大,太长反应迟钝
  • 层级深度:至少显示20档,太浅看不到全貌

小技巧:热力图配合K线图一起看效果最好。上面K线,下面热力图,能看出价格变动背后的资金推动力。

11.2 深度曲线图:市场的「供需曲线」

深度曲线图,其实就是把订单簿的累计挂单量画成一条曲线。买盘从低到高累计,卖盘从高到低累计,两条曲线在中间交汇。

为什么说它是市场的供需曲线?你想想看:

  • 买盘曲线越陡峭,说明买方在某个价位附近集中挂单,支撑很强
  • 卖盘曲线越陡峭,说明卖方在某个价位附近集中挂单,压力很大
  • 两条曲线之间的「缺口」越大,说明市场流动性越好

我常用的画法

import matplotlib.pyplot as plt
import numpy as np

def plot_depth_curve(bids, asks):
    """
    bids: [(price, volume), ...]  买盘数据
    asks: [(price, volume), ...]  卖盘数据
    """
    # 计算累计挂单量
    bid_prices, bid_volumes = zip(*bids)
    ask_prices, ask_volumes = zip(*asks)
    
    bid_cumsum = np.cumsum(bid_volumes[::-1])[::-1]  # 从高价到低价累计
    ask_cumsum = np.cumsum(ask_volumes)              # 从低价到高价累计
    
    plt.figure(figsize=(12, 6))
    plt.plot(bid_prices, bid_cumsum, 'b-', label='买盘深度', linewidth=2)
    plt.plot(ask_prices, ask_cumsum, 'r-', label='卖盘深度', linewidth=2)
    plt.axvline(x=(bid_prices[-1] + ask_prices[0])/2, 
                color='gray', linestyle='--', label='中间价')
    plt.xlabel('价格')
    plt.ylabel('累计挂单量')
    plt.title('市场深度曲线')
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.show()

我曾经用这个图抓过一次机会。某只币的深度曲线在某个价位突然出现一个「平台」,说明有大单在托底。我果断在那个价位附近建仓,半小时后价格反弹,赚了一波。

避坑指南:深度曲线图有个坑——它只反映当前时刻的挂单情况。有些做市商会故意挂大单制造假象,然后在你进场后撤单。我吃过这个亏,所以现在都会结合逐笔成交数据一起看。

11.3 三维深度曲面:动态的战场地图

如果说热力图是二维的,深度曲线是静态的,那三维深度曲面就是把时间维度加进去,形成一个动态的「价格-时间-挂单量」三维空间。

为什么需要三维曲面?

因为市场是动态的。一个价位上的挂单量可能在几秒钟内变化好几次。二维图只能看到某个瞬间的快照,三维曲面能让你看到整个变化过程。

我常用的构建方法

  1. 每隔1秒采样一次订单簿数据
  2. 把每个时间点的深度曲线堆叠起来
  3. 用三维曲面图展示
from mpl_toolkits.mplot3d import Axes3D

def plot_3d_depth(times, prices, volumes):
    """
    times: 时间点列表
    prices: 价格网格
    volumes: 挂单量矩阵 (len(times) x len(prices))
    """
    fig = plt.figure(figsize=(14, 8))
    ax = fig.add_subplot(111, projection='3d')
    
    T, P = np.meshgrid(times, prices)
    surf = ax.plot_surface(T, P, volumes.T, 
                           cmap='viridis', 
                           alpha=0.8,
                           linewidth=0)
    
    ax.set_xlabel('时间')
    ax.set_ylabel('价格')
    ax.set_zlabel('挂单量')
    ax.set_title('三维深度曲面')
    
    fig.colorbar(surf, shrink=0.5, aspect=5)
    plt.show()

三维曲面的核心价值:它能让你看到「挂单量的演化过程」。比如某个价位上的挂单量突然消失(撤单),或者突然增加(新挂单),在三维图上会形成一个明显的「凹陷」或「凸起」。

我记得有一次做回测,发现某个策略在特定时间段总是亏损。用三维深度曲面一看,原来那个时间段经常有大单在关键价位附近「钓鱼」——先挂大单吸引注意,然后撤单反向操作。三维图上一目了然。

11.4 三种可视化方法的对比

方法 维度 适用场景 优点 缺点
热力图 价格 + 时间 快速识别资金聚集区 直观、信息密度高 颜色映射需要调参
深度曲线图 价格 + 挂单量 分析支撑/压力位 简单、清晰 只能看静态快照
三维深度曲面 价格 + 时间 + 挂单量 分析挂单量演化 信息最完整 计算量大、交互性差

我的建议:日常监控用热力图,做决策时看深度曲线图,做深度研究时用三维曲面。三种图配合使用,效果最好。

11.5 实战中的注意事项

嗯,这里要提醒几个容易踩的坑:

  • 数据频率:高频数据(毫秒级)画三维曲面,数据量太大,我一般降采样到秒级
  • 价格精度:不同交易所的价格精度不一样,画图前要统一精度,否则会出现锯齿
  • 挂单量归一化:不同价位的挂单量差异可能很大,建议做对数变换或归一化处理
  • 交互式探索:静态图只能看个大概,建议用Plotly或Bokeh做交互式图表,可以旋转、缩放、悬停查看数据

进阶技巧:把三维深度曲面做成动画,逐帧播放,能看到挂单量的「流动」过程。我做过一个版本,每秒更新一次,配合交易信号,效果非常震撼。

最后说一句:可视化不是为了好看,是为了发现规律。好的可视化能让你在几秒钟内理解市场状态,而不用盯着数字发呆。这三种方法,建议你都试试,找到最适合自己交易风格的那一种。