4. 集合竞价机制:开盘价与收盘价的确定、集合竞价算法

集合竞价,说白了就是交易所用来定开盘价和收盘价的那套规则。很多做市商朋友觉得这东西跟自己关系不大,其实不然——你想想看,每天开盘那几分钟的波动,往往能决定你一天的盈亏。我个人习惯在集合竞价阶段就提前布局,而不是等连续竞价开始再追。

4.1 集合竞价的核心逻辑

集合竞价的核心思想很简单:找一个价格,让成交量最大。这个价格就是所谓的「均衡价格」。嗯,这里要注意,不是所有交易所都用完全一样的规则,但底层逻辑是相通的。

具体来说,集合竞价要满足三个条件:

  • 成交量最大——这是首要目标
  • 所有买单价格 ≥ 成交价,所有卖单价格 ≤ 成交价
  • 买卖双方都能成交——不能出现一方全成交、另一方全落空的情况

我在项目中遇到过一个问题:某次做市商策略在开盘时频繁报单,结果因为集合竞价规则没吃透,导致大量订单被「卡」在集合竞价阶段,错过了连续竞价的最佳时机。后来我专门花了一周时间研究各交易所的集合竞价规则,才彻底搞明白。

4.2 开盘价的确定过程

开盘价的确定,其实是一个「试错」的过程。交易所系统会这样操作:

  1. 收集订单:在集合竞价阶段(比如9:15-9:25),系统不断接收买卖双方的订单
  2. 计算潜在成交价:系统尝试每个可能的价格,计算对应的成交量
  3. 选择最优价格:选出成交量最大的那个价格
  4. 处理未成交订单:未成交的订单进入连续竞价阶段

举个例子,假设某股票在集合竞价阶段有以下订单:

价格 买单数量 卖单数量 累计买单 累计卖单 可成交量
10.00 100 50 100 50 50
10.01 200 100 300 150 150
10.02 150 200 450 350 350
10.03 80 300 530 650 530

你看,在10.02元这个价位,可成交量是350手,是所有价位里最大的。所以开盘价就是10.02元。

关键点:如果多个价格都能产生最大成交量,交易所通常会选择「最接近前收盘价」的那个。这个细节很多做市商容易忽略。

4.3 集合竞价算法实现

下面我给出一段简化的集合竞价算法代码。这其实是我早期做回测系统时写的,后来一直沿用至今。

def call_auction(buy_orders, sell_orders, prev_close):
    """
    集合竞价算法
    :param buy_orders: 买单列表,每个元素为 (price, volume)
    :param sell_orders: 卖单列表,每个元素为 (price, volume)
    :param prev_close: 前收盘价
    :return: (开盘价, 成交量)
    """
    # 1. 生成所有可能的价格点
    prices = set()
    for p, _ in buy_orders:
        prices.add(p)
    for p, _ in sell_orders:
        prices.add(p)
    prices = sorted(prices)
    
    # 2. 计算每个价格点的累计买单和累计卖单
    best_price = None
    max_volume = 0
    
    for price in prices:
        cum_buy = sum(v for p, v in buy_orders if p >= price)
        cum_sell = sum(v for p, v in sell_orders if p <= price)
        volume = min(cum_buy, cum_sell)
        
        # 3. 选择成交量最大的价格
        if volume > max_volume:
            max_volume = volume
            best_price = price
        elif volume == max_volume:
            # 4. 成交量相同时,选择最接近前收盘价的价格
            if abs(price - prev_close) < abs(best_price - prev_close):
                best_price = price
    
    return best_price, max_volume

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

  • 订单类型(限价单、市价单、冰山订单等)
  • 价格档位的精度(股票是0.01元,期货可能是0.2元)
  • 大额订单的拆分处理

实战技巧:做回测时,我建议你把集合竞价阶段的订单单独处理,不要和连续竞价混在一起。我曾经因为偷懒把两者合并处理,结果回测结果跟实盘差了十万八千里。

4.4 收盘价的确定

收盘价的确定机制跟开盘价类似,但有个重要区别:收盘集合竞价通常没有「价格发现」功能,更多是为了平滑收盘价格,防止尾盘操纵。

以A股为例,收盘集合竞价是这样的:

  • 14:57-15:00 是收盘集合竞价阶段
  • 这3分钟内不接受撤单
  • 最终收盘价就是集合竞价产生的价格

为什么要有这个机制?说白了,就是为了防止某些大户在最后几秒砸盘或拉盘。你想想看,如果没有集合竞价,尾盘那几秒钟的成交量可能被少数人控制,这对做市商来说风险太大了。

避坑指南:我曾经在收盘集合竞价阶段吃过亏。当时我挂了一个大单想平仓,结果因为集合竞价阶段不能撤单,价格瞬间被打到我的止损线以下,直接爆仓。后来我学乖了——收盘前5分钟就开始减仓,绝不拖到最后。

4.5 集合竞价中的做市商策略

做市商在集合竞价阶段能做什么?我总结了几条经验:

  1. 提前挂单:在集合竞价早期就挂出合理的买卖单,这样有机会成为「基准价格」
  2. 利用信息不对称:如果你对某个股票有深入研究,可以在集合竞价阶段提前布局
  3. 控制风险:集合竞价阶段的流动性通常较差,大单容易被「吃掉」,所以要控制单笔订单规模
  4. 关注撤单规则:不同交易所的撤单规则不同,有的允许撤单,有的不允许

我个人习惯的做法是:在集合竞价阶段挂出「双边报价」,即同时挂买单和卖单。这样不管价格往哪个方向走,我都能赚到买卖价差。当然,前提是你要对价格区间有准确的判断。

4.6 知识体系图

下面我用一张SVG图来总结本章的核心内容:

集合竞价机制知识体系 集合竞价机制 开盘价确定 集合竞价算法 收盘价确定 成交量最大原则 价格优先原则 订单收集 价格扫描 成交量计算 尾盘平滑 防操纵机制 做市商策略:提前布局 + 双边报价 + 风险控制

这张图把集合竞价的核心逻辑、算法实现和做市商策略串在了一起。你仔细看就会发现,其实所有环节都围绕着「成交量最大」这个核心目标展开。

最后说一句:集合竞价看似简单,但真正吃透的人不多。我建议你找个周末,用真实的历史数据跑一遍集合竞价回测,你会发现很多意想不到的规律。比如某些股票在集合竞价阶段的价格波动,其实跟前一天的资金流向高度相关。

专注资料整理