第四章:订单簿基础——限价单与市价单、订单簿结构、买卖盘口、深度与宽度
做市商这行,说白了就是跟订单簿打交道。你每天盯着屏幕,看到的那些跳动的数字,背后就是一张巨大的订单簿。我刚开始做量化的时候,觉得订单簿不就是一堆买单卖单嘛,有什么好看的?后来被市场狠狠教育了几次,才明白这里面门道深着呢。
4.1 限价单与市价单:两种最基本的武器
先聊聊订单类型。做市商最常用的就两种:限价单和市价单。嗯,这里要注意,别小看这两种单子,用不好可是要亏钱的。
限价单(Limit Order),说白了就是你指定一个价格,只有市场达到这个价格才成交。比如你在100块挂买单,那只有价格跌到100或以下才会成交。我在项目中遇到过,有些新手做市商喜欢挂很远的限价单,觉得能捡便宜。结果呢?行情一来,单子被吃掉,自己反而成了接盘侠。
市价单(Market Order),就是不管价格,直接按当前最优价成交。速度快,但成本高。我记得有一次做回测,发现市价单的滑点比想象中大得多,尤其是在流动性差的时候。
核心区别:
- 限价单:提供流动性,赚取买卖价差,但可能不成交
- 市价单:消耗流动性,快速成交,但承担滑点成本
做市商的核心策略,就是用限价单挂买卖双边,赚取价差。但什么时候挂、挂多深、怎么调整,这就是学问了。
4.2 订单簿结构:一张看不见的战场地图
订单簿,其实就是所有未成交订单的集合。交易所会把所有买单和卖单按价格排序,展示出来。你想想看,这就像一张战场地图,你能看到敌人在哪里布防。
一个典型的订单簿结构是这样的:
| 价格 | 卖单数量 | 买单数量 | 价格 |
|---|---|---|---|
| 101.0 | 500 | ||
| 100.5 | 300 | ||
| 100.0 | 200 | ||
| 99.5 | 150 | ||
| 99.0 | 400 | ||
| 98.5 | 600 |
中间那条线就是当前价格。上面是卖单(Ask),下面是买单(Bid)。做市商就活在这个中间地带,靠吃价差为生。
我的习惯:每次上线新策略前,我都会先拉一份完整的订单簿快照,看看各个价位的挂单密度。这能帮你判断市场深度够不够,别一进去就把自己埋了。
4.3 买卖盘口:做市商的命门
买卖盘口,就是最优买价(Bid)和最优卖价(Ask)。这两个价格之间的差距,就是价差(Spread)。做市商赚的就是这个。
举个例子:
- 最优买价:99.5,挂单150手
- 最优卖价:100.0,挂单200手
- 价差:0.5
如果你在99.5挂买单,在100.0挂卖单,一旦成交,你就赚了0.5的价差。但问题是,市场会波动。我曾经遇到过一次,价差突然从0.5扩大到2.0,我的单子全被套住了。嗯,那次教训挺深刻的。
避坑指南:我曾经因为没注意盘口变化,在价差扩大的时候还按老策略挂单,结果被市场来回打脸。记住,盘口是动态的,你的策略也得动态调整。
4.4 深度与宽度:市场的真实面貌
深度,指的是在某个价格附近有多少挂单。宽度,指的是订单簿覆盖的价格范围。这两个指标,能告诉你市场的真实流动性。
我习惯用一张图来理解:
你看这张图,买单在左边,卖单在右边。深度越大,说明这个价位愿意接盘的人越多。宽度越大,说明订单覆盖的价格范围越广。做市商最怕的就是深度不够,一单下去直接把价格打穿。
实战要点:
- 深度大:可以放心挂单,流动性好
- 深度小:要小心,可能一单就把盘口打穿
- 宽度大:说明市场分歧大,波动可能加剧
- 宽度小:市场一致性强,趋势可能延续
4.5 实战中的订单簿分析
说了这么多理论,来点实际的。我一般会这样分析订单簿:
- 看价差:价差越小,市场越活跃。如果价差突然扩大,说明有大事发生。
- 看深度分布:买单集中在哪个价位?卖单集中在哪个价位?这能告诉你支撑和阻力在哪。
- 看挂单变化:大单撤了?新单进来了?这些信号往往预示着方向。
举个例子,有一次我发现买单深度突然增加,但价格没动。我判断有人在偷偷吸筹,果断跟着挂单。结果半小时后价格拉升,我赚了一波。嗯,这就是看订单簿的好处。
一个小技巧:别只看最优盘口,要看整个订单簿的分布。有时候最优盘口只有几十手,但下面几百手等着,那才是真正的支撑。
4.6 代码示例:获取并分析订单簿
最后,给一段简单的Python代码,帮你理解怎么获取和分析订单簿:
import requests
import json
def get_order_book(symbol, depth=10):
"""获取订单簿数据"""
url = f"https://api.example.com/orderbook?symbol={symbol}&depth={depth}"
response = requests.get(url)
return response.json()
def analyze_order_book(order_book):
"""分析订单簿"""
bids = order_book['bids'] # 买单
asks = order_book['asks'] # 卖单
# 计算价差
best_bid = float(bids[0][0])
best_ask = float(asks[0][0])
spread = best_ask - best_bid
# 计算深度
bid_depth = sum(float(b[1]) for b in bids)
ask_depth = sum(float(a[1]) for a in asks)
return {
'spread': spread,
'bid_depth': bid_depth,
'ask_depth': ask_depth,
'bid_ask_ratio': bid_depth / ask_depth
}
# 使用示例
order_book = get_order_book('BTCUSDT')
analysis = analyze_order_book(order_book)
print(f"价差: {analysis['spread']}")
print(f"买卖深度比: {analysis['bid_ask_ratio']:.2f}")
这段代码很简单,但能帮你快速了解市场状态。我个人习惯在策略启动前先跑一遍,看看当前市场适不适合做市。
注意:API返回的订单簿数据可能有延迟,尤其是高频交易场景。我曾经因为用了延迟数据,导致策略判断失误。建议用WebSocket实时订阅。
好了,订单簿的基础就聊到这儿。记住,订单簿是市场的脉搏,读懂了它,你就读懂了市场。做市商的核心,就是在这个动态的订单簿中找到自己的位置。