1. 订单簿基础:什么是订单簿、限价单与市价单、买卖盘口与价差
1.1 订单簿到底是什么?
说实话,很多刚入行的朋友把订单簿想得太复杂了。
订单簿,说白了就是一个「排队本子」。
交易所里所有交易者挂出来的单子,都按价格排好队,等着成交。我习惯把它想象成一个双层的货架——左边是买家愿意出的最高价,右边是卖家愿意接受的最低价。
核心定义:订单簿(Order Book)是交易所维护的一个实时电子列表,记录了所有未成交的买卖订单。它反映了市场当前的供需关系。
举个例子。假设现在有人想买比特币,他出价 30000 美元买 1 个。另一个人想卖,要价 30001 美元卖 2 个。这两个单子就会出现在订单簿上,等着被匹配。
我在搭建第一个量化回测系统时,就踩过这个坑——以为订单簿只是简单的价格列表。后来发现,它其实包含了价格、数量、时间戳、订单ID、买卖方向等一堆字段。嗯,这里要注意,不同交易所的订单簿结构略有差异,但核心逻辑是一样的。
1.2 限价单 vs 市价单
这是订单簿里最基础的两种订单类型。我见过不少新手把两者搞混,结果吃了大亏。
限价单(Limit Order)
限价单,就是你指定一个价格,只有市场达到这个价格时才会成交。
- 买单限价:「我只愿意出 30000 美元买,高于这个价我不买」
- 卖单限价:「我只接受 30100 美元卖,低于这个价我不卖」
限价单的好处是你能控制成交价格。坏处是——可能永远成交不了。我曾经在 2020 年 3 月那次暴跌中挂了一个限价买单,价格设得低了 0.5%,结果市场直接砸穿又拉回,我的单子全程没成交。那叫一个郁闷。
市价单(Market Order)
市价单,就是「不管什么价格,我现在就要成交」。
- 市价买单:吃掉当前卖一价、卖二价……直到买够数量
- 市价卖单:砸穿当前买一价、买二价……直到卖完为止
市价单保证成交,但不保证价格。你想想看,如果市场流动性差,一个市价大单可能直接吃掉好几个档位,成交均价会比你预期的差很多。
我的建议:做高频交易时,我习惯用限价单挂单,吃买卖价差。做趋势策略时,市价单更合适,因为你要的是「上车」,不是「省那几块钱」。
1.3 买卖盘口与价差
盘口,就是订单簿上最前面那几档价格。
咱们来看一个典型的订单簿结构:
| 档位 | 买价(Bid) | 买量 | 卖价(Ask) | 卖量 |
|---|---|---|---|---|
| 1 | 30000.00 | 1.5 BTC | 30001.00 | 2.0 BTC |
| 2 | 29999.50 | 3.2 BTC | 30001.50 | 1.8 BTC |
| 3 | 29999.00 | 5.0 BTC | 30002.00 | 4.5 BTC |
| 4 | 29998.00 | 2.1 BTC | 30003.00 | 3.0 BTC |
| 5 | 29997.50 | 6.0 BTC | 30004.00 | 2.5 BTC |
这里面有几个关键概念:
- 买一(Best Bid):当前最高的买入价,这里是 30000.00
- 卖一(Best Ask):当前最低的卖出价,这里是 30001.00
- 价差(Spread):卖一减去买一,30001.00 - 30000.00 = 1.00 美元
价差是衡量市场流动性的重要指标。价差越小,说明市场越活跃,买卖双方博弈激烈。价差越大,说明流动性差,或者市场波动剧烈。
避坑指南:我曾经在流动性差的币对上做回测,忽略了价差成本。结果实盘一跑,光吃价差就把利润吃光了。记住,价差是你交易中「看不见的成本」。
1.4 订单簿的核心逻辑
为了让你更直观地理解,我画了一张订单簿的流程图:
这张图展示了一个典型的五档订单簿。左边是买方,价格从高到低排列。右边是卖方,价格从低到高排列。中间的价差就是买卖双方之间的「鸿沟」。
当一个市价买单进来,它会从卖一开始吃,卖一不够就吃卖二,以此类推。反过来,市价卖单会从买一开始砸。
1.5 订单簿的增量更新
说到增量更新,这是做量化交易必须理解的概念。
全量订单簿,就是一次性把整个订单簿发给你。但交易所每秒可能有成千上万笔订单变化,每次都发全量数据,带宽和延迟都受不了。
所以,交易所通常采用「增量快照」的方式:
- 先发一个全量快照(Snapshot),告诉你当前订单簿长什么样
- 之后只发增量更新(Incremental Update),比如「买一价格变了」、「卖三数量增加了」
- 客户端自己维护一个本地订单簿,不断应用增量更新
关键点:增量更新通常包含三个信息:操作类型(新增/修改/删除)、价格、数量。你收到增量后,要在本地订单簿中找到对应价格,然后执行相应操作。
我早期做行情系统时,就遇到过增量丢失导致本地订单簿和交易所不一致的问题。后来加了一个定时校验机制——每隔一段时间拉一次全量快照做对比,发现不一致就重新同步。嗯,这个坑踩得值。
1.6 实战中的注意事项
最后分享几个我在实战中总结的经验:
- 订单簿深度很重要:别只看买一卖一。有时候买一只有 0.1 个币,但买二到买五堆了 100 个币。这种「虚挂」的情况我见过太多次了。
- 价差会骗人:正常市场价差可能只有 0.01 美元。但遇到新闻事件,价差瞬间能拉到 10 美元。你的策略要能处理这种极端情况。
- 增量更新的顺序:交易所发来的增量更新是有时序的。乱序处理会导致订单簿错乱。我习惯给每个增量打一个序列号,按序列号顺序处理。
- 内存管理:订单簿数据量很大,尤其是做高频的。我一般用红黑树或者跳表来存储,查询和更新都是 O(log n) 的复杂度。
一个小技巧:如果你在做回测,别忘了模拟订单簿的延迟。真实环境中,增量更新从交易所到你本地,是有网络延迟的。这个延迟会影响你的成交判断。
好了,订单簿的基础知识就讲到这里。记住,订单簿是市场的「心电图」,读懂它,你就能感知市场的脉搏。