
1) 【一句话结论】证券交易撮合算法以“价格优先、时间优先”为核心规则,需根据市场规则(如科创板市值优先、创业板涨跌停规则)动态调整,优化方向包括引入多维度优先级(如市值、订单量)或动态规则,以平衡效率与公平性,适应不同交易场景。
2) 【原理/概念讲解】老师可以解释,撮合算法是交易系统匹配买卖订单的核心逻辑。价格优先规则:在买卖双方中,同方向(买或卖)订单里,价格最接近市场价格的优先匹配(比如买方中价格最高的先匹配,卖方中价格最低的先匹配);时间优先规则:当价格相同时,先提交的订单优先成交。类比的话,就像排队买咖啡,先到的(时间优先)和价格合适的(价格优先)优先,两者结合保证公平。具体来说,市场价是当前买卖订单的匹配价格,比如买单中最低价(买方出价最低)和卖单中最高价(卖方要价最高)的交集就是市场价,撮合时比较这个价格是否满足成交条件(买价≥卖价)。
3) 【对比与适用场景】
| 算法类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 价格优先 | 同方向订单中,价格最接近市场价格的优先成交(买方最高价,卖方最低价) | 价格驱动,成交价格更贴近市场,可能引发价格剧烈波动 | 常规市场(如主板、创业板非特殊时段) | 需防范价格操纵,如大额订单导致价格跳涨 |
| 时间优先 | 价格相同时,先提交的订单优先成交 | 时间驱动,减少价格波动,但可能延迟成交 | 特定时段(如创业板部分时段)、小单交易 | 可能导致小单延迟,影响流动性 |
| 科创板(市值优先) | 在价格优先基础上,若价格相同,按市值(如流通市值)排序,市值大的优先 | 结合市值维度,提升流动性,适应科创板高波动性 | 科创板市场 | 需明确市值计算方式(如流通市值、总市值),避免规则歧义 |
| 创业板(涨跌停规则) | 涨跌停时,采用“时间优先+价格优先”混合模式,或暂停价格优先 | 平衡涨跌停时的效率和公平,避免价格操纵 | 涨跌停时段 | 需设定涨跌停阈值,规则调整需符合监管要求 |
4) 【示例】
用伪代码模拟订单簿处理(含高并发优化说明):
订单簿结构:buy_orders = [( -price, timestamp, quantity ), ...](价格负数转为升序,方便优先队列按价格降序匹配),sell_orders = [( price, timestamp, quantity ), ...](价格正数转为降序)。
处理逻辑:
threading.Lock)保证队列操作线程安全,缓存订单簿(如Redis缓存最新价格和数量,减少数据库访问)。import threading
from queue import PriorityQueue
class OrderBook:
def __init__(self):
self.buy_orders = PriorityQueue() # 元素为 ( -price, timestamp, quantity )
self.sell_orders = PriorityQueue() # 元素为 ( price, timestamp, quantity )
self.lock = threading.Lock() # 线程安全锁
def add_order(self, side, price, quantity, timestamp):
with self.lock:
if side == 'buy':
self.buy_orders.put( (-price, timestamp, quantity) )
else:
self.sell_orders.put( (price, timestamp, quantity) )
def match_orders(self):
with self.lock:
while not self.buy_orders.empty() and not self.sell_orders.empty():
best_buy = self.buy_orders.queue[0] # ( -price, timestamp, quantity )
best_sell = self.sell_orders.queue[0] # ( price, timestamp, quantity )
buy_price = -best_buy[0]
sell_price = best_sell[0]
if buy_price >= sell_price:
# 成交
buy_price_val, buy_ts, buy_qty = best_buy[1:]
sell_price_val, sell_ts, sell_qty = best_sell[1:]
if buy_qty >= sell_qty:
# 买方数量大于卖方,卖方全部成交
self.sell_orders.get() # 移除卖单
remaining_qty = buy_qty - sell_qty
# 更新买单数量
self.buy_orders.queue[0] = (-buy_price_val, buy_ts, remaining_qty)
else:
# 卖方数量大于买方,买单全部成交
self.buy_orders.get() # 移除买单
remaining_qty = sell_qty - buy_qty
# 更新卖单数量
self.sell_orders.queue[0] = (sell_price_val, sell_ts, remaining_qty)
else:
break # 价格不匹配,停止匹配
5) 【面试口播版答案】
面试官您好,关于证券交易中的撮合算法,核心是价格优先和时间优先规则。价格优先是指买卖双方同方向订单里,价格最接近市场价格的优先成交,比如买方中价格最高的先匹配,卖方中价格最低的先匹配;时间优先则是价格相同时,先提交的订单优先。两者结合保证公平。价格优先的缺点是可能引发价格剧烈波动,比如大额订单导致价格跳涨;时间优先的缺点是成交效率可能受影响,比如小单延迟成交。针对不同场景,比如科创板,引入了“市值优先”规则——在价格优先基础上,若价格相同,按股票市值(如流通市值)排序,市值大的订单优先,因为科创板对市值有要求,提升市场流动性;创业板则在涨跌停时调整规则,比如涨跌停时采用“时间优先+价格优先”的混合模式,平衡效率和公平。优化算法时,可通过多维度优先级(如加入订单量、市值)或动态规则调整,比如根据市场波动调整优先级权重,确保算法适应不同交易场景。总结来说,撮合算法需根据市场规则动态调整,以平衡效率与公平性。
6) 【追问清单】
7) 【常见坑/雷区】