Optiver 是全球頂尖的做市商(Market Maker),其 OA 考察方向與傳統科技公司有顯著差異——除了標準的資料結構與演算法,還會融入交易邏輯、訂單簿模擬和機率推理等金融場景題。本文基於一畝三分地最新面經,系統拆解 Optiver OA 的核心題型與解題策略。
Optiver OA 概覽
| 維度 | 詳情 |
|---|---|
| 平台 | HackerRank |
| 時長 | 90 分鐘 |
| 題量 | 2-3 道程式題 |
| 難度 | Medium - Hard |
| 考察重點 | 模擬、貪心、數學推理、低延遲思維 |
題型一:Trading Sequences(交易序列分析)
題目描述
給定一組交易價格序列 prices[] 和交易量 volumes[],需要找出滿足特定條件的最優交易窗口。具體來說,你需要在序列中選擇一個連續子區間 [l, r],使得該區間內的加權收益最大化。
解題思路
這道題本質上是加權最大子陣列和的變體:
- 計算每個時間點的收益:
profit[i] = (prices[i+1] - prices[i]) * volumes[i] - 使用 Kadane's Algorithm 的變體求解最大連續子陣列和
- 注意邊界條件:交易窗口至少包含 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 模擬
題目描述
實現一個簡化的訂單簿系統,支援以下操作:
ADD side price quantity:新增限價單(side 為 BUY 或 SELL)CANCEL order_id:取消訂單MATCH:執行撮合,當最高買價 ≥ 最低賣價時成交
解題思路
這是一道設計 + 模擬題,核心資料結構選擇:
- 買單:使用最大堆(按價格降序)
- 賣單:使用最小堆(按價格升序)
- 訂單索引:使用 HashMap 支援 O(1) 取消
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 個交易機會,每個交易員有不同的資金上限和風險偏好。需要將交易機會分配給交易員,使得總收益最大化,同時滿足每個交易員的約束條件。
解題思路
這是一個貪心 + 排序問題:
- 將交易機會按收益率降序排列
- 對每個交易機會,找到能承擔該風險且資金充足的交易員
- 使用貪心策略分配
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
備考策略
核心能力要求
- 低延遲思維:Optiver 極度重視程式碼效率,O(n²) 在大資料量下不可接受
- 金融直覺:理解 bid/ask spread、order matching 等基本概念
- 邊界處理:交易系統對精度和邊界條件要求極高
- 並發意識:部分題目會考察對競態條件的理解
推薦練習題
| 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