3. 订单簿静态特征:价差、深度、斜率、宽度等核心指标计算
好,咱们今天聊聊订单簿的静态特征。说白了,就是你在某个时间点「拍一张快照」,然后从这张快照里提取出几个关键数字。这些数字能告诉你市场的流动性怎么样、买卖双方谁更强势、以及价格可能往哪个方向走。
我个人习惯把静态特征分成两类:一类是「价格维度的」,比如价差、宽度;另一类是「数量维度的」,比如深度、斜率。咱们一个一个来看。
3.1 价差(Spread)—— 最直观的流动性指标
价差,就是最优卖价(Ask)和最优买价(Bid)之间的差值。公式很简单:
Spread = Ask_Price - Bid_Price
但实际项目中,我们通常用相对价差,也就是把价差除以中间价:
Mid_Price = (Ask_Price + Bid_Price) / 2
Relative_Spread = Spread / Mid_Price
为什么要用相对价差?因为绝对价差在不同价格水平的股票上没法直接比较。比如茅台和工商银行,绝对价差差了几十倍,但相对价差可能都在同一个量级。
我在项目中遇到过一件事:有一次监控某个小盘股的价差,平时也就0.02元,突然某天开盘价差拉到了0.15元。我第一反应是「出事了」。果然,那家公司当天发了业绩预亏公告。价差就是市场的「预警灯」。
3.2 深度(Depth)—— 你能吃下多少单子?
深度,指的是在某个价格水平上,挂单的总数量。通常我们看的是「前N档深度之和」。
举个例子,买一档挂了1000手,买二档挂了800手,那前两档的买方深度就是1800手。卖方同理。
Bid_Depth_Level1 = Bid_Size_1
Bid_Depth_Level5 = sum(Bid_Size_1 to Bid_Size_5)
Ask_Depth_Level5 = sum(Ask_Size_1 to Ask_Size_5)
嗯,这里要注意:深度大不代表一定能成交。因为有些挂单是「虚挂」的,也就是做市商或者大资金故意挂上去吓唬人的。你一把冲进去,人家可能瞬间撤单。
3.3 宽度(Width)—— 订单簿的「覆盖范围」
宽度这个概念,很多人容易和价差搞混。价差只看最优一档,宽度看的是整个订单簿的「有效范围」。
怎么定义?我个人习惯用「价格偏离中间价一定百分比内的总挂单量所覆盖的价格区间」。说白了,就是看从中间价往两边走,走到什么位置,累计深度能达到某个阈值(比如总挂单量的80%)。
Width = Price_Upper - Price_Lower
其中:
Price_Upper = 满足累计卖方深度 ≥ 阈值的最小价格
Price_Lower = 满足累计买方深度 ≥ 阈值的最大价格
宽度越大,说明订单簿越「散」,流动性分布得比较均匀。宽度越小,说明流动性集中在最优价格附近。
你想想看,如果一个股票的宽度只有0.1%,说明买卖双方都在「死磕」最优价,稍微偏离一点就没单子了。这种股票,你下大单的时候要特别小心,很容易把价格打穿。
3.4 斜率(Slope)—— 订单簿的「陡峭程度」
斜率这个概念,是从限价订单簿的「价格-累计深度」曲线里衍生出来的。简单说,就是看价格每变动一个单位,累计深度变化多少。
数学上,我们可以用线性回归来拟合价格和累计深度的关系:
Slope = Δ(累计深度) / Δ(价格)
斜率大,说明订单簿很「陡」,价格稍微一动,深度就急剧变化。这种市场,通常流动性集中在几个关键价位,一旦突破,价格会快速滑向下一档。
斜率小,说明订单簿很「平」,深度分布均匀,价格变动对深度的影响不大。这种市场相对稳定,适合做中长线。
3.5 综合计算示例
好,咱们来写一段代码,把这些指标一次性算出来。我用的是Python,数据格式假设是标准的订单簿快照:
import numpy as np
def compute_static_features(orderbook):
"""
输入:orderbook 字典,包含 bids 和 asks
bids: [[price, size], ...] 按价格降序
asks: [[price, size], ...] 按价格升序
输出:特征字典
"""
best_bid = orderbook['bids'][0][0]
best_ask = orderbook['asks'][0][0]
mid_price = (best_bid + best_ask) / 2
# 1. 价差
spread = best_ask - best_bid
rel_spread = spread / mid_price
# 2. 深度(前5档)
bid_depth_5 = sum([b[1] for b in orderbook['bids'][:5]])
ask_depth_5 = sum([a[1] for a in orderbook['asks'][:5]])
# 3. 宽度(累计深度达到总深度80%的价格区间)
total_bid_depth = sum([b[1] for b in orderbook['bids']])
total_ask_depth = sum([a[1] for a in orderbook['asks']])
cum_bid = 0
price_lower = best_bid
for price, size in orderbook['bids']:
cum_bid += size
if cum_bid >= 0.8 * total_bid_depth:
price_lower = price
break
cum_ask = 0
price_upper = best_ask
for price, size in orderbook['asks']:
cum_ask += size
if cum_ask >= 0.8 * total_ask_depth:
price_upper = price
break
width = price_upper - price_lower
# 4. 斜率(用前10档拟合)
bid_prices = np.array([b[0] for b in orderbook['bids'][:10]])
bid_sizes = np.array([b[1] for b in orderbook['bids'][:10]])
cum_bid_sizes = np.cumsum(bid_sizes)
# 用最小二乘法拟合
A = np.vstack([bid_prices, np.ones(len(bid_prices))]).T
slope_bid, _ = np.linalg.lstsq(A, cum_bid_sizes, rcond=None)[0]
features = {
'spread': spread,
'rel_spread': rel_spread,
'bid_depth_5': bid_depth_5,
'ask_depth_5': ask_depth_5,
'width': width,
'slope_bid': slope_bid
}
return features
3.6 这些指标怎么用?
好,指标算出来了,然后呢?我给大家几个实战场景:
| 场景 | 指标组合 | 含义 |
|---|---|---|
| 流动性好 | 价差小 + 深度大 + 宽度小 | 市场活跃,适合高频策略 |
| 流动性差 | 价差大 + 深度小 + 宽度大 | 小心大单冲击,适合限价单 |
| 买方强势 | 买方深度 > 卖方深度 + 买方斜率大 | 价格可能上涨,考虑做多 |
| 卖方强势 | 卖方深度 > 买方深度 + 卖方斜率大 | 价格可能下跌,考虑做空 |
我曾经犯过一个错:只看价差和深度,忽略了斜率。结果在一个斜率极陡的股票上下了大单,价格直接被打穿了三个档位,滑点损失惨重。从那以后,我每次下单前都会看一眼斜率。
3.7 知识体系总览
下面这张图,是我自己整理的知识结构。你可以把它当成一个「检查清单」,每次分析订单簿的时候,对照着看一遍:
这张图把四个核心指标串起来了。你从中心出发,沿着分支往下看,每个指标都有它的子概念和实战用途。最下面那句话是我自己加的:「价差 + 深度 + 宽度 + 斜率 = 完整的流动性画像」。缺一个都不行。
好,关于订单簿静态特征的核心指标,咱们就聊到这儿。这些指标是后续所有动态分析的基础。你想想看,如果连静态特征都算不准,后面那些复杂模型就更没戏了。
公众号:蓝海资料掘金营,微信deep3321