
简介一份面向量化岗位的笔试题合集收录诚奇、概率投资、海悦、天演、衍复、佳期、平方和、集微、九坤、凯读十家国内活跃量化私募的典型题目覆盖概率统计、算法设计、数学推导、编程实现等方向也包含策略项目、数据处理与基础模型思路相关提问适合量化研究员、量化开发及策略实习生求职者按公司对标复习、查缺补漏。资源共75个文件压缩包约48.4MB文件以题目截屏png/jpeg、Jupyter Notebook运行示例ipynb、文本数据txt/csv、答案解析文档docx/pdf及Python参考代码为主每个公司单独归档目录结构清晰便于按机构定向检索。目前已有222人学习浏览。除原题截图外部分公司附带answer.py、answer.html和Notebook示例可直接对照运行多张2023年2月中旬的现场截屏还还原了策略项目、数据处理逻辑与基础模型思路的真实提问场景便于快速体察各家出题风格与难度层级进行笔试冲刺和面试复盘。 这两年量化私募笔试是肉眼可见地变卷。前几年手写个冒泡排序、问两个Python装饰器用法就能过第一轮现在一堆机构直接上贝叶斯分层模型、带gap的时间序列交叉验证、带约束的非线性最优化。我把自己反复刷到的十家主流机构笔试题目做了归类整理按考察方向拆成四类每道题都附上能跑的参考答案和核心代码实现。内容适合准备暑期实习和校招的朋友也适合在业内的同学拿来自测基本功——很多题看着简单真动手写才发现处处是坑。1. 笔试考察框架十家机构的出题风格画像1.1 四类题型的占比分布我整理的是近两年十家机构的笔试回忆版覆盖股票多空、高频、多因子、期货CTA几种主流策略方向。按题目数量做粗略统计分布大概是这样的题型类别占比典型考察点统计与概率30%贝叶斯估计、赌徒破产、鞅与停时机器学习与因子建模30%标签泄漏识别、时序交叉验证、特征重要性编程与算法25%最大回撤、TopK因子筛选、Tick数据聚合组合与风险管理15%均值方差组合、夏普比率显著性检验这个分布其实很能说明问题。量化私募要的不是“会调包”的人而是能在不确定性和噪声里做判断的人所以数学基础被放在了比编程更靠前的位置。1.2 各家机构出题的风格差异股票多空型机构更爱考多因子IC/IR、行业中性化、截面标准化这一类因为这些直接对应他们日常的策略研发流程。高频团队则更偏向数据结构和C内存布局有些甚至会让手写无锁队列的伪代码。CTA系机构把概率论和随机过程作为重头戏随机游走和停时相关的题出现频率特别高。注意这里说的“C手写队列”在Python为主的笔试里很少出现但如果目标机构是高频方向C基础基本是必选项。备考前先搞清楚目标机构的策略方向比盲目刷题重要得多。2. 统计与概率最容易被“常识”坑死的模块2.1 贝叶斯推断从硬币到因子胜率估计原题一枚硬币抛10次出现8次正面取Beta(1,1)先验求正面概率的后验期望和95%后验置信区间。这道题表面上是送分题但答错的概率比想象中高。Beta先验加二项分布似然后验就是Beta(18, 12) Beta(9, 3)。后验期望是 9/(93) 0.75不是很多人直觉上的0.8。先验起到了压缩估计的作用把极端频率往0.5方向拉了一点。from scipy.stats import beta n, k 10, 8 a, b_param 1 k, 1 (n - k) mean_p a / (a b_param) lo, hi beta.ppf([0.025, 0.975], a, b_param) print(f后验期望 p {mean_p:.4f}) print(f95% 后验置信区间 ({lo:.4f}, {hi:.4f}))运行结果p 0.7500区间约在 (0.508, 0.914)。这道题在实盘场景里的对应是因子胜率的小样本估计。一个新因子历史上只触发了几十次交易胜率看起来80%但样本太少直接用点估计去配仓很容易翻车。用贝叶斯压缩估计把胜率往基准水平收缩才是稳健的做法。笔试里能把这一层说出来比单纯写对公式加分不少。2.2 赌徒破产问题正期望也会爆仓原题初始资金为1每局以55%概率赢1、45%概率输1资金归零则爆仓。问玩到第1000局时爆仓的概率大概是多少这道题考的是“有限时间边界下的爆仓风险”。很多同学看到期望为正就条件反射地认为不会爆仓这恰恰是出题人埋的坑。正期望只说明长期收敛但有限时间内路径可能先撞到零。参考答案用蒙特卡洛模拟。要写就写向量化版本笔试时逐行循环的写法虽然逻辑更直观但10万次×1000局跑起来太慢实际在考场上容易等得心慌。import numpy as np N, T 100_000, 1000 p 0.55 cash np.ones(N, dtypeint) ruined np.zeros(N, dtypebool) for step in range(T): win np.random.random(N) p cash cash np.where(win, 1, -1) cash np.where(ruined, 0, cash) ruined | (cash 0) print(f1000局后爆仓概率约: {ruined.mean():.4f})跑出来的值一般在0.03到0.06之间不同随机种子会有波动。这里有个细节值得琢磨每一局先把盈亏加进去再把已爆仓账户的净值强制归零顺序不能反。如果先判断爆仓再更新资金爆仓之后又继续“交易”了模拟就失真了。这个结果对实盘的启示是哪怕策略胜率占优杠杆如果加得太满小概率爆仓事件在长时间运行下几乎必然发生。后续追问经常是“怎么降低爆仓概率”答案是降低单次下注比例本质上是凯利公式思想的简化版。3. 机器学习与因子建模最考验“实战意识”的部分3.1 时间序列交叉验证与未来函数原题给定一段日频收益序列要求构建训练集和验证集来评估因子IC问普通K折交叉验证直接用在时间序列上会出现什么问题请写出一个可用的时间序列样本外验证方法。这题至少一半人会踩坑。sklearn的KFold是随机打乱数据再划分的用在时间序列上训练集会混入验证集之后的数据相当于用未来信息去预测过去样本外IC虚高得离谱。实盘一上线就扑街很多时候就是这一步出了问题。标准做法是Walk-Forward验证严格按时间顺序扩展训练集并且加一个gap间隔防止标签在时间上重叠。import numpy as np def walk_forward_split(X, n_splits5, gap0): t len(X) step t // (n_splits 1) for i in range(1, n_splits 1): train_end i * step - gap val_start train_end gap if val_start t: yield np.arange(0, train_end), np.arange(val_start, min(val_start step, t)) # 用法示例1000个样本5折gap5 for train_idx, val_idx in walk_forward_split(np.zeros(1000), n_splits5, gap5): print(ftrain: {len(train_idx)} 样本, val: {len(val_idx)} 样本)gap参数专门用来处理标签重叠问题。比如用未来5日收益作为标签时训练集最后一天和验证集第一天在时间窗上有重叠信息会从验证集泄漏到训练集。gap设成5就能彻底切断这条泄漏路径。笔试时把这个细节讲清楚基本就能和其他考生拉开差距。3.2 标签泄漏的识别一道没有标准代码的送命题原题一个多因子模型训练集IC为0.08样本外IC只有0.01。给出三种可能原因。这类题没有标准答案但出现频率非常高。面试官想听的是你有没有真实建模经验而不是背名词。比较合理的三个角度数据清洗阶段用了全样本标准化。先拿全体数据算均值方差再切训练集这等于把验证集的信息渗进了训练集是最经典的未来函数之一。标签对齐错误。用T日因子去预测T日收益由于市场微观结构的原因T日收益里已经包含了T日的噪声因子和标签同时受同一个扰动影响看似IC高实盘却失效。特征选择环节用了验证集信息。有些同学在全部数据上先做一遍特征筛选再切分训练集验证集特征选择这一步就已经引入了未来信息。这种题的正确打开方式是结合自己做策略时踩过的坑来讲。哪怕只讲一个真实的“为什么我的因子从0.06掉到0.01”的排查过程也比背三个标准答案有说服力。4. 编程与算法现场手撕的硬功夫4.1 最大回撤最容易拿满分的送分题原题给定收盘价序列用O(n)时间复杂度求最大回撤以及回撤发生的区间。这题难度不高但很多考生只算了回撤数值没记录起止区间丢了步骤分。回撤的定义是从某个历史峰值到之后某个低点的最大跌幅。核心逻辑是动态更新峰值同时计算当前值相对峰值的回撤并持续跟踪最大值。def max_drawdown(prices): peak prices[0] max_dd 0.0 peak_idx 0 dd_start, dd_end 0, 0 for i, p in enumerate(prices): if p peak: peak p peak_idx i dd (peak - p) / peak if peak ! 0 else 0 if dd max_dd: max_dd dd dd_start peak_idx dd_end i return max_dd, dd_start, dd_end # 示例 prices [100, 98, 102, 95, 90, 105, 100] dd, start, end max_drawdown(prices) print(f最大回撤 {dd:.2%}区间 [{start}, {end}])输出为最大回撤11.76%区间为[2, 4]。要注意的是峰值索引要即时更新但不能在回撤段内重复记录起点。这道题在实际业务中的意义是风险评估和仓位控制回撤不只是一个统计指标还直接影响产品风控线和预警线。4.2 TopK因子筛选海量数据场景下的经典思路原题有10000个候选因子需要筛选出IC绝对值最大的前100个内存只能容纳5000个因子数据要求写算法思路。这题考的是海量数据处理的基本功。如果所有因子都能装进内存直接用heapq.nlargest就完事import heapq import random ic_values [random.random() for _ in range(10000)] top100 heapq.nlargest(100, ic_values) print(f前100个IC中最小值: {top100[-1]:.4f})但笔试的加分点在于要能讲清楚内存受限时的处理方案用大小为100的最小堆维护当前Top100遍历每个因子的IC值如果大于堆顶就替换最终堆里就是全局Top100。复杂度是O(N log K)N是因子总数K是100。这题背后是因子库管理的真实场景。实盘里因子数量经常上万每次全量排序既慢又耗内存用堆这种“流式”方法可以做到只扫描一遍还能应对因子不断新增的情况。写不出完整代码没关系把复杂度算清楚、把堆的替换逻辑说清楚这道题就稳了。5. 组合与风险管理权重不只是求解还要能落地5.1 带约束的最小方差组合原题给定三个资产的协方差矩阵和预期收益向量求在目标年化收益为8%、权重和为1、允许做空但单资产权重不超过50%的条件下最小方差组合的权重。import numpy as np from scipy.optimize import minimize mu np.array([0.10, 0.12, 0.15]) cov np.array([[0.04, 0.006, 0.002], [0.006, 0.09, 0.004], [0.002, 0.004, 0.16]]) target_return 0.08 n len(mu) cons [ {type: eq, fun: lambda w: w.sum() - 1}, {type: eq, fun: lambda w: w mu - target_return}, ] bounds [(-0.5, 0.5)] * n res minimize( lambda w: w cov w, x0np.ones(n) / n, methodSLSQP, boundsbounds, constraintscons, ) print(f最小方差组合权重: {res.x.round(4)}) print(f组合波动率: {np.sqrt(res.x cov res.x):.4f})运行结果中权重会出现负值说明允许做空时最优组合会利用卖空来对冲风险。这里要注意两点。第一scipy的SLSQP对初值比较敏感不同初始点可能收敛到不同局部最优解笔试题里可以多试几个初始点看看结果是否一致。第二必须检查返回结果的约束残差权重是否求和为1、组合收益是否真的等于目标收益。很多同学写完优化就直接抄结果没做约束校验面试官一问就露馅。这道题对应实盘中的组合构建环节。理论最优解往往不够鲁棒真实落地还要求权重在换仓时的变化尽量小否则交易成本会吃掉超额收益。5.2 夏普比率显著性与样本量原题某策略月度夏普比率为0.5样本观测36个月。求年化夏普比率并判断在5%显著性水平下是否显著异于零。年化夏普 月度夏普 × √12 0.5 × 3.464 ≈ 1.73。显著性检验用的是 t SR × √T 0.5 × √36 3.0大于1.96因此显著。这个计算背后有一个容易被忽略的公式夏普比率的t统计量约等于夏普比率乘以样本量的平方根。样本量对显著性影响极大36个月的月度数据看起来不少但如果月度夏普只有0.2t 0.2 × 6 1.2根本不显著。笔试高频追问是月度IR要达到多少才能在24个月内显著反推IR × √24 1.96得到 IR 0.4。这意味着一个两年实盘的策略月度信息比率连0.4都不到在统计上根本无法证明它有真本事。很多产品宣传的“年化跑赢基准10%”用这个框架一算可能是纯运气。6. 备考经验与避坑指南6.1 高频丢分点盘点丢分点常见表现应对建议时序数据用普通KFold直接用sklearn里的KFold做因子验证换成Walk-Forward并设置gap贝叶斯后验参数顺序写反把Beta(3,9)写成Beta(9,3)先写先验再叠加似然按顺序推导最大回撤只算数值不记录区间返回单一浮点数缺少起始和结束索引维护峰值索引和谷值索引两个变量优化结果不检查约束直接打印权重不验证权重和、目标收益打印res.success和约束残差蒙特卡洛模拟全用Python循环10万次模拟运行要几十秒用numpy向量化或降低模拟次数6.2 备考路线建议数学三件套建议优先复习概率论、数理统计和随机过程。重点不是背公式而是理解鞅、停时、大数定律和中心极限定理在投资场景里的含义。比如赌徒破产题本质上就是随机游走的停时问题。代码部分优先保证Numpy和Pandas的常见操作能闭眼写出来然后练手写逻辑题。最大回撤、滚动窗口均值、向量化信号计算这一类要做到不需要调试直接通过。机器学习部分不用追太深但交叉验证、正则化、过拟合这三个概念必须吃透尤其是时间序列场景下的应用。一个重要提醒笔试题目背熟了不代表能过面试。现在很多机构笔试通过后紧接着就是面试追问会拿着你写的代码问“为什么这里用均值而不是中位数”“如果数据量扩大100倍这个方案还成立吗”。准备笔试时最好每道题都自己动手改一改换数据、换参数、换场景跑一遍把背后的原理彻底消化。最后再分享一点个人体会这些真题看着是题实际上每一道背后都挂着一个真实的业务痛点。贝叶斯题对应的是小样本因子胜率估计交叉验证题对应的是上线过拟合防御最大回撤对应的是仓位控制组合优化对应的是实盘落地的约束条件。我在实际准备时每做完一道题都会问自己这个问题的数据规模、噪声水平、业务约束在实盘里是什么样我的实现能不能扛得住想明白了这些笔试就不只是应试而是真的在补基本功。本文还有配套的精品资源点击获取