第一章:订单簿基础——限价单与市价单的定义、订单簿结构、买卖盘口深度解析

1.1 限价单与市价单:交易世界的两种基本语言

做量化交易这些年,我见过太多新手一上来就盯着K线图猛看,却忽略了最底层的东西——订单簿。说白了,订单簿才是市场最真实的脉搏。K线是加工过的信息,而订单簿是原材料。

先聊聊两种最基础的订单类型:限价单市价单

限价单,就是你指定一个价格,告诉交易所:“我只愿意在这个价格或者更好的价格成交。” 比如你想买BTC,当前卖一价是50000,你挂个49900的买单。那你就得等,等有人愿意以49900卖给你。限价单不保证成交,但保证价格。

市价单,就是你不管价格,直接说:“我要立刻成交,按当前最优价给我买!” 市价单保证成交,但不保证价格。你想想看,如果市场流动性差,一个市价单下去可能直接吃掉好几档价格,滑点会让你肉疼。

我个人习惯,做高频策略时几乎只用限价单。为什么?因为市价单的成本不可控。我在项目中遇到过一回,一个市价单下去,因为盘口太薄,直接打穿了三个价位,多花了0.3%的成本。嗯,从那以后我对市价单就格外谨慎了。

核心区别一句话总结:限价单是“我要这个价,等得起”;市价单是“我要马上成交,价格好商量”。

1.2 订单簿结构:市场的实时快照

订单簿,英文叫Order Book,就是交易所里所有未成交的限价单的集合。它分两边:买单(Bids)卖单(Asks)

买单按价格从高到低排列,卖单按价格从低到高排列。中间那个空隙,就是买卖双方的价格博弈区。

我画了一张图,帮你理解订单簿的结构:

订单簿结构示意图 买单 (Bids) 卖单 (Asks) 价格: 49980 数量: 2.5 BTC 价格: 49970 数量: 5.0 BTC 价格: 49960 数量: 8.1 BTC 价格: 49950 数量: 12.3 BTC 价格: 49940 数量: 20.0 BTC 价格: 50000 数量: 1.8 BTC 价格: 50010 数量: 3.2 BTC 价格: 50020 数量: 6.5 BTC 价格: 50030 数量: 10.0 BTC 价格: 50040 数量: 15.7 BTC 价差 20 USDT 最佳买价: 49980 最佳卖价: 50000

这张图里,左边是买单,右边是卖单。最上面那行是离当前价格最近的订单。你看,最佳买价是49980,最佳卖价是50000,中间差了20 USDT。这20 USDT就是价差(Spread)

价差是衡量流动性的重要指标。价差越小,说明市场越活跃,交易成本越低。我在做套利策略时,价差是我第一个看的指标。如果价差太大,策略根本跑不起来。

1.3 买卖盘口深度:你能吃下多少单子?

盘口深度,说白了就是看各个价位上到底有多少单子在等着。深度越厚,市场越能扛得住大单冲击。

举个例子,你想用市价单买10个BTC。看看上面的订单簿:

  • 卖一价50000,只有1.8个BTC。吃掉它。
  • 卖二价50010,有3.2个BTC。再吃掉。
  • 卖三价50020,有6.5个BTC。但你已经买了1.8+3.2=5个,还需要5个,所以从卖三再吃5个。

最终成交价:1.8个@50000 + 3.2个@50010 + 5个@50020。平均成交价是多少?算一下:(1.8*50000 + 3.2*50010 + 5*50020) / 10 = 50013.2。比最佳卖价50000高了13.2 USDT。这就是滑点。

实战小技巧:我一般会在下单前用订单簿数据算一下滑点。如果滑点超过策略容忍范围,我会拆单或者改用限价单。曾经有一次,我没算滑点直接下市价单,结果滑点吃掉了我一周的利润。教训深刻啊。

1.4 用Python快速分析订单簿

光说不练假把式。我写了个简单的Python函数,帮你快速分析订单簿深度:

def analyze_orderbook(bids, asks, order_size):
    """
    分析订单簿深度和滑点
    bids: 买单列表 [(price, volume), ...]
    asks: 卖单列表 [(price, volume), ...]
    order_size: 要买入的数量
    """
    remaining = order_size
    total_cost = 0.0
    filled_volume = 0.0
    
    for price, volume in asks:
        if remaining <= 0:
            break
        take = min(volume, remaining)
        total_cost += take * price
        filled_volume += take
        remaining -= take
    
    if remaining > 0:
        print("警告:订单簿深度不足,无法完全成交!")
        return None
    
    avg_price = total_cost / filled_volume
    best_ask = asks[0][0]
    slippage = (avg_price - best_ask) / best_ask * 100
    
    print(f"目标数量: {order_size} BTC")
    print(f"平均成交价: {avg_price:.2f}")
    print(f"滑点: {slippage:.3f}%")
    
    return avg_price, slippage

# 示例数据
bids = [(49980, 2.5), (49970, 5.0), (49960, 8.1)]
asks = [(50000, 1.8), (50010, 3.2), (50020, 6.5), (50030, 10.0)]

analyze_orderbook(bids, asks, 10.0)

这段代码会遍历卖单列表,逐档吃单,直到凑够你要的数量。最后算出平均成交价和滑点百分比。我每次跑新策略前,都会用这个函数先测一下市场深度够不够。

1.5 订单簿的动态变化:你看到的只是冰山一角

订单簿不是静止的。每一秒都有新订单进来,也有订单被撤掉。高频交易者会利用这一点做文章。

我记得有一次,我看到某个币的买一单突然增加了500个BTC,但价格没变。直觉告诉我,这可能是某个大资金在挂假单,想托住价格。果然,几秒后这500个BTC就撤单了。这种手法叫虚假挂单(Spoofing),是监管明令禁止的,但在一些监管不严的市场里依然存在。

避坑指南:我曾经因为没注意订单簿的撤单率,被假单坑过一次。从那以后,我写策略时都会加一个逻辑:如果某个价位的挂单量突然异常增大,先观察几秒再行动。别急着跟单。

订单簿的深度数据,一般交易所API都会提供。常用的字段有:

字段 含义 我的用法
price 价格 确定买卖档位
volume 该价位的挂单量 计算深度和滑点
timestamp 更新时间 判断数据是否过期
side 买单还是卖单 区分买卖方向

我个人习惯,拿到订单簿数据后,先算几个关键指标:

  1. 价差:最佳卖价 - 最佳买价。越小越好。
  2. 深度比:前5档买单总量 / 前5档卖单总量。大于1说明买盘强,小于1说明卖盘强。
  3. 订单密度:每个价位上的挂单量分布。如果某个价位挂单量特别大,可能是支撑位或阻力位。

这些指标能帮你快速判断市场的真实状态。别只看K线,订单簿才是第一手信息。

一句话总结本章:限价单和市价单是交易的基本工具,订单簿是市场的实时地图。读懂订单簿,你就能看到别人看不到的市场细节。

好了,这一章就聊到这儿。记住,订单簿是你和市场的直接对话窗口。多花点时间研究它,比看一百个技术指标都管用。


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