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 订单簿的核心逻辑

为了让你更直观地理解,我画了一张订单簿的流程图:

订单簿核心逻辑流程图 买方(Bid Side) 卖方(Ask Side) 买一:30000.00 @ 1.5 BTC 买二:29999.50 @ 3.2 BTC 买三:29999.00 @ 5.0 BTC 买四:29998.00 @ 2.1 BTC 买五:29997.50 @ 6.0 BTC 卖一:30001.00 @ 2.0 BTC 卖二:30001.50 @ 1.8 BTC 卖三:30002.00 @ 4.5 BTC 卖四:30003.00 @ 3.0 BTC 卖五:30004.00 @ 2.5 BTC 价差 = 1.00 美元 市价单成交

这张图展示了一个典型的五档订单簿。左边是买方,价格从高到低排列。右边是卖方,价格从低到高排列。中间的价差就是买卖双方之间的「鸿沟」。

当一个市价买单进来,它会从卖一开始吃,卖一不够就吃卖二,以此类推。反过来,市价卖单会从买一开始砸。

1.5 订单簿的增量更新

说到增量更新,这是做量化交易必须理解的概念。

全量订单簿,就是一次性把整个订单簿发给你。但交易所每秒可能有成千上万笔订单变化,每次都发全量数据,带宽和延迟都受不了。

所以,交易所通常采用「增量快照」的方式:

  • 先发一个全量快照(Snapshot),告诉你当前订单簿长什么样
  • 之后只发增量更新(Incremental Update),比如「买一价格变了」、「卖三数量增加了」
  • 客户端自己维护一个本地订单簿,不断应用增量更新

关键点:增量更新通常包含三个信息:操作类型(新增/修改/删除)、价格、数量。你收到增量后,要在本地订单簿中找到对应价格,然后执行相应操作。

我早期做行情系统时,就遇到过增量丢失导致本地订单簿和交易所不一致的问题。后来加了一个定时校验机制——每隔一段时间拉一次全量快照做对比,发现不一致就重新同步。嗯,这个坑踩得值。

1.6 实战中的注意事项

最后分享几个我在实战中总结的经验:

  1. 订单簿深度很重要:别只看买一卖一。有时候买一只有 0.1 个币,但买二到买五堆了 100 个币。这种「虚挂」的情况我见过太多次了。
  2. 价差会骗人:正常市场价差可能只有 0.01 美元。但遇到新闻事件,价差瞬间能拉到 10 美元。你的策略要能处理这种极端情况。
  3. 增量更新的顺序:交易所发来的增量更新是有时序的。乱序处理会导致订单簿错乱。我习惯给每个增量打一个序列号,按序列号顺序处理。
  4. 内存管理:订单簿数据量很大,尤其是做高频的。我一般用红黑树或者跳表来存储,查询和更新都是 O(log n) 的复杂度。

一个小技巧:如果你在做回测,别忘了模拟订单簿的延迟。真实环境中,增量更新从交易所到你本地,是有网络延迟的。这个延迟会影响你的成交判断。

好了,订单簿的基础知识就讲到这里。记住,订单簿是市场的「心电图」,读懂它,你就能感知市场的脉搏。

专注资料整理