← 返回部落格列表 Optiver OA 真題解析:Trading Sequences + Order Book 模擬|2026 面試攻略
Optiver

Optiver OA 真題解析:Trading Sequences + Order Book 模擬|2026 面試攻略

2026-05-12

Optiver 是全球頂尖的做市商(Market Maker),其 OA 考察方向與傳統科技公司有顯著差異——除了標準的資料結構與演算法,還會融入交易邏輯訂單簿模擬機率推理等金融場景題。本文基於一畝三分地最新面經,系統拆解 Optiver OA 的核心題型與解題策略。

Optiver OA 概覽

維度 詳情
平台 HackerRank
時長 90 分鐘
題量 2-3 道程式題
難度 Medium - Hard
考察重點 模擬、貪心、數學推理、低延遲思維

題型一:Trading Sequences(交易序列分析)

題目描述

給定一組交易價格序列 prices[] 和交易量 volumes[],需要找出滿足特定條件的最優交易窗口。具體來說,你需要在序列中選擇一個連續子區間 [l, r],使得該區間內的加權收益最大化。

解題思路

這道題本質上是加權最大子陣列和的變體:

  1. 計算每個時間點的收益:profit[i] = (prices[i+1] - prices[i]) * volumes[i]
  2. 使用 Kadane's Algorithm 的變體求解最大連續子陣列和
  3. 注意邊界條件:交易窗口至少包含 2 個時間點

Python 解法

def max_trading_profit(prices, volumes):
    n = len(prices)
    if n < 2:
        return 0
    
    profits = [(prices[i+1] - prices[i]) * volumes[i] for i in range(n-1)]
    
    max_profit = float('-inf')
    current_sum = 0
    
    for p in profits:
        current_sum = max(p, current_sum + p)
        max_profit = max(max_profit, current_sum)
    
    return max(0, max_profit)

時間複雜度:O(n)
空間複雜度:O(n)

題型二:Order Book 模擬

題目描述

實現一個簡化的訂單簿系統,支援以下操作:

解題思路

這是一道設計 + 模擬題,核心資料結構選擇:

Python 解法

import heapq

class OrderBook:
    def __init__(self):
        self.buy_orders = []
        self.sell_orders = []
        self.cancelled = set()
        self.order_map = {}
        self.order_id = 0
    
    def add(self, side, price, quantity):
        self.order_id += 1
        self.order_map[self.order_id] = (price, quantity)
        
        if side == 'BUY':
            heapq.heappush(self.buy_orders, (-price, self.order_id, quantity))
        else:
            heapq.heappush(self.sell_orders, (price, self.order_id, quantity))
        
        return self.order_id
    
    def cancel(self, order_id):
        if order_id in self.order_map:
            self.cancelled.add(order_id)
            return True
        return False
    
    def match(self):
        trades = []
        while self.buy_orders and self.sell_orders:
            while self.buy_orders and self.buy_orders[0][1] in self.cancelled:
                heapq.heappop(self.buy_orders)
            while self.sell_orders and self.sell_orders[0][1] in self.cancelled:
                heapq.heappop(self.sell_orders)
            
            if not self.buy_orders or not self.sell_orders:
                break
            
            best_buy = -self.buy_orders[0][0]
            best_sell = self.sell_orders[0][0]
            
            if best_buy >= best_sell:
                buy_order = heapq.heappop(self.buy_orders)
                sell_order = heapq.heappop(self.sell_orders)
                trade_qty = min(buy_order[2], sell_order[2])
                trades.append((best_sell, trade_qty))
                
                if buy_order[2] > trade_qty:
                    heapq.heappush(self.buy_orders, 
                        (buy_order[0], buy_order[1], buy_order[2] - trade_qty))
                if sell_order[2] > trade_qty:
                    heapq.heappush(self.sell_orders, 
                        (sell_order[0], sell_order[1], sell_order[2] - trade_qty))
            else:
                break
        
        return trades

時間複雜度:ADD O(log n),CANCEL O(1),MATCH O(k log n)
空間複雜度:O(n)

題型三:Allocation(資源分配)

題目描述

給定 n 個交易員和 m 個交易機會,每個交易員有不同的資金上限和風險偏好。需要將交易機會分配給交易員,使得總收益最大化,同時滿足每個交易員的約束條件。

解題思路

這是一個貪心 + 排序問題:

  1. 將交易機會按收益率降序排列
  2. 對每個交易機會,找到能承擔該風險且資金充足的交易員
  3. 使用貪心策略分配
def allocate_trades(traders, opportunities):
    opportunities.sort(key=lambda x: -x[2])
    assigned = [False] * len(traders)
    total_profit = 0
    
    for cap_req, risk, profit in opportunities:
        best_trader = -1
        min_excess = float('inf')
        
        for i, (capital, tolerance) in enumerate(traders):
            if not assigned[i] and capital >= cap_req and tolerance >= risk:
                excess = capital - cap_req
                if excess < min_excess:
                    min_excess = excess
                    best_trader = i
        
        if best_trader != -1:
            assigned[best_trader] = True
            total_profit += profit
    
    return total_profit

備考策略

核心能力要求

  1. 低延遲思維:Optiver 極度重視程式碼效率,O(n²) 在大資料量下不可接受
  2. 金融直覺:理解 bid/ask spread、order matching 等基本概念
  3. 邊界處理:交易系統對精度和邊界條件要求極高
  4. 並發意識:部分題目會考察對競態條件的理解

推薦練習題

LeetCode 題號 題目 對應考點
53 Maximum Subarray Trading Sequences
1353 Maximum Number of Events Allocation
295 Find Median from Data Stream Order Book
480 Sliding Window Median 價格窗口分析

FAQ

Optiver OA 用什麼平台?

Optiver 的 OA 通常在 HackerRank 上進行,時長約 90 分鐘,包含 2-3 道程式題。部分崗位(如 Trader)還會有額外的數學和機率測試環節。

Optiver OA 難度如何?和 LeetCode 相比是什麼水平?

Optiver OA 的程式題難度大約在 LeetCode Medium 到 Hard 之間,但題目風格偏向實際交易場景模擬,而非純粹的演算法競賽題。需要候選人具備一定的金融市場基礎知識。

Optiver SWE 和 Trader 的 OA 有什麼區別?

SWE 崗位的 OA 側重資料結構、演算法和系統設計能力;Trader 崗位則更注重數學推理、機率計算和心算速度。兩者都會涉及交易相關的場景題,但側重點不同。

Optiver OA 之後的面試流程是什麼?

通過 OA 後,通常會進入 HR 電話面試,然後是技術面試(1-2 輪),最後是 Superday(全天面試),包含系統設計、行為面試和團隊匹配環節。

如何準備 Optiver 的交易模擬題?

建議先了解基本的做市商概念(bid-ask spread、order book、market making),然後練習堆、優先佇列相關的 LeetCode 題目。同時可以參加 Optiver 的 Ready Trader Go 比賽來累積實戰經驗。


正在準備 Optiver OA?

oavoservice 提供專業的量化公司 OA/VO 輔助服務,覆蓋 Optiver、Citadel、Jane Street 等頂級做市商。我們的團隊成員來自各大量化機構,熟悉交易系統設計與演算法面試。

👉 立即添加微信:Coding0201獲取真題與輔助方案


聯繫方式

Email: [email protected]
Telegram: @OAVOProxy