Millennium 是全球资管规模 Top 5 的多策略对冲基金,旗下 ~300 个独立 PM pod。Quant Intern / NewGrad OA 是 pod 入口的第一道筛子,难度高、时间紧、口味偏「Pandas + 概率 + 数值优化」。本文整理 OA 三大主线的高频题型,附 Python 解法与 VO辅助 实战路径。
Millennium Quant OA 概览
| 维度 | 详情 |
|---|---|
| 平台 | HackerRank / 自研 IDE |
| 时长 | 90–120 分钟 |
| 题量 | 3–4 道(含 1 道 Pandas) |
| 难度 | LC Medium-Hard + 数值题 |
| 评分 | 自动判题 + 数值精度阈值 |
主线一:Pandas 数据处理
题目
df: [date, symbol, close, volume]。求每个 symbol 过去 20 日 VWAP 与今日 close 的 z-score。
import pandas as pd
import numpy as np
def vwap_zscore(df, window=20):
df = df.sort_values(['symbol', 'date']).copy()
df['pv'] = df['close'] * df['volume']
g = df.groupby('symbol', group_keys=False)
df['vwap20'] = g['pv'].rolling(window).sum().reset_index(0, drop=True) \
/ g['volume'].rolling(window).sum().reset_index(0, drop=True)
df['mean20'] = g['close'].rolling(window).mean().reset_index(0, drop=True)
df['std20'] = g['close'].rolling(window).std().reset_index(0, drop=True)
df['z'] = (df['close'] - df['mean20']) / df['std20'].replace(0, np.nan)
return df[['date', 'symbol', 'vwap20', 'z']]
注意:groupby + rolling 顺序、std 为 0 的处理。
主线二:概率推理
题目
抛 n 次硬币,正面概率 p。求至少 k 次连续正面的概率(用 DP)。
def prob_at_least_k_consec_heads(n, k, p):
# dp[i] = P(no run of k by step i)
dp = [0.0] * (n + 1)
dp[0] = 1.0
# 用「前 j 个里没有 k 连」的滚动 DP
no_run = [1.0] * (n + 2)
fail = [0.0] * (n + 2)
# f(n) = P(no k-run in n flips), 递推:
# f(n) = sum_{j=1..k} p^(j-1) * (1-p) * f(n-j) for n >= k - 1
f = [0.0] * (n + 2)
f[0] = 1.0
for i in range(1, n + 1):
s = 0.0
for j in range(1, min(k, i) + 1):
s += (p ** (j - 1)) * (1 - p) * f[i - j]
if i >= k:
f[i] = s
else:
f[i] = s + p ** i # 还能直接 i 次正面但不够 k
return 1.0 - f[n]
注意:f 的边界 i < k 要单独处理。Millennium 喜欢追问「为什么不能用蒙特卡洛 + 大数定律」——答案:OA 自动判题对精度阈值是 1e-6,蒙卡需要 1e8 次模拟才能稳过。
主线三:最优执行
题目
要在 T 个时间步内卖出 Q 股,每步成交量 q_t,单步 market impact ∝ q_t²。求最小总 impact(Almgren-Chriss 简化版)。
def optimal_execution(Q, T, lam=1e-3):
# 等量切分是最优解(无趋势 + 平方 impact)
q = Q / T
impact = T * lam * q * q
schedule = [q] * T
return schedule, impact
进阶版(出现率 ~30%)会附加风险厌恶 + drift 项,需要解 Almgren-Chriss 解析解;这部分可以在 OA 中给出公式说明 + 简化解法。
高频题速查
| 题型 | 频率 | 核心模板 |
|---|---|---|
| Pandas rolling + groupby | ★★★★★ | groupby_keys=False + reset_index |
| 概率 / 期望 DP | ★★★★ | 状态压缩 + 边界 |
| 最优执行 | ★★★★ | 等量切分 / Almgren-Chriss |
| 数值积分 | ★★★ | Simpson / Gauss-Legendre |
| Top-K + heap | ★★★ | heapq + 复杂键 |
VO辅助 实战路径
oavoservice 套餐
针对 Millennium Quant 这种 4–5 轮、Pandas + 概率 + 数值优化全维度考核:
- OA辅助:当天思路核对 + Pandas 性能优化 + 数值精度复盘
- VO辅助 mock:mentor 出 quant brain teaser、Pandas live coding、数学推导,全程录像
- VO代面:当天实时辅助,特别针对 PM 面 trading vibe 题
- 行为面剧本:Millennium pod 文化重视 "PM First Mentality"、"Risk Aware"
加微信 Coding0201 沟通方案与报价。
从 Pandas 卡顿到顺利通过 Millennium OA
这次很高兴帮这批同学顺利通过 Millennium Quant OA。很多同学反馈,自己刷 LeetCode 时根本练不到 Pandas + 数值精度 这两个 quant 特有维度,到 OA 当天看到 groupby + rolling + std=0 这种组合就慌。
如果你也在准备 Millennium、Citadel、Point72、Two Sigma 这类 multi-strat 对冲基金的 Quant Intern / NewGrad OA / VO,感觉一个人复习方向模糊,欢迎联系 oavoservice。我们会根据你的具体水平和弱点,提供专业的 OA / VO 实战辅助服务和一对一 VO辅助 指导。
FAQ
Millennium OA 用什么语言?
主流是 Python(Pandas 题强制)。少数 pod 接受 C++ / Q / kdb+。
Pandas 题精度阈值?
通常 1e-6。groupby 后 rolling.std() 在样本量不足时会 NaN,要正确处理。
Millennium VO 是和 PM 直接面吗?
是。一旦 OA + 第一轮通过,会直接被 1–3 个 pod 的 PM 抢,每个 pod 独立 onsite。
不同 pod 的 OA 一样吗?
OA 阶段共用题库;onsite 阶段每个 pod 自己出题,equity / fixed income / commodities 风格差异大。
正在准备 Millennium / 头部 multi-strat 的 Quant 面试?
👉 立即添加微信:Coding0201,获取 Millennium 高频题与 VO辅助 方案。
联系方式
Email: [email protected]
Telegram: @OAVOProxy