一、订单簿基础:什么是订单簿?

做高频交易这些年,我每天打交道最多的东西,就是订单簿。

说白了,订单簿就是交易所用来记录所有买卖挂单的电子账本。它实时展示着当前市场上,有多少人想买、多少人想卖,各自出什么价、要多少量。

你打开任何一个交易软件的深度图,看到的那两条曲线,就是从订单簿数据画出来的。

核心定义:订单簿 = 所有未成交限价单的集合,按价格排序,实时动态更新。

1.1 限价单 vs 市价单

这两个概念,是理解订单簿的基石。我见过不少新手把两者搞混,结果吃了大亏。

限价单(Limit Order):你指定一个价格,只有市场达到这个价格时才会成交。说白了,就是「我只接受这个价,低了不卖,高了不买」。

市价单(Market Order):你不指定价格,直接按当前最优价成交。你想想看,这就像「不管多少钱,我现在就要买到/卖掉」。

对比维度 限价单 市价单
价格控制 完全由你指定 由市场决定
成交确定性 不一定成交 几乎立即成交
滑点风险 无滑点 可能有滑点
对市场影响 提供流动性 消耗流动性
典型用途 做市、挂单策略 追涨杀跌、快速建仓

我的经验:我个人习惯在策略中同时使用两种订单。做市用限价单赚价差,遇到突发事件用市价单快速离场。记住一点:限价单是你的「阵地」,市价单是你的「突击队」。

1.2 买卖盘口结构

订单簿的盘口结构,其实非常直观。我们来看一个典型的比特币订单簿快照:

卖盘(Ask Side)
价格      数量
100.50    1.2
100.40    0.8
100.30    2.5
------------------
买盘(Bid Side)
价格      数量
100.20    3.0
100.10    1.5
100.00    2.0

这里有几个关键概念:

  • 最优卖价(Best Ask):卖盘最低价,这里是 100.30
  • 最优买价(Best Bid):买盘最高价,这里是 100.20
  • 买卖价差(Spread):100.30 - 100.20 = 0.10
  • 盘口深度(Depth):每个价格档位的挂单总量

避坑指南:我曾经在实盘中只看最优价,忽略了深层盘口。结果一个大单砸下来,直接穿透了前五档,滑点损失惨重。记住:盘口深度比最优价更重要。

1.3 订单簿的核心逻辑

为什么会形成这样的结构?因为交易所遵循两个基本原则:

  1. 价格优先:买单出价高的优先成交,卖单出价低的优先成交
  2. 时间优先:同价格下,先挂单的先成交

你想想看,这就像排队买东西。出价高的人可以插队到前面,但如果出价相同,那就按先来后到。

下面这张图,展示了订单簿的完整运作流程:

订单簿核心运作流程 新订单到达 市价单? 立即与最优价成交 检查价格是否可立即成交 可成交 部分/全部成交 不可成交 挂入订单簿等待成交 订单簿状态更新

1.4 盘口数据的实际意义

在实际交易中,订单簿数据能告诉我们很多信息:

  • 买卖力量对比:买盘总量 vs 卖盘总量,判断多空倾向
  • 支撑阻力位:大额挂单集中的价格,往往是关键价位
  • 市场深度:大单能否轻松吃掉,判断流动性好坏
  • 挂单变化速度:撤单频率高,说明有人在试探市场

实战技巧:我习惯在开盘前5分钟观察订单簿。如果买盘突然增加但价格不动,说明有大户在偷偷吸筹。这时候跟着挂单,胜率往往不错。

1.5 代码示例:获取订单簿数据

下面是一个简单的 Python 示例,演示如何从交易所获取订单簿数据:

import requests
import json

def get_orderbook(symbol="btcusdt", limit=10):
    """
    获取币安交易所的订单簿数据
    """
    url = f"https://api.binance.com/api/v3/depth"
    params = {
        "symbol": symbol.upper(),
        "limit": limit
    }
    
    response = requests.get(url, params=params)
    data = response.json()
    
    # 解析数据
    bids = data['bids']  # 买盘
    asks = data['asks']  # 卖盘
    
    print(f"=== {symbol} 订单簿 ===")
    print(f"卖盘(Ask):")
    for price, qty in asks[:5]:
        print(f"  价格: {price}  数量: {qty}")
    
    print(f"买盘(Bid):")
    for price, qty in bids[:5]:
        print(f"  价格: {price}  数量: {qty}")
    
    # 计算价差
    best_ask = float(asks[0][0])
    best_bid = float(bids[0][0])
    spread = best_ask - best_bid
    print(f"\n买卖价差: {spread:.4f}")
    
    return data

# 调用函数
orderbook = get_orderbook("btcusdt", 10)

这段代码会输出类似这样的结果:

=== BTCUSDT 订单簿 ===
卖盘(Ask):
  价格: 50000.00  数量: 0.5
  价格: 50001.00  数量: 1.2
  价格: 50002.50  数量: 0.8
买盘(Bid):
  价格: 49999.00  数量: 2.0
  价格: 49998.00  数量: 1.5
  价格: 49997.50  数量: 0.3
买卖价差: 1.0000

注意:实际生产环境中,不要用 requests 同步请求。我建议用 websocket 实时订阅,否则延迟会让你错过最佳交易时机。

嗯,订单簿的基础概念就这些。看似简单,但里面藏着很多门道。后面我们会深入讲解如何利用这些数据构建策略。


公众号:蓝海资料掘金营,微信deep3321