Elephant 在「实现股票交易撮合引擎」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:Elephant
  • 用例名称:实现股票交易撮合引擎
  • 测试类型:文本生成
  • 评测维度:代码生成

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名资深量化交易系统工程师,熟悉金融交易所撮合引擎的核心设计原理。 回答要求: 1. 使用清晰的面向对象设计,代码结构层次分明,包含必要的注释 2. 严格遵循价格-时间优先原则,正确处理完全成交与部分成交两种场景 3. 对边界条件(如负数价格/数量、重复订单ID、订单不存在等)进行基本校验 4. 每个方法需说明其功能、参数含义及返回值格式 5. 提供至少3组测试用例验证撮合逻辑的正确性

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

请实现一个基础的股票交易限价单撮合引擎(Python 或 Java 均可)。 ## 背景说明 撮合引擎是交易所的核心组件,负责将买方和卖方的订单进行配对成交。 本题要求实现最基础的限价单撮合逻辑。 ## 核心规则 1. **价格优先**:买单中出价最高的优先成交;卖单中要价最低的优先成交 2. **时间优先**:相同价格的订单,先提交的先成交 3. **成交条件**:当买单价格 ≥ 卖单价格时触发撮合 4. **成交价格**:以被动方(挂单方)的价格成交(即先挂出的订单价格) 5. **部分成交**:若数量不匹配,数量少的一方完全成交,另一方保留剩余数量继续挂单 ## 需要实现的接口 ### 1. `addBuyOrder(price, quantity, orderId)` - 添加一笔限价买单,添加后立即尝试撮合 - 若发生成交,返回成交记录列表;若未成交,挂入买单队列 - 成交记录格式:`{「buyOrderId」: ..., 「sellOrderId」: ..., 「price」: ..., 「quantity」: ...}` ### 2. `addSellOrder(price, quantity, orderId)` - 添加一笔限价卖单,添加后立即尝试撮合 - 规则同上,方向相反 ### 3. `getOrderBook()` - 返回当前未成交的挂单情况 - 返回格式:

评测结果

综合得分

该模型在此用例的得分为:86.7 分(满分 100 分),已通过

基础难度评测结果

  • 得分:86.7 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

下面是一个基于 **Python** 实现的 **限价单撮合引擎**,采用 **面向对象设计**,遵循 **价格-时间优先** 原则,并支持 **完全成交** 与 **部分成交** 场景。 --- ## ✅ 功能说明 - 支持限价买单和卖单的添加与撮合 - 使用 **最小堆(sell)** 和 **最大堆(buy)** 实现价格优先 - 使用 **时间戳** 实现时间优先 - 支持订单 ID 去重 - 支持订单不存在、负数参数等边界校验 - 提供订单簿查询接口 --- ## 🧱 类设计 ```python import heapq from collections import defaultdict from time import time class Order: def __init__(self, price, quantity, order_id, timestamp, is_buy): self.price = price self.quantity = quantity self.order_id = order_id self.timestamp = timestamp self.is_buy = is_buy # True for buy, False for sell def __lt__(self, other): # For heap ordering: buy orders (max heap), sell orders (min heap) if self.is_buy: return self.price > other.price # Higher price first else: return self.price Order self.trade_history = [] # list of executed trades def add_buy_order(self, price, quantity, order_id): """ 添加买单并尝试撮合 :param price: float, 限价 :param quantity: int, 数量 :param order_id: str/int, 订单ID :return: list of dict, 成交记录列表 """ return self._add_order(price, quantity, order_id, is_buy=True) def add_sell_order(self, price, quantity, order_id): """ 添加卖单并尝试撮合 :param price: float, 限价 :param quantity: int, 数量 :param order_id: str/int, 订单ID :return: list of dict, 成交记录列表 """ return self._add_order(price, quantity, order_id, is_buy=False) def _add_order(self, price, quantity, order_id, is_buy): # 参数校验 if price = 卖单价格 if best_buy.price >= best_sell.price: trade_price = best_sell.price # 以卖单价格成交 trade_quantity = min(best_buy.quantity, best_sell.quantity) trade_record = { "buyOrderId": best_buy.order_id if best_buy.is_buy else best_sell.order_id, "sellOrderId": best_sell.order_id if not best_sell.is_buy else best_buy.order_id, "price": trade_price, "quantity": trade_quantity } trades.append(trade_record) # 更新订单数量 best_buy.quantity -= trade_quantity best_sell.quantity -= trade_quantity # 如果订单完全成交,弹出堆顶 if best_buy.quantity == 0: heapq.heappop(self.buy_orders) del self.order_map[best_buy.order_id] if best_sell.quantity == 0:...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】该实现是一个结构优良、易于阅读的撮合引擎原型。它正确处理了复杂的堆管理和部分成交逻辑,并在代码健壮性(校验)方面表现出色。然而,在金融业务逻辑的严谨性上稍有欠缺,特别是‘时间优先’的堆排序策略和‘被动方价格成交’的规则实现不准确。如果能将撮合逻辑改为‘先尝试匹配已有订单,匹配不完再入堆’,即可轻松解决被动方定价和时间优先的问题。 【KIMI】该撮合引擎实现了限价单撮合的核心逻辑,测试用例覆盖了主要场景,验证了代码的正确性。代码结构清晰,数据结构选择合理,可读性较好。但在注释方面还有改进空间,部分复杂逻辑缺少解释。总体而言,这是一个高质量的实现。

