第四章:匹配市场与双边市场

Roth的匹配市场理论,延迟接受算法,在订单簿交易中的应用

匹配市场,说白了就是两边的人互相挑。一边是买家,一边是卖家。你想想看,股票交易是不是也是这样?有人想买,有人想卖,中间需要一个机制来撮合。

我最早接触匹配理论,是在做期权做市商的时候。那时候我就在想,订单簿本质上不就是个匹配市场吗?只不过咱们交易员管它叫「价格优先、时间优先」。但Alvin Roth这帮经济学家,他们管这叫「延迟接受算法」。名字不一样,内核其实差不多。

什么是匹配市场?

匹配市场有两个核心特征:

  • 双边性:市场两边是不同的群体,比如买家和卖家
  • 不可分割性:交易的是整手股票,不能拆成半手

嗯,这里要注意。匹配市场跟咱们平时说的「完全竞争市场」不一样。完全竞争市场里,价格是唯一的信号。但在匹配市场里,除了价格,还有偏好、优先级、甚至运气成分。

我个人习惯把匹配市场分成两类:

类型例子特点
集中式匹配股票交易所中央订单簿,统一撮合
分散式匹配OTC市场双边谈判,没有中央对手方

延迟接受算法(Deferred Acceptance Algorithm)

这个算法是Roth的成名作。他靠这个拿了诺贝尔奖。算法本身不复杂,但思想很深刻。

我给大家拆解一下核心逻辑:

  1. 买家向所有卖家发出「意向」
  2. 卖家从收到的意向中,挑出最满意的,暂时接受
  3. 被拒绝的买家,继续向下一顺位的卖家发出意向
  4. 重复,直到所有人都匹配完毕

为什么叫「延迟接受」?因为卖家不是立刻做最终决定,而是先「暂存」最优选择,等更好的出现再换。说白了就是「骑驴找马」。

关键洞察:延迟接受算法保证了「稳定匹配」。什么叫稳定?就是不存在一对买家卖家,他们互相更喜欢对方,但当前却没有匹配在一起。这在订单簿里,就是「没有未成交的限价单可以互相撮合」。

订单簿交易中的匹配逻辑

咱们做量化交易的,天天跟订单簿打交道。你有没有想过,订单簿的撮合机制,其实就是延迟接受算法的一个变种?

我来画个图,帮大家理解:

订单簿匹配流程(延迟接受算法视角) 买方限价单队列 卖方限价单队列 匹配引擎 (延迟接受算法) 成交结果 价格优先 → 时间优先 → 部分成交 → 剩余挂单

你看这个图,买方和卖方各自排着队。匹配引擎就是延迟接受算法的执行者。它不断检查:当前最优的买单和最优的卖单,能不能成交?能的话就撮合,不能就等着。

我在项目中的实战经验

我记得有一次做高频交易策略,遇到一个坑。我们的订单簿匹配逻辑,用的是标准的「价格优先、时间优先」。但后来发现,在某些极端行情下,这种匹配方式会导致「虚假成交信号」。

为什么会这样?因为延迟接受算法假设所有参与者都是理性的,但市场恐慌时,有人会挂出离谱的价格。这些订单虽然排在前面,但成交后很快就会被撤销。嗯,这里要注意,算法本身没问题,但实际应用时要加一层「价格合理性校验」。

避坑指南:我曾经在回测中忽略了一个细节——延迟接受算法要求「偏好是严格的」。但在订单簿里,两个订单可能价格相同、时间相同(比如同时到达)。这时候需要引入「随机排序」或者「ID优先级」来打破平局。否则,你的回测结果会跟实盘差很多。

延迟接受算法在订单簿中的具体实现

咱们来看一段伪代码,理解一下核心逻辑:

// 订单簿匹配引擎(延迟接受算法简化版)
function matchOrderBook(buyOrders, sellOrders):
    // 按价格排序:买单从高到低,卖单从低到高
    sort(buyOrders, by price descending)
    sort(sellOrders, by price ascending)
    
    while buyOrders is not empty and sellOrders is not empty:
        bestBuy = buyOrders[0]   // 最高买入价
        bestSell = sellOrders[0] // 最低卖出价
        
        if bestBuy.price >= bestSell.price:
            // 可以成交
            tradePrice = bestSell.price  // 或者取中间价
            tradeQty = min(bestBuy.qty, bestSell.qty)
            
            // 更新订单簿
            bestBuy.qty -= tradeQty
            bestSell.qty -= tradeQty
            
            if bestBuy.qty == 0: remove(buyOrders[0])
            if bestSell.qty == 0: remove(sellOrders[0])
            
            recordTrade(tradePrice, tradeQty)
        else:
            // 无法成交,退出循环
            break

这段代码看着简单,但实际生产环境要考虑的东西多得多。比如:

  • 冰山订单怎么处理?
  • 市价单怎么映射到限价单?
  • 部分成交后的剩余订单,优先级怎么算?

我个人习惯把市价单看作「价格为无穷大(买单)或无穷小(卖单)」的限价单。这样处理起来,逻辑就统一了。

匹配理论对交易策略的启示

学完匹配理论,对我们做策略有什么实际帮助?我总结了几点:

  1. 订单簿深度分析:匹配理论告诉我们,订单簿的「厚度」会影响匹配效率。薄订单簿容易出现「跳空」,厚订单簿则更稳定。
  2. 最优执行策略:如果你是大资金,直接挂单可能会影响市场。延迟接受算法的思想是「分批试探」,这跟TWAP、VWAP的思路是一致的。
  3. 市场设计缺陷:有些交易所的撮合规则有漏洞。比如某些衍生品市场,允许「自成交预防」,但这实际上破坏了匹配的稳定性。

重要提醒:匹配理论虽然漂亮,但不要生搬硬套。真实市场的参与者不是完全理性的,有人会犯错误,有人会恶意操纵。算法只能保证「在给定偏好下的稳定匹配」,但偏好本身可能是错的。

好了,这一章的内容就到这里。匹配市场理论看起来抽象,但落地到订单簿交易中,其实每天都在用。你下次看Level2行情的时候,可以想想:当前订单簿的匹配状态是稳定的吗?有没有潜在的「未匹配对」?这些思考,往往能帮你发现交易机会。

专注资料整理