简介:诚奇、概率投资、海悦、天演、衍复、佳期、平方和、集微、九坤、凯读十家量化私募的笔试真题被集中整理,覆盖概率统计、算法设计、数学推导与编程实现等方向,面向量化研究员、量化开发及策略实习生等岗位求职者,便于快速对标各公司出题风格和难度层级。压缩包共75个文件,约48.4MB,以25张题目截图、9个Jupyter Notebook运行示例和8个txt问题描述为主,另有csv数据、Python脚本、PDF解析与Word文档等,覆盖读题、推演、编码到复盘完整流程。目前已有222人学习下载,适合用于笔试前的针对性训练与查漏补缺。每个公司题目均配有手写或截图版原题,部分附带Python参考解答、HTML答案解析及Notebook运行示例;多张2023年2月中旬的面试现场截屏还涉及策略项目、数据处理逻辑与基础模型思路。材料按公司归类存放,目录结构清晰,可按需查阅,方便按机构针对性复习。 秋招季前后,总有朋友来找我要“量化私募笔试真题”,这十家的合集我整理了整整一个多季度,从概率题到机器学习,从SQL到Python代码实现,基本上把能踩的坑都踩了一遍。今天把整理好的内容里最有价值的部分拆出来,配合参考答案和代码实现,给正在准备量化岗位笔试的朋友一份可以直接参考的资料。这篇东西适合谁?一是准备投递量化研究员、量化开发岗的应届生,二是想从传统开发转量化领域的技术人,三是已经在行业内但想跳槽的从业者。不管你是哪个阶段,刷真题的价值不在于背答案,而在于理解出题人的脑回路:他们要的不是你“知道”,而是你能在有限时间内把思路变成代码、把代码跑出结果。
1. 整体设计与选题思路拆解
1.1 为什么真题比刷LeetCode更有参考价值
量化私募的笔试和互联网大厂完全是两套逻辑。大厂考算法题看的是逻辑和代码功底,量化私募考的是你在“带噪声的环境下做决策”的能力。这批真题我按公司类型做了归类,有做中低频股票多头的,有做高频T+0的,还有偏机器学习驱动的。各家的题目侧重点差异很直观:高频团队重视C++和低延迟,股票多因子团队重视统计检验和pandas处理效率,机器学习团队则直接上模型推导和特征工程。所以你刷题之前,先想清楚自己投的是哪条线,别拿高频的题目练手去面基本面量化,方向不对,努力白费。
1.2 十家笔试中反复出现的三个能力维度
整理完这批题目,我发现不管哪家,都在考察三个维度:数学概率(40%左右)、编程实现(35%左右)、机器学习与策略思维(25%左右)。这个比例不是精确统计,但从题量分布来看基本稳定。数学概率类题目以抛硬币、掷骰子、随机游走为外壳,内核是期望计算、条件概率、鞅和停时;编程实现类题目不会让你写红黑树这类复杂数据结构,而是考察pandas用的熟不熟、能不能处理带有缺失值和异常值的真实数据;机器学习类题目主要围绕过拟合、因子有效性、模型选择展开,特别爱考“你怎么知道这个因子是有效的”这类开放性问题。后面几节我会按这三个维度逐一拆解。
2. 核心细节解析与高频考点
2.1 概率统计题:外壳是游戏,内核是期望与随机过程
这批真题里概率统计的出镜率最高,基本是笔试第一题。经典的外壳包括:反复抛一枚硬币,直到连续出现两次正面就停止,问期望需要抛多少次。这类题的背后是马尔可夫链的状态转移和期望方程。解法是这样的:设 E0 表示已经连续0次正面时还需要的期望次数,E1 表示已经连续1次正面时还需要的期望次数。列方程:
E0 = 1 + 0.5 * E0 + 0.5 * E1
E1 = 1 + 0.5 * E0 + 0.5 * 0
第一个式子表示:抛一次,有一半概率还是0次正面(继续从 E0 算),另一半概率进入 E1。第二个式子表示:抛一次,有一半概率回到 E0(出现反面),另一半概率连续两次正面达成目标,停时结束。解得 E0 = 6,也就是说平均需要抛 6 次。这类题要拿满分,光知道答案不够,你必须写出方程和每一步的推导逻辑,面试官会看你的思考过程是否严密。
随机过程方向,有几家公司考了布朗运动相关的基础题,比如求 E[W(t)^2] 这类,本质是伊藤等距公式的简单应用。还有一道题出了随机游走首次回归原点的概率,这背后是反射原理。如果时间不充裕,优先把离散鞅和停时定理搞懂,连续时间随机过程笔试很少深入,面试才可能问。
2.2 时间序列与因子检验:你以为是金融,其实是统计
另一类高频概率题是时间序列相关的统计检验。某家公司的题目是:给你两个时间序列,怎么判断它们有没有协整关系?这个题目考察的不只是跑一个 ADF 检验,而是检验之后如何处理滞后阶数、如何处理残差序列的自相关。很多人在这一步翻车,因为调包太顺手,根本不看检验的前提条件和滞后阶数选择。
另外一道经典题是:因子 IC 均值 0.03,IR(信息比率)0.5,样本量 500,这个因子显著吗?这题考的是 IC 的标准误计算。IC 的标准误近似等于 1/sqrt(N),N 是样本期数。所以这里的 t 值 = 0.03 / (0.5 / sqrt(500)) ≈ 1.34,不显著。这道题几乎每年都有变体,必须掌握。
2.3 编程题:基本功之外,还要有数据直觉
编程题部分,十家公司的题目高度一致:围绕 pandas 做数据处理和因子计算。常见的有:
- 给一堆日线行情,计算过去20日收益率序列的滚动均值、滚动标准差、滚动夏普
- 给一个因子值和未来的收益,计算 Rank IC 和分组收益
- 用 SQL 实现 T+1 日收益的匹配
这类题目用 Python 写,核心在于向量化。我见过太多人在笔试时用 for 循环遍历每一行,结果数据量一大直接超时。量化数据处理的标准做法是用 pandas 的 shift、rolling、groupby、rank 来操作。
有一道让我印象深刻的编程题:给一个 DataFrame,包含几百只股票的日收益率,要求计算每只股票过去250个交易日的波动率,并筛选出波动率位于全市场后20%的股票。这题如果写 for 循环逐股处理,几行代码能跑完,但效率极低;正确做法是用 groupby 加 rolling 一次性算完。
3. 实操过程与核心环节实现
3.1 用蒙特卡洛验证概率题答案
概率题手算容易错,但你可以用代码验证。例如上面说的“连续两次正面停止”,用蒙特卡洛模拟一千万次,期望值会收敛到6.0左右。作为笔试时的自查手段,这个方法极其有效。代码如下:
import random import numpy as np def simulate_once(): steps = 0 consecutive = 0 while True: steps += 1 if random.random() < 0.5: consecutive += 1 if consecutive == 2: return steps else: consecutive = 0 N = 1_000_000 results = [simulate_once() for _ in range(N)] print(f"模拟期望: {np.mean(results):.4f}")模拟一次游戏的平均值大约在6.0附近,和你手算的方程解完全对得上。笔试时如果时间富余,写一段这样的模拟来验证手算结果是个很好的策略。但注意不要过度依赖,因为每次模拟的时间开销不小,一旦数据量过大,反而影响你后面的答题。
3.2 因子 Rank IC 的计算:一行代码讲清楚
Rank IC 是量化研究面试必问的概念,它衡量的是因子值与未来收益之间的秩相关性。笔试里经常要求手写计算逻辑。最直接的方法是:
import pandas as pd from scipy.stats import spearmanr # df 长表结构: date, stock, factor, forward_return df = pd.DataFrame({ 'date': ['2024-01-01']*3 + ['2024-01-02']*3, 'stock': ['A','B','C']*2, 'factor': [0.5, 0.8, 0.2, 0.7, 0.4, 0.9], 'forward_return': [0.01, 0.03, -0.01, 0.02, -0.02, 0.04] }) def calc_rank_ic(sub_df): return spearmanr(sub_df['factor'], sub_df['forward_return']).statistic rank_ic_by_day = df.groupby('date').apply(calc_rank_ic) print(rank_ic_by_day.mean())这段代码的逻辑是:按日期分组,每个截面算一次因子值和未来收益的秩相关,再把所有截面的 Rank IC 取均值。注意点在于 spearmanr 的 statistic 属性,老版本 scipy 是 correlation,新版本改名叫 statistic,这里我踩过一次坑,笔试时如果用的是在线环境,建议先跑一下确认属性名。另外,真实数据里经常有 NaN 因子值和涨跌停导致的无收益样本,spearmanr 默认会剔除 NaN,但你要在答题前说明你的处理方式,这能看出你有没有真实处理过数据。
3.3 最小回测框架:用向量化实现策略回测
有一家公司的编程题是:用一天的时间内,写一个简单的均线策略回测框架。均线策略的逻辑很常见:当短期均线向上穿越长期均线时买入,反之卖出。这个题目用纯 pandas 向量化处理很快:
import pandas as pd import numpy as np # 模拟价格数据 np.random.seed(42) dates = pd.date_range('2024-01-01', periods=500, freq='D') price = pd.Series(np.cumprod(1 + np.random.normal(0.0003, 0.01, len(dates))), index=dates) short_ma = price.rolling(5).mean() long_ma = price.rolling(20).mean() position = pd.Series(0, index=price.index) position[short_ma > long_ma] = 1 # 策略收益 = 持仓 * 当日收益率 ret = price.pct_change().fillna(0) strategy_ret = position.shift(1) * ret # 用昨天的持仓信号避免未来函数 cum_ret = (1 + strategy_ret).cumprod() - 1 print(f"策略累计收益: {cum_ret.iloc[-1]:.4f}")这个题目的关键考点在 position.shift(1)。很多新手直接拿 position 乘以当日收益,这相当于用了当天收盘信号买当天收益,是典型的未来函数。笔试时如果出现这部分,面试官基本一眼就能看出你有没有真做过回测。shift(1) 的本质是假设你用当天收盘后的信号,在次日开盘或收盘时执行交易。另外一个隐藏考点是 NaN 处理:rolling(20) 的前19个值是 NaN,这些位置的持仓信号默认是0,也就是空仓。判断这个做法是否符合实际情况,需要你在答题里说明白。
3.4 过拟合的识别与正则化:机器学习题的参考答案
机器学习题里出镜率最高的是:给定一个因子数据集,你发现训练集上IC很高,但样本外IC几乎为0,请列举可能的原因和解决方案。答这道题需要结构化的思路。原因方面要分点展开:第一,数据泄漏,比如用了未来信息做特征,如果你构建因子时不小心用了全样本的均值做标准化,就是一种泄漏;第二,多重比较问题,你尝试了几百个因子,总有几个碰巧在训练集显著;第三,模型容量过大,直接导致过拟合噪声;第四,市场状态变化,训练集和市场样本外所处的市场环境不同,比如一边是大盘上涨,一边是震荡下行。解决方案建议按顺序说:先用严格的时序切分做样本外验证,再看特征构建里有没有引入未来函数,然后缩减特征数量、提高正则化强度,最后用组合维度检验,也就是多个因子共同回测后的衰减情况。
这题没有标准答案,但结构清晰的回答能拿到大部分分数。我在整理真题时发现,回答得好的求职者通常会在结尾补充一句:“我还会检查因子在极端行情下的表现,尤其是2015年和2024年年初流动性危机期间因子是否失效。”这句话能让面试官觉得你真的在市场上摸爬滚打过。
4. 常见问题与排查技巧实录
4.1 常见的失分点:不是你不会,而是你不够仔细
整理这批真题答案的过程中,我统计了十几个朋友反馈的失分情况,多数集中在三个位置。
第一个失分点是概率题只给答案不给过程。很多题目答案只是一个数字,比如6次、1/3、0.382,但笔试评审通常要求过程分。你写清楚方程、列出每一步推导,即使最后计算错了一个数字,也能拿70%分数。第二个失分点是编程题忽略输入数据的边界情况。真实数据不是教科书数据,会有停牌造成的NaN、极端值、重复索引。如果你写的代码假定输入绝对干净,在数据预处理环节没有做缺失值处理,面试官会追问。第三个失分点是时间分配不当。有不少人在第一道编程题上花了一小时,导致后面机器学习开放题只能写三行字。量化笔试总共大概两小时,我的建议是:概率题每题控制在15分钟内,编程题每题25分钟,开放题留足30分钟。
4.2 环境准备清单:别让IDE拖你后腿
在线笔试平台这两年用的越来越多,环境跟本地差别很大。我自己的经验是提前做三件事。第一,熟悉常见库的版本差异:pandas 的 groupby.apply 行为在1.x和2.x之间有过调整,scipy 的 spearmanr 返回值也变过属性名,这些影响不大,但一碰上就麻烦。第二,测试一个最小数据集,确认平台支持 scipy、statsmodels 这些库,有的平台环境比较精简,要用 importlib.metadata 或 pip list 提前确认。第三,提前准备代码片段库:滚动均值、去极值、标准化、Rank IC 这些常用函数可以提前写好,笔试时直接复制粘贴修改。这不算是作弊,因为真正的核心思路还要你自己在考场上理清。
4.3 不同公司的出题风格差异
整理十家公司真题时,我发现风格差异比想象中大。中低频股票多头团队特别爱出统计检验题和因子分析题,比如 ADF 检验、IC 衰减、分组收益,整体偏研究风格;高频团队爱出 C++ 和低延迟系统相关的题,比如无锁队列、内存池、缓存局部性,Python 占比少;机器学习驱动型团队爱出模型细节推导题,比如你解释一下 GBDT 的负梯度为什么能拟合残差、XGBoost 和 LightGBM 在直方图算法上的差异。所以投递前先研究目标公司特点,用错风格的笔试题准备方向,很吃亏。
5. 真题背后的核心技能:从应对笔试到胜任工作
5.1 一次笔试中的综合题演练
这里分享一道综合题,来自某家中低频量化公司的真题改编:给出一份日频数据,包含 open/high/low/close/volume 五列,要求构建一个日内均值回归因子,并检验该因子的单调性。解题路径可以这样展开:先用 close 除以日内均价(VWAP 的简化版),得到一个偏离度因子;然后按日计算该因子的 Rank IC;最后看多空组合的累计收益曲线。这个过程中涉及 pivot_table、rolling、rank、corr 等全套操作。这道题的核心不是因子本身,而是你有没有一套完整的“构建—检验—可视化”闭环能力。现实中量化研究就是这个闭环在几千个因子上反复迭代。
5.2 学会用调试信息辅助答题
笔试时如果代码跑出来结果不对,调试信息是救命稻草。我整理真题答案时经常用的一招是:在关键计算步骤后打印 shape、head、dtype。比如你计算完 Rank IC 发现全是 NaN,先检查结果数据的前几行,看是不是 merge 时 key 有重复,或者 rolling 窗口越界。打印法是排查问题最高效的方法,比反复看代码快得多。另一个技巧是用 assert 检查关键约束条件,比如 assert df[‘date’].is_monotonic_increasing 确保时间序列有序。这在实际工作中同样是加分项。
6. 最后的实操建议
真题刷完一遍不叫完,要按“限时模拟—对照复盘—二次模拟”的顺序反复做。第一遍模拟时最好严格计时,手机扔旁边,模拟真实考场。复盘时重点记录哪些题卡住了、为什么卡住,是知识盲区还是思路不清晰。第二遍只做错题和卡壳题。这个方法被我这几年辅导过的求职者验证过,效果比盲目刷十遍新题好得多。还有一个小技巧:整理一份自己的“量化笔试速查卡”,把常用统计量公式、pandas 操作模式、机器学习模型要点写在一起,考前翻一遍,能有效稳定心态。毕竟笔试考的不只是知识,还有你在压力下组织思路的能力。
本文还有配套的精品资源,点击获取