进阶难度评测结果

  • 得分:87.0 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

好的,作为资深量化交易系统架构师,我将为您实现一个符合规范的股票交易撮合引擎。 ### 核心设计思路 1. **数据结构选择**:使用 `SortedDict` (来自 `sortedcontainers` 库) 来存储买卖盘。其键为价格,值为该价格下的订单链表(`deque`)。 * **理由**:`SortedDict` 基于红黑树实现,查找、插入操作的复杂度均为 **O(log N)**,其中 N 是不同的价格档位数 (`M`)。这满足了题目对 `O(log M)` 时间复杂度的要求。`deque` 用于在相同价格下维护订单的时间优先顺序,插入操作为 O(1)。 2. **订单表示**:使用 `dataclass` 定义 `Order`,包含订单的基本属性,便于管理和比较。 3. **核心流程**: * **新单到达 (`add_order`)**: * **市价单**:循环与最优对手盘撮合,直到市价单被完全成交或对手盘耗尽(剩余部分直接取消)。 * **限价单**:循环与最优对手盘撮合,直到无法撮合(价格不满足条件)或订单被完全成交。将未成交的剩余部分插入订单簿。 * **撮合逻辑 (`_match`)**:从 `best_bid`/`best_ask` 开始,检查是否满足 `bid_price >= ask_price`。若满足,则取出两个订单中数量较小的一方进行成交,更新数量,处理完全成交或部分成交的情况。 4. **边界处理**:对零/负数数量、价格进行了校验;处理了撤销不存在订单、市价单无对手盘等情况。 ### 代码实现 ```python from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Deque, Dict, List, Optional, Tuple from collections import deque from sortedcontainers import SortedDict class TradingEngineError(Exception): """交易引擎自定义异常基类""" pass class InvalidOrderError(TradingEngineError): """无效订单异常""" pass class OrderNotFoundError(TradingEngineError): """订单未找到异常""" pass @dataclass(order=True) class Order: """ 订单数据类。 使用 order_id 作为 sort_index 确保在价格相同的情况下,后插入的订单在链表中排在后面, 从而满足时间优先原则(先提交的先处理)。 """ order_id: str symbol: str order_type: str # 'LIMIT' or 'MARKET' side: str # 'BUY' or 'SELL' price: float = 0.0 quantity: int = 0 filled_quantity: int = 0 timestamp: datetime = field(default_factory=lambda: datetime.now(timezone.utc)) # 用于排序的索引:主要按价格,其次按时间戳 sort_index: float = field(init=False, repr=False) def __post_init__(self): # 基础校验 if self.quantity bool: return self.filled_quantity >= self.quantity def remaining_quantity(self) -> int: return self.quantity - self.filled_quantity class MatchingEngine: """ 股票交易撮合引擎核心类。 使用 SortedDict (红黑树) 存储各价格档的订单队列。 - 插入订单到特定价格档: O(log M) (M为档位数) - 查找最佳买卖价: O(log M) - 遍历/删除档: O(1) per level 订单在相同价格下的插入和移除使用 deque,保证 O(1) 操作。 整体撮合流程在极端情况下 (如市价单横扫) 为 O(N log M),N为成交档位数。 """ def __init__(self): # 买单簿: 价格 -> deque[Order] (价格降序排列) # SortedDict...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】这是一份架构设计非常优秀的实现,展示了资深开发者的素养。使用了高性能的数据结构组合来满足交易所级别的时间复杂度要求。唯一的重大失误在于对买卖盘排序方向的处理:在买单簿中错误地取了最小值而非最大值作为最优价,这在金融交易系统中属于核心逻辑错误。不过,整体代码的可读性、健壮性和功能完整性都非常出色。 【KIMI】整体上,该实现基本满足了股票交易撮合引擎的核心功能和要求,限价单和市价单的撮合逻辑正确,功能点完整,代码结构清晰、可读性好。但在市价单处理和代码优化方面还有改进空间。

困难难度评测结果

  • 得分:82.4 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

## 高性能股票交易撮合引擎设计 本系统采用**价格-时间优先**原则,结合**高效数据结构**与**并发控制策略**,实现工业级交易撮合引擎。 --- ## 1. 核心类型定义与枚举 ```python from enum import Enum from dataclasses import dataclass, field from typing import List, Dict, Optional, Tuple from decimal import Decimal, getcontext import time import threading from heapq import heappush, heappop from collections import deque import bisect # 设置 Decimal 精度 getcontext().prec = 10 class OrderType(Enum): LIMIT = 1 MARKET = 2 STOP = 3 ICEBERG = 4 class OrderSide(Enum): BUY = 1 SELL = 2 class OrderStatus(Enum): PENDING = 1 FILLED = 2 CANCELED = 3 TRIGGERED = 4 # STOP 订单已触发 class MatchMode(Enum): CONTINUOUS = 1 CALL_AUCTION = 2 @dataclass(order=True) class Order: order_id: int side: OrderSide order_type: OrderType price: Decimal = Decimal('0') # 限价或触发价 quantity: Decimal = Decimal('0') # 剩余数量 display_qty: Decimal = Decimal('0') # 冰山订单显示数量 hidden_qty: Decimal = Decimal('0') # 冰山订单隐藏数量 timestamp: float = field(default_factory=time.time) # 用于时间优先 stop_price: Decimal = Decimal('0') # 止损触发价 is_activated: bool = True # 是否在订单簿中活跃 filled_quantity: Decimal = Decimal('0') avg_fill_price: Decimal = Decimal('0') ``` --- ## 2. 撮合引擎核心数据结构 ```python class OrderBook: def __init__(self): # 买方订单:按价格降序 -> 时间升序(最大堆模拟) # 使用负价格实现最大堆;时间戳作为第二排序键 self.buy_orders: List[Tuple[Decimal, float, Order]] = [] # (-price, timestamp, order) # 卖方订单:按价格升序 -> 时间升序(最小堆) self.sell_orders: List[Tuple[Decimal, float, Order]] = [] # (price, timestamp, order) # 哈希表用于快速查找订单(O(1) 查找) self.order_map: Dict[int, Order] = {} # 冰山订单队列:按到达顺序维护(用于补充隐藏量) self.iceberg_queue: deque = deque() # 锁:细粒度锁,按价格层级或订单粒度?此处采用**订单级锁**简化 # 实际工业级可用读写锁或无锁队列优化 self.lock = threading.RLock() def add_order(self, order: Order): """添加订单到订单簿,时间复杂度 O(log n)""" with self.lock: self.order_map[order.order_id] = order if order.side == OrderSide.BUY: # 使用负价格实现最大堆 heappush(self.buy_orders, (-order.price, order.timestamp, order)) else: heappush(self.sell_orders, (order.price, order.timestamp, order)) # 冰山订单加入队列 if order.order_type ==...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】该实现展示了深厚的 Python 开发功底和对交易系统的基本理解。代码结构优美,测试框架完备。然而,在核心金融业务逻辑上存在两处关键疏漏:一是熔断触发逻辑因变量更新顺序错误而失效;二是冰山订单的逻辑仅停留在数据定义层面,未在撮合循环中实际执行。集合竞价算法虽正确但效率较低。整体而言,作为一个原型设计非常优秀,但距离“工业级”在逻辑严密性上仍有差距。 【KIMI】整体而言,代码实现了题目要求的核心功能,覆盖了所有功能模块和接口,工程质量较高。在正确性、完整性和工程质量方面都表现良好,符合工业级股票交易撮合引擎的设计要求。

相关链接

您可以通过以下链接查看更多相关内容:

加载中...