4. 集合竞价机制:开盘价与收盘价的确定、集合竞价算法
集合竞价,说白了就是交易所用来定开盘价和收盘价的那套规则。很多做市商朋友觉得这东西跟自己关系不大,其实不然——你想想看,每天开盘那几分钟的波动,往往能决定你一天的盈亏。我个人习惯在集合竞价阶段就提前布局,而不是等连续竞价开始再追。
4.1 集合竞价的核心逻辑
集合竞价的核心思想很简单:找一个价格,让成交量最大。这个价格就是所谓的「均衡价格」。嗯,这里要注意,不是所有交易所都用完全一样的规则,但底层逻辑是相通的。
具体来说,集合竞价要满足三个条件:
- 成交量最大——这是首要目标
- 所有买单价格 ≥ 成交价,所有卖单价格 ≤ 成交价
- 买卖双方都能成交——不能出现一方全成交、另一方全落空的情况
我在项目中遇到过一个问题:某次做市商策略在开盘时频繁报单,结果因为集合竞价规则没吃透,导致大量订单被「卡」在集合竞价阶段,错过了连续竞价的最佳时机。后来我专门花了一周时间研究各交易所的集合竞价规则,才彻底搞明白。
4.2 开盘价的确定过程
开盘价的确定,其实是一个「试错」的过程。交易所系统会这样操作:
- 收集订单:在集合竞价阶段(比如9:15-9:25),系统不断接收买卖双方的订单
- 计算潜在成交价:系统尝试每个可能的价格,计算对应的成交量
- 选择最优价格:选出成交量最大的那个价格
- 处理未成交订单:未成交的订单进入连续竞价阶段
举个例子,假设某股票在集合竞价阶段有以下订单:
| 价格 | 买单数量 | 卖单数量 | 累计买单 | 累计卖单 | 可成交量 |
|---|---|---|---|---|---|
| 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 集合竞价中的做市商策略
做市商在集合竞价阶段能做什么?我总结了几条经验:
- 提前挂单:在集合竞价早期就挂出合理的买卖单,这样有机会成为「基准价格」
- 利用信息不对称:如果你对某个股票有深入研究,可以在集合竞价阶段提前布局
- 控制风险:集合竞价阶段的流动性通常较差,大单容易被「吃掉」,所以要控制单笔订单规模
- 关注撤单规则:不同交易所的撤单规则不同,有的允许撤单,有的不允许
我个人习惯的做法是:在集合竞价阶段挂出「双边报价」,即同时挂买单和卖单。这样不管价格往哪个方向走,我都能赚到买卖价差。当然,前提是你要对价格区间有准确的判断。
4.6 知识体系图
下面我用一张SVG图来总结本章的核心内容:
这张图把集合竞价的核心逻辑、算法实现和做市商策略串在了一起。你仔细看就会发现,其实所有环节都围绕着「成交量最大」这个核心目标展开。
最后说一句:集合竞价看似简单,但真正吃透的人不多。我建议你找个周末,用真实的历史数据跑一遍集合竞价回测,你会发现很多意想不到的规律。比如某些股票在集合竞价阶段的价格波动,其实跟前一天的资金流向高度相关。