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秒采样一次订单簿数据
- 把每个时间点的深度曲线堆叠起来
- 用三维曲面图展示
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做交互式图表,可以旋转、缩放、悬停查看数据
进阶技巧:把三维深度曲面做成动画,逐帧播放,能看到挂单量的「流动」过程。我做过一个版本,每秒更新一次,配合交易信号,效果非常震撼。
最后说一句:可视化不是为了好看,是为了发现规律。好的可视化能让你在几秒钟内理解市场状态,而不用盯着数字发呆。这三种方法,建议你都试试,找到最适合自己交易风格的那一种。