← 返回博客列表 Akuna Capital Intern OA 2026 攻略|HackerRank 70 分钟 Order Book + 概率题完整解析
Akuna Capital

Akuna Capital Intern OA 2026 攻略|HackerRank 70 分钟 Order Book + 概率题完整解析

2026-05-16

Akuna Capital 是芝加哥本土起家、专注期权做市的 prop trading 公司,在中国留学生圈知名度不如 Citadel / Optiver,但实习生招聘量却是同体量公司里最大的之一(2026 全球 ~90 个实习 offer,其中 SDE ~40 + Trader ~30 + Quant Research ~20)。

它的 OA 走 HackerRank,70 分钟 4-5 题,特点是编程 + 概率 + 业务知识混合——只刷 LeetCode 的同学经常 OA 通过但 onsite 挂掉。本文按 2026 春季最新候选人反馈,把 OA 题型、三个 track 差异、备考路径讲一遍。

Akuna Intern OA 概览

维度 详情
平台 HackerRank
时长 70 分钟
题量 4-5 题(含 MCQ + 编程)
难度 LC Easy/Medium 算法 + 2 道概率/数学 MCQ + 1 道场景题
通过线 编程题 90%+ AC 且 MCQ 全对
反馈周期 7-10 天
Next Step Super Day(3-4 轮 onsite,含 trading game)

重要变化:2026 cycle 起 Akuna 把 SDE / Trader / Quant Research 三个 track 的 OA 题库部分分开——SDE 偏算法 + 系统题,Trader / Quant 偏概率 + 心算。一份 OA 通常包含 2 道公共编程题 + 2-3 道 track-specific MCQ。

真题一:Order Book Simulator(SDE / Trader 共有)

题目描述

实现一个简化的 limit order book,支持以下指令:

ADD <order_id> <BUY|SELL> <price> <qty>
CANCEL <order_id>
PRINT

ADD 后必须立即做 matching:buy 与 sell 价格交叉则成交(按价格优先 + 时间优先),输出每笔成交 MATCH <buy_id> <sell_id> <price> <qty>

PRINT 输出 best bid / best ask 与各自挂单总量。

解题思路

经典 limit order book,用两个维护:

注意:HackerRank 上 70 分钟拿不完所有点,但只做 ADD + matching 部分通常够 80% AC。CANCEL 用 lazy deletion(id → cancelled set)即可,不要真的从 heap 里删。

Python 解法

import heapq
from collections import defaultdict

class OrderBook:
    def __init__(self):
        self.buy = []   # max heap: (-price, ts, id, qty)
        self.sell = []  # min heap: (price, ts, id, qty)
        self.qty = {}   # id -> remaining qty
        self.cancelled = set()
        self.ts = 0

    def _alive_top(self, heap):
        while heap and (heap[0][2] in self.cancelled or self.qty.get(heap[0][2], 0) == 0):
            heapq.heappop(heap)
        return heap[0] if heap else None

    def add(self, oid, side, price, qty):
        self.ts += 1
        self.qty[oid] = qty
        matches = []
        if side == "BUY":
            while qty > 0:
                top = self._alive_top(self.sell)
                if not top or top[0] > price:
                    break
                sp, sts, sid, sqty = top
                trade = min(qty, self.qty[sid])
                matches.append(("MATCH", oid, sid, sp, trade))
                qty -= trade
                self.qty[sid] -= trade
                self.qty[oid] -= trade
                if self.qty[sid] == 0:
                    heapq.heappop(self.sell)
            if qty > 0:
                heapq.heappush(self.buy, (-price, self.ts, oid, qty))
        else:  # SELL
            while qty > 0:
                top = self._alive_top(self.buy)
                if not top or -top[0] < price:
                    break
                bp, bts, bid, bqty = top
                trade = min(qty, self.qty[bid])
                matches.append(("MATCH", bid, oid, -bp, trade))
                qty -= trade
                self.qty[bid] -= trade
                self.qty[oid] -= trade
                if self.qty[bid] == 0:
                    heapq.heappop(self.buy)
            if qty > 0:
                heapq.heappush(self.sell, (price, self.ts, oid, qty))
        return matches

    def cancel(self, oid):
        self.cancelled.add(oid)
        self.qty.pop(oid, None)

    def best(self):
        b = self._alive_top(self.buy)
        s = self._alive_top(self.sell)
        bb = (-b[0], sum(self.qty[i] for _, _, i, _ in self.buy if i not in self.cancelled and -b[0] == -b[0])) if b else None
        sa = (s[0], sum(self.qty[i] for _, _, i, _ in self.sell if i not in self.cancelled)) if s else None
        return bb, sa

时间复杂度:amortized O(log n) per ADD :matching 时一定要先看 _alive_top——否则 heap 顶可能是已取消订单,会输出错误的 match。

真题二:Coin Flip Expected Value(Trader / Quant Research 共有)

题目描述(MCQ 风格)

一枚均匀硬币最多抛 10 次,但出现连续两次正面(HH)就停止。设 X = 抛掷总次数。求 E[X]。

解题思路

经典状态期望——设 $E_0$ = 当前没有连续 H 时还需要的期望次数,$E_1$ = 当前已经一次 H 时还需要的期望次数。

不带上限时:

$$E_0 = 1 + 0.5 E_1 + 0.5 E_0 \implies E_0 = 6$$

但题目有"10 次封顶"约束,要 倒推 DP

