4. 最优买卖价查询

任务目标

在订单簿中维护买卖两侧的价格档位,实现 best_bid() 返回最高买价、best_ask() 返回最低卖价。价格档位为空时返回 None,并保证同一价格多次挂单只占一个档位。

实现思路

用两个字典保存价格到数量的映射:bids 存买单,asks 存卖单。查询最优价时对字典的键取 max / min。挂单时若价格已存在则累加数量,否则新建档位;数量减到 0 时删除该档位,避免空档影响最优价判断。

add_order(price, qty) 按 side 写入 bids/asks bids 字典 价格 → 数量 asks 字典 价格 → 数量 best_bid() max(bids) 或 None best_ask() min(asks) 或 None

完整代码

class OrderBook:
    def __init__(self):
        self.bids = {}  # 买价 -> 数量
        self.asks = {}  # 卖价 -> 数量

    def add_order(self, side, price, qty):
        book = self.bids if side == "buy" else self.asks
        book[price] = book.get(price, 0) + qty

    def remove_order(self, side, price, qty):
        book = self.bids if side == "buy" else self.asks
        if price not in book:
            return
        book[price] -= qty
        if book[price] <= 0:
            del book[price]

    def best_bid(self):
        return max(self.bids) if self.bids else None

    def best_ask(self):
        return min(self.asks) if self.asks else None

if __name__ == "__main__":
    ob = OrderBook()
    assert ob.best_bid() is None and ob.best_ask() is None

    ob.add_order("buy", 100.0, 5)
    ob.add_order("buy", 101.5, 3)
    ob.add_order("buy", 100.0, 2)   # 同价合并
    ob.add_order("sell", 103.0, 4)
    ob.add_order("sell", 102.5, 1)

    assert ob.best_bid() == 101.5
    assert ob.best_ask() == 102.5

    ob.remove_order("buy", 101.5, 3)  # 清空该档
    assert ob.best_bid() == 100.0

    ob.remove_order("sell", 102.5, 1)
    assert ob.best_ask() == 103.0

    print("best_bid =", ob.best_bid())
    print("best_ask =", ob.best_ask())

运行与验证

直接执行:python order_book.py。脚本内的 assert 覆盖了空簿、同价合并、最优价更新和档位清空四种情况,全部通过后打印:

best_bid = 100.0
best_ask = 103.0

判定标准:无 AssertionError 抛出,且输出与上述一致,即说明最优买卖价查询逻辑正确。