kimi-k2.6 在「实现股票交易撮合引擎」的评测结果
这是该 AI 模型在此测试用例上的详细评测结果。
基本信息
- 模型名称:kimi-k2.6
- 用例名称:实现股票交易撮合引擎
- 测试类型:文本生成
- 评测维度:代码生成
系统提示词(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()` - 返回当前未成交的挂单情况 - 返回格式:
评测结果
综合得分
该模型在此用例的得分为:95.2 分(满分 100 分),已通过
基础难度评测结果
- 得分:95.2 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
以下是一个基于 **Python** 实现的**股票交易限价单撮合引擎**。设计遵循严格的**价格-时间优先**原则,采用**面向对象**分层架构,核心逻辑通过**双优先队列(堆)+ 懒删除**实现,并包含完整的参数校验与边界处理。 --- ## 一、核心设计思路 | 组件 | 职责说明 | |---|---| | `Order` | 订单实体,记录订单 ID、方向、价格、剩余数量、时间戳 | | `MatchingEngine` | 撮合引擎,管理买单/卖单队列,执行撮合、撤单、快照查询 | | ** buys 堆 ** | 最小堆模拟最大堆(存储 `-price`),按**价格降序、时间升序**排列 | | ** sells 堆 ** | 最小堆,按**价格升序、时间升序**排列 | | **懒删除机制** | 订单完全成交或撤销后,仅从 `active_orders` 字典移除;堆内残留数据在下次访问堆顶时被惰性清理,保证 $O(\log N)$ 的撮合效率 | --- ## 二、完整代码实现 ```python import heapq from typing import List, Dict, Optional from collections import defaultdict class Order: """ 订单实体类。 属性: order_id: 唯一订单标识 side: 'buy' 或 'sell' price: 委托价格(> 0) quantity: 剩余未成交数量(> 0) timestamp: 单调递增时间戳,用于时间优先排序 original_quantity: 原始委托数量(仅用于记录) """ def __init__(self, order_id: str, side: str, price: float, quantity: int, timestamp: int): self.order_id = order_id self.side = side self.price = price self.quantity = quantity self.timestamp = timestamp self.original_quantity = quantity class MatchingEngine: """ 限价单撮合引擎。 撮合规则: 1. 价格优先:买高卖低优先成交; 2. 时间优先:同价格下先挂单者优先; 3. 成交条件:买价 ≥ 卖价时触发; 4. 成交价格:以被动方(先挂出的一方)价格成交; 5. 数量匹配:取买卖双方较小值成交,剩余订单继续挂单。 """ def __init__(self): # 活跃订单池:order_id -> Order;已从本字典移除的订单视为失效(懒删除) self.active_orders: Dict[str, Order] = {} # 买单堆:元素格式 (-price, timestamp, order_id),利用最小堆模拟价格最大堆 self.buys_heap: List[tuple] = [] # 卖单堆:元素格式 (price, timestamp, order_id) self.sells_heap: List[tuple] = [] # 单调递增时间戳发生器,保证时间先后可比 self._ts_counter = 0 def _next_timestamp(self) -> int: """生成下一个单调递增时间戳。""" self._ts_counter += 1 return self._ts_counter def _validate_order_input(self, price: float, quantity: int, order_id: str) -> None: """ 校验订单入参的合法性。 异常: ValueError: 价格/数量非法、订单ID重复等 """ if not isinstance(price, (int, float)) or price Optional[Order]: """ 获取当前有效的最优买单(价格最高、时间最早),并清理堆顶已失效的残留数据。 返回: Order: 有效买单对象;若队列空或无有效订单则返回 None """ while self.buys_heap: neg_price, ts, oid = self.buys_heap[0] # 检查该订单是否仍在活跃池且剩余数量 > 0 if oid in self.active_orders and self.active_orders[oid].quantity > 0: return...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【CLAUDE】这是一个高质量的股票撮合引擎实现。核心撮合逻辑严格遵循价格-时间优先原则,被动方价格规则实现正确,部分成交处理精准。接口设计完整且符合规范,返回格式标准。代码采用面向对象架构,数据结构选择合理(双堆+懒删除),边界校验全面,测试用例覆盖充分。文档注释详尽,可读性强。整体达到了生产级基础撮合引擎的实现水准,完全满足题目要求并有所超越。 【GEMINI】这是一份非常优秀的实现。不仅逻辑准确,而且在工程实践上表现出色,特别是对撮合引擎中‘被动方成交价’这一细节的把握非常精准。懒删除机制的使用体现了作者对高性能数据结构的深刻理解。测试用例详尽且具有针对性,完全符合资深量化交易系统工程师的水平。 【KIMI】整体实现质量很高,核心撮合逻辑正确,接口完整,代码结构清晰。测试用例覆盖了主要场景,验证了实现的正确性。一些小的改进点:1. 可以考虑将时间戳生成改为基于实际时间,而非单调递增的自增计数器,以更贴近实际场景。2. 懒删除机制虽然提高了效率,但在极端情况下可能会导致堆中残留大量无效数据,可以考虑定期清理无效数据,以保持堆的紧凑性。
进阶难度评测结果
- 得分:95.8 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
```python import heapq from dataclasses import dataclass, field from typing import List, Dict, Optional # ------------------------------------------------------------------ # 核心数据结构 # ------------------------------------------------------------------ @dataclass class OrderNode: """ 订单链表节点。 使用双向链表是为了在取消订单时实现 O(1) 移除,无需遍历。 """ order_id: str side: str # 'BUY' or 'SELL' price: float quantity: int order_type: str # 'LIMIT' or 'MARKET' seq: int # 全局递增序列号,严格保证时间优先 prev: Optional['OrderNode'] = field(default=None, repr=False) next: Optional['OrderNode'] = field(default=None, repr=False) class PriceLevel: """ 价格档位:管理同一价格的所有订单。 采用双向链表 + 哨兵节点,保证: 1. 尾部追加(新订单)为 O(1) 2. 头部弹出(撮合成交)为 O(1) 3. 任意节点移除(撤单)为 O(1) 同档位内天然按时间优先(FIFO),因为总是追加到尾部、从头部弹出。 """ def __init__(self, price: float): self.price = price self.size = 0 # 哨兵节点,简化边界处理 self.head = OrderNode("", "", 0.0, 0, "", -1) self.tail = OrderNode("", "", 0.0, 0, "", -1) self.head.next = self.tail self.tail.prev = self.head def append(self, node: OrderNode) -> None: """将新订单追加到尾部(时间优先:先到的在前,后到的在后)""" node.prev = self.tail.prev node.next = self.tail self.tail.prev.next = node self.tail.prev = node self.size += 1 def peek(self) -> Optional[OrderNode]: """查看队列头部(最早进入、最优先成交的订单)""" if self.is_empty(): return None return self.head.next def popleft(self) -> OrderNode: """从头部弹出订单(被动单完全成交时调用)""" if self.is_empty(): raise IndexError("pop from empty price level") node = self.head.next self.remove(node) return node def remove(self, node: OrderNode) -> None: """O(1) 移除指定节点(撤单时调用)""" # 只有当节点仍在链表中时才操作,防止重复移除 if node.prev is not None and node.next is not None: node.prev.next = node.next node.next.prev = node.prev node.prev = node.next = None self.size -= 1 def is_empty(self) -> bool: return self.size == 0 @dataclass class Trade: """成交记录""" taker_order_id: str # 主动方(Incoming Order) maker_order_id: str # 被动方(订单簿中已有挂单) price: float # 以被动方(Maker)价格成交 quantity: int class MatchingEngine: """ 股票撮合引擎(支持限价单与市价单)。...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【CLAUDE】这是一份高质量的股票撮合引擎实现。核心优势在于:(1)撮合逻辑严格遵循金融交易规范,价格-时间优先与成交价格规则实现准确;(2)数据结构设计精妙,堆+字典+双向链表的组合达到理论最优复杂度,且有详尽的架构文档说明;(3)边界条件处理全面,包括市价单无对手盘、撤单异常、输入校验等;(4)代码注释专业详尽,可读性与可维护性极佳;(5)测试用例覆盖全面,验证了所有功能点与边界场景。代码可直接运行且通过所有测试,满足「完整可运行」的要求。唯一微小不足是未显式处理浮点数精度问题,但在实际金融系统中通常使用整数表示价格,实际影响有限。整体达到优秀水平,适合作为教学示例或生产系统原型。 【GEMINI】这是一份教科书级别的撮合引擎实现。模型不仅准确理解了金融交易的核心规则(如价格-时间优先、被动成交价),还在数据结构设计上展现了深厚功底,通过堆与双向链表的组合完美平衡了撮合效率与撤单效率。代码鲁棒性极高,测试用例详尽,完全符合资深架构师的角色设定。 【KIMI】代码实现了股票交易撮合引擎的核心功能,包括限价单和市价单的撮合逻辑。数据结构和算法选择合理,满足了时间复杂度要求。测试用例覆盖全面,验证了代码的正确性和功能完整性。代码结构清晰,注释详细,可读性和健壮性较好。但市价单剩余部分处理存在逻辑问题,需要修正。部分注释也不够清晰,有改进空间。总体而言,代码实现了题目要求的主要功能,但在一些细节上还需优化和完善。
困难难度评测结果
- 得分:84.2 分
- 通过状态:已通过
模型生成产物
以下是该模型针对此任务的实际生成内容:
以下是一份接近工业级的高性能股票撮合引擎实现。采用 **Rust** 编写,核心设计要点如下: | 设计维度 | 选型与理由 | |---------|-----------| | **订单簿** | `BTreeMap>`(红黑树 + 双端队列)。• 价格维度:`BTreeMap` 保证 O(log P) 插入/删除/取极值,P 为价格档位数量。• 时间维度:同价订单用 `VecDeque` 维护,队首为最早订单,撮合取队首 O(1),尾部追加 O(1)。• 工业级升级路径:同价层深度极大时可替换为侵入式双向链表(C++ 常见),实现 O(1) 任意位置删除。 | | **订单索引** | `HashMap>`。O(1) 定位订单;`RefCell` 提供内部可变性,使订单簿与订单索引可在 Rust 借用规则下同时操作,避免锁竞争。 | | **精度** | 全程使用 `u64` 整数(Price 精度为分,`PRICE_SCALE = 100`),彻底杜绝浮点误差。 | | **并发策略** | **单标的串行化锁(Symbol‑Level Serializing Lock)**。引擎核心为单线程数据结构,外部以 `Arc>` 封装。同一股票所有操作串行执行,天然保证原子性、确定性与无死锁;跨股票完全并行,无线程竞争。 | | **撮合规则** | 价格优先 → 时间优先;成交价为**被动方挂单价**;市价单剩余自动撤销(IOC 语义)。 | | **冰山单** | 簿上仅暴露 `display_qty`;显示量耗尽后自动从 `hidden_qty` 补充,并**刷新时间戳**(移至同价队列尾部)。 | | **熔断** | 基于最新成交价相对参考价的百分比偏离;触发后拒绝所有新订单(返回 `CircuitBreakerSuspended`),保留已有挂单;支持冷却自动恢复与手动解除。 | | **集合竞价** | 窗口内收集订单不撮合;收盘时计算**最大成交量价格**,并按该价一次性批量成交;未成交限价单自动转入连续竞价。 | --- ```rust use std::cell::RefCell; use std::collections::{BTreeMap, HashMap, VecDeque}; use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; // ============================================================================= // 1. 基础类型与常量(精度控制) // ============================================================================= type OrderId = u64; type Price = u64; // 整数存储,精度 2 位小数(1元 = 100) type Qty = u64; type Timestamp = u64; // 微秒 const PRICE_SCALE: u64 = 100; fn now_us() -> Timestamp { SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_micros() as u64 } // ============================================================================= // 2. 枚举定义(状态机) // ============================================================================= #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum Side { Buy, Sell } #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum OrderType { Limit, Market, Stop, Iceberg } #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum OrderStatus { New, PartiallyFilled, Filled, Cancelled } #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum Phase { Continuous, CallAuction }...
AI 评审点评
以下是 AI 评审对该模型输出的点评:
【CLAUDE】这是一份高质量的股票撮合引擎实现,展现了扎实的系统设计能力和对金融交易规则的深刻理解。核心撮合逻辑正确,数据结构选型合理且有充分的技术论证,功能模块覆盖全面。代码在正确性、完整性和工程质量三个维度均达到良好水平,特别是在复杂业务规则(冰山订单刷新、止损级联触发、集合竞价三级定价)的实现上表现出色。主要扣分点在于:缺少题目明确要求的性能测试代码和并发场景验证,部分算法存在可优化空间(如同价层删除、集合竞价重建),以及工程化配套设施(日志/监控/错误处理)不够完善。整体而言,这是一份接近工业级标准的实现,但距离生产环境部署仍需补充性能验证、并发压测和运维工具支持 【GEMINI】这是一份非常优秀的量化交易系统设计实现。作者展现了深厚的 Rust 功底和对交易业务逻辑(如冰山单刷新、集合竞价定价算法、止损触发链)的深刻理解。核心数据结构选型非常专业,代码健壮性强。最主要的失分点在于未按照要求提供性能测试代码及指标输出,这对于评估‘高性能’引擎至关重要。如果能补充性能基准测试,将是一个近乎完美的方案。 【KIMI】整体而言,代码实现了题目要求的核心功能,覆盖了大部分功能模块和接口。订单撮合逻辑、熔断机制等关键功能实现较为准确。工程质量较高,数据结构选型合理,代码结构清晰。但在接口完整性、代码可读性和性能测试方面还有改进空间。建议进一步完善接口实现,增加注释和文档,优化代码逻辑,补充性能测试代码。
相关链接
您可以通过以下链接查看更多相关内容: