13、订单流可视化:订单簿热力图、成交量分布图绘制、Delta柱状图、CVD曲线、订单流仪表盘设计
订单流可视化,说白了就是把市场最底层的交易数据,变成你一眼就能看懂的图形。我做了这么多年量化,发现很多策略其实不复杂,但可视化做得好,交易员就愿意用。今天咱们就聊聊,怎么把订单簿、成交量分布、Delta这些核心指标,画成真正能辅助决策的图表。
13.1 订单簿热力图:一眼看穿挂单密度
订单簿热力图,就是把买卖盘口的挂单量,用颜色深浅表示出来。我习惯用蓝色代表买单,红色代表卖单,颜色越深,说明这个价位的挂单越厚。
核心逻辑:热力图能帮你快速识别「价格墙」——那些挂单量异常大的价位,往往是支撑或阻力位。
绘制时,我一般取买卖各20档深度。代码实现其实不复杂:
def plot_orderbook_heatmap(bids, asks, depth=20):
"""
bids: [(price, volume), ...]
asks: [(price, volume), ...]
"""
import matplotlib.pyplot as plt
import numpy as np
# 取前depth档
bids = bids[:depth][::-1] # 买单从高到低排列
asks = asks[:depth]
prices = [b[0] for b in bids] + [a[0] for a in asks]
volumes = [b[1] for b in bids] + [a[1] for a in asks]
sides = ['buy'] * len(bids) + ['sell'] * len(asks)
# 归一化颜色
max_vol = max(volumes)
colors = []
for v, s in zip(volumes, sides):
intensity = v / max_vol
if s == 'buy':
colors.append((0, 0, intensity)) # 蓝色渐变
else:
colors.append((intensity, 0, 0)) # 红色渐变
plt.figure(figsize=(12, 4))
plt.bar(prices, volumes, width=0.5, color=colors, alpha=0.8)
plt.title('订单簿热力图')
plt.xlabel('价格')
plt.ylabel('挂单量')
plt.show()
我的经验:热力图最好做成动态更新的,每秒刷新一次。我曾经遇到过一个场景,某个价位突然出现巨量挂单,但3秒后就撤单了——这就是典型的「虚假订单墙」,用来诱导散户的。
13.2 成交量分布图:找到市场的「价值区域」
成交量分布图(Volume Profile),展示的是每个价格区间在特定时间段内成交了多少。我个人觉得,这是订单流可视化里最有价值的一张图。
绘制时,我习惯把一天分成24个1小时时段,每个时段统计每个价格区间的成交量。嗯,这里要注意:价格区间不能等宽,而应该根据市场波动动态调整。
def volume_profile(trades, price_bins=50):
"""
trades: [(price, volume, timestamp), ...]
"""
import pandas as pd
import numpy as np
df = pd.DataFrame(trades, columns=['price', 'volume', 'ts'])
# 动态分箱:按成交量加权分位数
price_min = df['price'].min()
price_max = df['price'].max()
bins = np.linspace(price_min, price_max, price_bins)
df['price_bin'] = pd.cut(df['price'], bins)
profile = df.groupby('price_bin')['volume'].sum()
return profile
避坑指南:我曾经用等宽分箱画成交量分布,结果在价格波动大的时候,很多区间是空的,看起来像「断崖」。后来改用分位数分箱,效果就好多了。记住:成交量分布图的核心是展示「交易最密集的区域」,不是展示价格分布。
13.3 Delta柱状图:多空力量的实时博弈
Delta柱状图,说白了就是每一笔成交中,主动买单减去主动卖单的累积值。红色柱子代表净卖出(空头占优),绿色柱子代表净买入(多头占优)。
我一般用1分钟K线作为时间窗口,每根K线计算一次Delta值:
def delta_bars(trades, interval='1min'):
"""
计算Delta柱状图数据
"""
import pandas as pd
df = pd.DataFrame(trades, columns=['price', 'volume', 'side', 'ts'])
# side: 'buy' 主动买, 'sell' 主动卖
df['delta'] = df.apply(lambda r: r['volume'] if r['side'] == 'buy' else -r['volume'], axis=1)
df['time'] = pd.to_datetime(df['ts'], unit='s')
# 按时间窗口聚合
delta_bars = df.set_index('time').resample(interval)['delta'].sum()
return delta_bars
关键点:Delta柱状图要和价格走势图叠加看。如果价格上涨但Delta为负(空头主导),说明上涨可能是「虚涨」,随时可能回调。我见过太多人只看价格不看Delta,结果追高被套。
13.4 CVD曲线:累积Delta的「趋势放大器」
CVD(Cumulative Volume Delta)曲线,就是把Delta柱状图累积起来。它比单根Delta柱子更平滑,能更清晰地展示多空力量的长期趋势。
绘制CVD曲线时,我习惯用两条线:一条是原始CVD,一条是它的移动平均线(比如20周期)。当CVD上穿均线时,是买入信号;下穿时,是卖出信号。
def cvd_curve(delta_bars, ma_period=20):
"""
delta_bars: 每根K线的Delta值
"""
import pandas as pd
cvd = delta_bars.cumsum()
cvd_ma = cvd.rolling(window=ma_period).mean()
return cvd, cvd_ma
我的习惯:CVD曲线和价格走势的背离,是很好的交易信号。比如价格创新高,但CVD没创新高,这就是「顶背离」,说明多头力量在衰竭。我曾经靠这个信号躲过好几次大跌。
13.5 订单流仪表盘设计:把一切整合在一起
仪表盘设计,说白了就是把这些图表组合成一个可交互的界面。我一般把仪表盘分成四个区域:
| 区域 | 内容 | 刷新频率 |
|---|---|---|
| 左上 | 订单簿热力图 + 实时深度 | 实时(每秒) |
| 右上 | 成交量分布图(当日) | 每5分钟 |
| 左下 | Delta柱状图 + 价格走势 | 每根K线 |
| 右下 | CVD曲线 + 信号标记 | 每根K线 |
嗯,这里要注意:仪表盘不是图表越多越好。我见过有人把十几个指标堆在一起,结果交易员根本看不过来。我的原则是:每个图表都要能回答一个具体的交易问题。
我曾经犯过的错:一开始我把所有图表都做成实时刷新,结果CPU占用率飙到90%,交易软件直接卡死。后来我优化了刷新策略:热力图每秒刷新,成交量分布每5分钟刷新,Delta和CVD只在K线收盘时刷新。这样既保证了实时性,又不会卡顿。
13.6 知识体系结构图
下面这张图,展示了订单流可视化的核心知识体系:
这张图展示了订单流可视化的四个核心组件,以及它们如何整合到仪表盘中。每个组件都有其独特的作用,但真正有价值的是它们之间的协同效应。
总结一下:订单流可视化不是花架子,它是连接原始数据和交易决策的桥梁。热力图帮你找支撑阻力,成交量分布图帮你找价值区域,Delta柱状图帮你判断多空力量,CVD曲线帮你确认趋势。把这些整合到仪表盘里,你就能像看「X光片」一样,看清市场的内部结构。
交易系统化学习资料 微信Strategy888888