第二章 市场微观结构:订单簿深度解析

做高频交易,第一件事不是写代码,而是搞懂订单簿。

我见过太多人,策略写得花里胡哨,结果连盘口数据都读错了。说白了,订单簿就是市场的「心跳」。你听懂了心跳,才能判断市场是健康还是病危。

2.1 订单簿是什么?

订单簿,英文叫 Order Book。它记录了所有未成交的买卖订单。

你可以把它想象成一个「排队系统」:

  • 买方在左边排队,出价高的排前面
  • 卖方在右边排队,要价低的排前面

中间那个价格,就是当前能成交的价格。

核心概念:订单簿不是静态的。每一毫秒都在变化。有人挂单,有人撤单,有人吃单。这些变化就是我们的利润来源。

2.2 限价单 vs 市价单

这两种订单,是交易的基础。我刚开始做的时候,觉得这太简单了。后来吃了亏才明白,细节里全是坑。

限价单(Limit Order)

你指定一个价格,挂在那里等。比如「我出100块买,有人卖我就买」。优点是你控制价格,缺点是不一定能成交。

我个人习惯,做做市策略时大量使用限价单。因为我要赚的是买卖价差,不是赌方向。

市价单(Market Order)

你不指定价格,直接说「我要买,按当前最优价成交」。优点是秒成交,缺点是你可能买贵了。

我曾经在流动性差的时候用过市价单,结果滑点吃掉了我一周的利润。嗯,从那以后,我对市价单格外小心。

类型 优点 缺点 适用场景
限价单 价格可控 可能不成交 做市、套利
市价单 立即成交 滑点风险 抢单、止损

避坑指南:我曾经在回测中忽略了市价单的滑点,结果实盘直接亏了3%。记住,回测一定要模拟真实的订单簿深度。

2.3 盘口数据:Level 1 vs Level 2

盘口数据,就是订单簿的「快照」。但不同级别的数据,信息量天差地别。

Level 1 数据

只告诉你最优买卖价(Best Bid/Offer)和对应的量。说白了,就是「现在最想买的人出多少,最想卖的人要多少」。

这个数据够用吗?做低频交易够了。做高频?远远不够。

Level 2 数据

告诉你多个价位的挂单情况。比如买一到买十,卖一到卖十,每个价位有多少量。

你想想看,如果你能看到买二到买十的挂单,你就能判断支撑位在哪。这就是信息优势。

我的经验:Level 2 数据里,我最关注的是「深度变化率」。如果买一突然增加大量挂单,但价格没动,说明有大资金在托底。这时候做多胜率很高。

2.4 逐笔成交(Tick Data)

逐笔成交,就是每一笔成交的记录。它告诉你:谁在什么时间、以什么价格、买了多少。

这个数据有多重要?我举个例子。

有一次,我看到盘口数据很正常,但逐笔成交里频繁出现「大单主动吃单」。这说明有人在偷偷吸筹。我跟着做了一波,赚了。如果没有逐笔数据,我根本发现不了。

逐笔成交的核心字段:

  • 时间戳(精确到毫秒甚至微秒)
  • 成交价格
  • 成交量
  • 买卖方向(买方主动还是卖方主动)

关键点:逐笔数据是「事后」的,但它能帮你判断「谁在主导市场」。主动买盘多,说明买方强势;主动卖盘多,说明卖方强势。

2.5 交易撮合机制

交易所怎么撮合订单?说白了就是「价格优先、时间优先」。

价格优先:买价高的优先成交,卖价低的优先成交。
时间优先:价格相同,先挂单的先成交。

这个机制看似简单,但里面有个坑:

我曾经以为,只要我挂的价格比当前最优价高一点,就能立刻成交。结果发现,如果前面有同价位的挂单,我得排队。这就是时间优先的威力。

所以,做高频交易时,你的订单能不能成交,不仅取决于价格,还取决于你的网络延迟。你比别人慢1毫秒,可能就排到后面去了。

2.6 知识体系总览

下面这张图,是我自己总结的。它把本章的核心知识点串在了一起。

市场微观结构知识体系 订单簿 (Order Book) 限价单 vs 市价单 盘口数据 (Level 1/2) 逐笔成交 (Tick Data) 交易撮合机制 价格可控 可能不成交 立即成交 滑点风险 Level 1 Level 2 时间戳、价格、量、方向 价格优先 时间优先 理解订单簿 = 理解市场语言

2.7 代码示例:解析 Level 2 数据

光说不练假把式。下面是我常用的一个 Python 函数,用来解析 Level 2 数据。

def parse_level2(data):
    """
    解析 Level 2 盘口数据
    data: 原始数据,格式为 {'bids': [[price, size], ...], 'asks': [[price, size], ...]}
    """
    bids = data.get('bids', [])
    asks = data.get('asks', [])
    
    # 计算买卖深度
    bid_depth = sum([size for price, size in bids[:5]])
    ask_depth = sum([size for price, size in asks[:5]])
    
    # 计算买卖压力比
    pressure_ratio = bid_depth / ask_depth if ask_depth > 0 else float('inf')
    
    # 计算价差
    best_bid = bids[0][0] if bids else 0
    best_ask = asks[0][0] if asks else 0
    spread = best_ask - best_bid
    
    return {
        'best_bid': best_bid,
        'best_ask': best_ask,
        'spread': spread,
        'bid_depth': bid_depth,
        'ask_depth': ask_depth,
        'pressure_ratio': pressure_ratio
    }

使用建议:pressure_ratio 大于 1.5 时,说明买方强势。小于 0.7 时,卖方强势。但别死板,要结合逐笔数据一起看。

2.8 避坑总结

最后,我把自己踩过的坑总结一下:

  • 别只看最优价:Level 1 数据太片面,至少要看 Level 2
  • 别忽略撤单:有人挂大单又撤单,可能是诱多或诱空
  • 别迷信逐笔数据:它是事后数据,只能辅助判断
  • 别忽视时间戳:毫秒级的差异,可能决定你的订单能不能成交

嗯,这一章就到这里。记住,订单簿是你的眼睛。看不清市场,就别谈赚钱。


蓝海数据掘金营,专注资料整理