2、订单簿结构:限价单与市价单、订单簿的买卖盘口、订单簿的深度与宽度
做市商这行干久了,你会发现一个很有意思的现象:很多人把订单簿当成一个静态的表格来看。其实不是的,它更像一个活着的、会呼吸的有机体。每一秒都有新的订单进来,旧的订单被吃掉,价格在跳动,深度在变化。今天我们就来拆解这个核心结构。
2.1 限价单与市价单:两种最基本的武器
先说说最基础的东西。限价单和市价单,这两个概念我估计大家都懂,但实际用起来,坑特别多。
限价单(Limit Order),说白了就是你指定一个价格,挂在那里等。比如你觉得BTC在30000美元这个位置有支撑,你就挂一个30000的买单。价格到了,你的单子就成交;到不了,就一直在那挂着。
我个人习惯把限价单叫做「被动单」。为什么?因为你是提供流动性的人。你挂单在那里,别人来吃你的单子。在交易所眼里,你是「maker」,做市商嘛,主要就是干这个的。
市价单(Market Order),这个更直接。你不管价格多少,我就要现在成交。你想想看,这就像你冲进菜市场喊「不管多少钱,给我来一斤猪肉」。市价单是「主动单」,你是来吃流动性的,你是「taker」。
核心区别:
- 限价单:指定价格,等待成交,提供流动性(maker)
- 市价单:立即成交,吃掉流动性,支付手续费(taker)
我在项目中遇到过一件事,有个新手做市商,为了抢一个大的卖单,直接上了市价单。结果呢?因为深度不够,他的市价单直接把价格打穿了两个档位,多亏了好几个基点。嗯,这就是典型的「滑点」问题。所以做市商一般很少用市价单,除非你确定深度足够厚。
2.2 订单簿的买卖盘口:Bid和Ask的世界
打开任何一个交易平台的订单簿,你都会看到左右两列。左边是买单(Bid),右边是卖单(Ask)。中间那个价差,就是我们做市商吃饭的地方。
买盘(Bid Side):所有想买的人挂的限价单。价格从高到低排列。最高的那个买单价格,我们叫它「Bid 1」或者「最高买价」。
卖盘(Ask Side):所有想卖的人挂的限价单。价格从低到高排列。最低的那个卖单价格,叫「Ask 1」或者「最低卖价」。
这两个价格之间的差值,就是价差(Spread)。价差越小,说明市场越活跃,流动性越好。我记得有一次做ETH的做市,价差只有0.01美元,那感觉就像在刀尖上跳舞,每一笔单子都要算得特别精细。
| 盘口 | 价格 | 数量 | 累计 |
|---|---|---|---|
| Ask 3 | 30,010 | 5.0 | 15.0 |
| Ask 2 | 30,005 | 3.0 | 10.0 |
| Ask 1 | 30,000 | 2.0 | 7.0 |
| --- | 价差: 0.5 | --- | --- |
| Bid 1 | 29,999.5 | 1.5 | 1.5 |
| Bid 2 | 29,995 | 4.0 | 5.5 |
| Bid 3 | 29,990 | 6.0 | 11.5 |
你看这个表格,Bid 1是29,999.5,Ask 1是30,000,价差只有0.5美元。这说明什么?说明这个市场很「薄」,但也很「紧」。薄是指每个价位的挂单量不大,紧是指价差小。
2.3 订单簿的深度与宽度:两个维度的博弈
好,接下来是重点。深度和宽度,这两个概念经常被混用,但其实它们描述的是订单簿的两个不同维度。
深度(Depth),指的是在某个价格附近,有多少订单在等着。深度越大,说明这个价格区间有足够的对手盘。你想想看,如果你要卖100个BTC,而买一只有2个BTC,那你的单子一下去,价格直接被打穿好几层。这就是深度不够。
宽度(Width),指的是订单簿覆盖的价格范围。宽度越宽,说明市场参与者的报价范围越广,市场越有韧性。我曾经见过一个冷门币种,订单簿宽度只有几个百分点,稍微大一点的单子就能把价格拉飞。
我的经验:
做市商最怕的不是深度不够,而是宽度太窄。深度不够你可以分批挂单,但宽度太窄意味着市场没有足够的「安全垫」。一旦有突发事件,价格会像断崖一样下跌或上涨。
怎么量化这两个指标?我一般用这个公式:
# 深度计算示例(Python伪代码)
def calculate_depth(order_book, price, level=10):
"""
计算指定价格附近N个档位的总深度
"""
bids = order_book['bids'][:level] # 取前N档买单
asks = order_book['asks'][:level] # 取前N档卖单
bid_depth = sum([bid[1] for bid in bids]) # 买单总数量
ask_depth = sum([ask[1] for ask in asks]) # 卖单总数量
return bid_depth, ask_depth
# 宽度计算
def calculate_width(order_book):
"""
计算订单簿的宽度(最高买价到最低卖价之间的价格范围)
"""
best_bid = order_book['bids'][0][0]
best_ask = order_book['asks'][0][0]
width = (best_ask - best_bid) / best_bid * 100 # 以百分比表示
return width
这段代码看起来简单,但实际生产环境中,你需要考虑的东西多得多。比如,有些交易所的订单簿数据是增量推送的,你需要维护一个本地的订单簿快照。我曾经因为没处理好增量更新的时序问题,导致深度计算差了整整一个数量级,那叫一个惨。
避坑指南:
我曾经在对接某个二线交易所时,发现他们的订单簿数据有延迟。你以为看到的深度是实时的,其实已经是3秒前的数据了。3秒在加密货币市场里,足够发生很多事情。所以,一定要做延迟检测,必要时加上时间戳校验。
2.4 深度曲线的实际应用
光看数字不够直观,我习惯把深度画成曲线。横轴是价格,纵轴是累计挂单量。你会得到一条S型的曲线。
这条曲线有几个关键点:
- 中间最陡峭的部分:就是当前价格附近,深度最集中的区域。这里流动性最好。
- 两端的平坦区域:远离当前价格,挂单量很少。这里一旦被触及,价格会剧烈波动。
- 曲线的斜率:斜率越大,说明价格变动对挂单量的敏感度越高。说白了,就是「一碰就倒」。
做市商策略的核心,就是在这条曲线上找到自己的位置。你挂单在陡峭区域,成交概率高,但利润薄;你挂单在平坦区域,利润厚,但可能很久都成交不了。这是一个永恒的权衡。
嗯,说到这里,我想起一个案例。有一次我们团队在做一个新币种的做市,发现它的深度曲线在某个价格区间有一个明显的「缺口」。就是那个价格区间几乎没人挂单。我们当时判断,这是市场参与者的心理价位空白区。于是我们果断在那个区间两边挂单,一边吃价差,一边等市场来填这个缺口。结果呢?三天后,那个缺口被填平了,我们赚了一波不错的利润。
所以,读懂订单簿的深度和宽度,不仅仅是看数字,更是读懂市场参与者的心理。每一笔挂单背后,都是一个活生生的人在决策。你想想看,是不是这个道理?