def expected_flips(N=10):
    # E[k][s]: 还剩 k 次时、当前状态 s (0 或 1 = 已 H) 的期望抛掷次数
    # 状态 2 = HH 已出现(吸收态,贡献 0)
    INF = N + 1
    dp = [[0, 0] for _ in range(N + 1)]
    # 边界 k = 0:再不抛了,期望 0;但如果还没出 HH,等价于强制结束
    for k in range(1, N + 1):
        # 状态 0:本次抛一次
        dp[k][0] = 1 + 0.5 * dp[k - 1][1] + 0.5 * dp[k - 1][0]
        # 状态 1:本次抛一次;若 H 则结束,T 则回到 0
        dp[k][1] = 1 + 0.5 * 0 + 0.5 * dp[k - 1][0]
    return dp[N][0]  # 起点:还剩 N 次,状态 0

print(expected_flips(10))  # ≈ 5.97

答案:约 5.97 次,逼近无上限的 6。 为什么这道题反复出现:Akuna 想确认你懂得把"最多 10 次"这一类有限边界用 backward DP 处理——不是简单套公式。

真题三:Pricing Permutations(SDE 偏 algo 题)

题目描述

给定一个长度 n 的浮点数组 prices,对每个位置 i,求"以 i 为起点、严格递增子序列"的乘积之和 mod 1e9+7(每条子序列贡献 ∏ prices[k])。约束:n ≤ 1000,prices ∈ (0, 1e6)。

解题思路

类似 LC 300 LIS 的 sum-of-product 变种:

Python 解法

MOD = 10 ** 9 + 7

def pricing_sum(prices):
    n = len(prices)
    f = [0] * n
    for i in range(n - 1, -1, -1):
        s = 1  # 子序列只含 i 自己
        for j in range(i + 1, n):
            if prices[j] > prices[i]:
                s = (s + f[j]) % MOD
        f[i] = int(prices[i] * s) % MOD
    return sum(f) % MOD

时间复杂度:O(n²),n=1000 完全 OK :浮点 × 整数模运算——题目通常承诺 prices 是整数;如果是浮点,最后取整再 mod。

三个 Track 的 OA 差异

Track 编程题 MCQ 重点 推荐准备
SDE 数据结构 + 系统题(order book、cache、graph) 时间复杂度、内存模型、并发基础 LC + CTCI System Design 章节
Trader 简化版编程 + 模拟 心算、概率、博弈论、做市基础 Heard on the Street + 100 Brainteasers
Quant Research numpy / pandas + 简单 stats 期望值、方差、布朗运动、option 定价直觉 Hull《Options》+ Cornell ORIE 课件

强烈建议:投递时只选一个 track——Akuna 的 ATS 会把"投三个 track"标记为"focus unclear",影响 recruiter screen。

备考时间表(4 周)

重点 资源
W1 LC Medium 50 题(heap / DP / graph) LeetCode 高频面经
W2 概率 100 题 + 心算 Heard on the Street + Akuna 历年 brainteaser
W3 Order Book / Trading 业务基础 Hull《Options》+ Akuna 官方博客 trading article
W4 Mock OA 2-3 次 + onsite trading game 模拟 一亩三分地 Akuna 真题贴

FAQ

Q1:Akuna Capital Intern OA 难度怎么样?

编程难度 LC Easy-Medium,但整体难在"通过线高 + 时间紧"。70 分钟 4-5 题,意味着平均每题 12-15 分钟必须做完。SDE candidate 通常报告编程题全做 + MCQ 错 1 个是过关阈值。

Q2:Akuna OA 可以用什么语言?

HackerRank 默认提供 Python / C++ / Java。Trader / Quant Research candidate 多用 Python(写得快),SDE 多用 C++(Akuna 工程团队偏 C++ 文化)。建议:选你能 70 分钟内 debug 完的语言,不要为了 culture fit 选不熟悉的

Q3:Akuna OA 不过还能再投吗?

12 个月内同一 track 不能重投,但换 track 可以(例如 SDE 挂了之后投 Quant Research)。Akuna 内部会保留之前 OA 成绩,所以第一次 OA 写得差,第二次门槛会变高——慎选 track。

Q4:Akuna OA 通过后多久 Onsite?

通常 1-2 周 进入 Recruiter Call → Super Day(一天连续 3-4 轮)。Super Day 包含一个 Trading Game:5-6 人组队,30 分钟内做市 + 套利。这是 Akuna 招牌环节——OA 拿满分但 Trading Game 表现差的 candidate 70% 被拒

Q5:Akuna Trading Game 怎么准备?

模拟做市,常见情景:(1)给定某 asset 的真实价格分布,你定一个 bid-ask spread;(2)市场会向你 hit 或 lift,你要动态调整 inventory。核心技巧:永远算 expected value、控制单笔损失上限、不要 chase prices。油管搜 "Akuna Trading Game" 有玩家复盘视频。

Q6:Akuna 实习生薪资如何?

2026 cycle 美国实习


联系方式

如果你正在准备 Akuna Capital、Optiver、IMC、Belvedere 这类期权做市 + prop trading 公司的实习 / 全职,OA 只是入门门槛——onsite 的 trading game + brainteaser 才是淘汰主力。我们整理了 2025-2026 cycle Akuna 真题 + Trading Game 复盘 + brainteaser 题库,欢迎联系交流。

立即添加微信 Coding0201获取 Akuna OA 真题与 Trading Game 模拟