1. 订单簿基础概念:限价订单与市价订单
做量化交易这些年,我越来越觉得订单簿这东西,就像市场的「心电图」。你盯着它看久了,能感受到买卖双方的情绪波动。今天咱们就从最基础的东西聊起——限价订单和市价订单到底是怎么回事。
1.1 限价订单:我说了算
限价订单,说白了就是你告诉交易所:「我只愿意在这个价格买/卖,高了我不买,低了我不卖。」
举个例子。假设现在比特币价格是 30000 USDT,你觉得它还会跌,于是挂了一笔限价买单:买入 1 BTC,价格 29500 USDT。这笔订单不会立刻成交,它会进入订单簿,等着有人愿意以 29500 卖给你。
我个人习惯把限价订单叫做「耐心订单」——你愿意等,就挂限价。我在项目中遇到过不少新手,一上来就挂限价单,结果行情一路狂奔,订单根本没成交。嗯,这里要注意:限价单不保证成交,只保证价格。
1.2 市价订单:我要立刻成交
市价订单就简单粗暴了——「不管什么价格,我现在就要买/卖!」
你想想看,如果你看到一条重大利好消息,价格正在往上冲,这时候挂限价单可能永远成交不了。市价单就是你的选择:它会立刻吃掉订单簿上最优的对手盘。
比如你下了一笔市价买单买入 1 BTC,系统会立刻找到当前卖一价(最低的卖单)成交。如果卖一的数量不够,就继续吃卖二、卖三……直到买够为止。
1.3 订单簿数据结构:价格-数量映射
订单簿本质上就是一个「价格 → 数量」的映射表。交易所会把所有未成交的限价订单按价格排序,形成两个队列:
- 买单队列(Bids):从高到低排列,最高价在最前面
- 卖单队列(Asks):从低到高排列,最低价在最前面
用 Python 表示的话,我一般用字典或者有序字典:
# 订单簿的简化表示
order_book = {
'bids': { # 买单:价格 -> 数量
29500: 2.5,
29400: 1.2,
29300: 3.0
},
'asks': { # 卖单:价格 -> 数量
30500: 1.8,
30600: 2.0,
30700: 1.5
}
}
实际生产环境中,订单簿的数据结构要复杂得多。我建议用 sortedcontainers 库或者 Redis 的有序集合来维护,性能会好很多。
1.4 买卖盘口与价差
盘口(Order Book Depth)就是订单簿的「快照」。最关键的几个概念:
| 术语 | 含义 | 我的理解 |
|---|---|---|
| Bid(买一价) | 最高的未成交买单价格 | 买方愿意出的最高价 |
| Ask(卖一价) | 最低的未成交卖单价格 | 卖方愿意接受的最低价 |
| Spread(价差) | Ask - Bid | 市场的「摩擦力」 |
| Mid Price(中间价) | (Bid + Ask) / 2 | 公允价格的近似值 |
价差这东西,我越做越觉得它重要。价差越小,说明市场流动性越好,交易成本越低。像 BTC/USDT 这种主流交易对,价差通常只有 0.01% 左右。但一些小币种,价差可能高达 1% 甚至更多。
1.5 知识体系总览
下面这张图是我自己画的,把本章的核心逻辑串起来了:
这张图其实把本章的逻辑说清楚了:限价订单和市价订单是两种最基本的订单类型,它们共同作用于订单簿这个数据结构上。限价订单「构建」了订单簿,市价订单「消耗」了订单簿。而买卖盘口和价差,就是订单簿的「快照指标」。
做量化交易,理解这些基础概念是第一步。我见过太多人一上来就研究各种复杂策略,结果连订单簿都看不懂,最后亏得一塌糊涂。嗯,基础打牢了,后面的路才走得稳。
- 限价订单 = 指定价格 + 等待成交
- 市价订单 = 立即成交 + 价格不确定
- 订单簿 = 价格-数量映射表,分买单队列和卖单队列
- 价差 = 卖一价 - 买一价,衡量市场流动性的关键指标