恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
量化私募笔试真题汇总:算法、概率与金融指标全解析
首页
资讯中心
/
量化私募笔试真题汇总:算法、概率与金融指标全解析
量化私募笔试真题汇总:算法、概率与金融指标全解析
发布时间:2026/10/18 15:57:17
简介一份面向量化求职者的十家主流量化私募笔试真题汇总涵盖诚奇、概率投资、海悦、天演、衍复、佳期、平方和、集微、九坤、凯读等机构的典型考题适合量化研究员、量化开发、策略实习生等岗位的备考生快速对标出题风格与难度层级。压缩包共75个文件包含Jupyter Notebook示例、Python脚本、CSV数据、Word/PDF文档、HTML答案解析以及多张现场截图整体约48.4MB按公司分目录存放结构清晰便于按机构针对性复习。目前已有257人学习下载。笔试内容覆盖概率统计、算法设计、数学推导和编程实现等方向部分题目配有Python参考代码、HTML格式答案解析及Notebook运行示例帮助理解解题思路同时附有真实面试场景记录涉及策略项目、数据处理逻辑与基础模型思路可让求职者高效准备量化类岗位面试。1. 十家主流量化私募笔试真题汇总先搞清你面对的是什么量化私募笔试不是金融知识竞赛它是用算法和数学完成的压力测试。所谓十家主流量化私募笔试真题汇总就是把十家头部机构近年来的技术笔试考点压缩成一份可练习的资源算法题占大头概率统计紧随其后机器学习手推和金融指标计算各占一席。它解决的核心问题是信息不对称——网上散落的题目不成体系这份汇总帮你把题型、难度、答题节奏一次对齐。适合两类人准备量化方向实习求职的学生以及想从传统开发转岗量化方向的工程师。看完你会认同一个反直觉的判断这些机构策略风格各异笔试考点重合度却出奇的高。2. 拆解笔试考点十家真题汇总里到底在考什么拿到汇总先别急着刷题按考点做一次结构化拆解比盲目做十套题更有效率。我把这套汇总里的题目按知识块重新归了类统计下来发现规律非常稳定算法与数据结构约占四成概率统计约占三成机器学习手推和金融基础题合计约三成。下面按复习优先级展开。2.1 算法与数据结构高频题型的分布规律算法题的考察范围并不宽几乎每家都在考“容器操作 排序变形 线性扫描”这三板斧。TopK 问题及其变形出现频率最高其次是链表反转、括号匹配、二叉树遍历动态规划偶尔出现但难度停留在最长上升子序列这个级别不会刻意出难题。高频题型与准备优先级如下题型出现场景准备优先级TopK / 第K大 / 流式中位数数据分析、订单流处理极高链表反转与合并基础工程能力验证高栈与队列括号匹配、单调栈高二叉树遍历与层序树形结构基础中动态规划股票收益、路径数中从汇总的难度曲线看算法题目的重点是“写得快、边界稳”不是“解法炫”。多数题目用暴力法能过小数据但笔试卷子里常跟着一题大数据量变体所以每次练习都要问自己这题最优复杂度是多少空间能不能省。2.2 概率统计与随机过程覆盖频率最高的知识块概率统计是量化笔试里最拉开差距的部分。汇总里频率最高的是三类题条件概率与贝叶斯公式、期望与方差计算、随机游走与停时问题。它们看起来像数学题实际考察的是你把业务场景翻译成概率模型的能力。典型例子是一道反复出现的抛硬币题连续抛一枚公平硬币直到出现一次正面停止求抛掷次数的期望。标准做法是几何分布期望等于概率的倒数也就是 2。但很多人在面试时会被追问“如果硬币不公平均匀 U(0,1) 抽样呢”这时候就得用条件期望和重积分来算。复习时不能只背公式要把每个公式的场景条件一起记。随机游走题同样高频比如一维对称随机游走在第 N 步回到原点的概率或者带吸收壁的赌徒破产问题。这类题的通用解法是构造递推式写成马尔可夫链的状态转移方程再求解。在纸上推完用蒙特卡洛模拟验证一遍这算是标准动作。2.3 机器学习手推与调参哪些考点出现频率最高机器学习部分没有想象中难。汇总里机构真正要求手推的模型集中在两类线性回归和逻辑回归。要求是写出损失函数、梯度表达式、参数更新公式并且能解释正则项的几何意义。深度学习相关的面试题偶尔出现但笔试阶段很少要求现场推导反向传播。线性回归的考察角度有三个层次。第一层是闭式解写最小二乘公式 X^T X 的逆乘 X^T y第二层是梯度下降比较批量梯度、随机梯度、小批量梯度的差异第三层是加正则后闭式解如何变岭回归和 Lasso 在估计上的区别是什么。很多参考答案只写了第一层但如果你能在答案里补上第二层和第三层的关键公式会明显不一样。调参类题目更多以选择填空出现比如正则系数变大时偏差方差怎么变、训练集增大时学习曲线怎么走。这类题没有推导靠的是对模型行为的直觉复习时用模拟数据画几次学习曲线比背结论有用得多。2.4 金融基础与业务情景题占比不高但决定下限金融基础题在汇总里的占比不高大概一到两题但失分率很高。最常见的是让你手写最大回撤的计算过程或者给你一组净值序列计算年化夏普比率。这些题难点不在公式而在边界条件净值序列不足一年怎么年化、无风险利率用什么口径、回撤是从峰值算还是从阶段高点算。业务情景题更综合常见形式是给一个交易策略的描述让你指出逻辑缺陷或提出验证方案。这类题没有标准答案但踩分点集中在几个固定方向——是否考虑交易成本与滑点、是否做样本外验证、是否处理了幸存者偏差、参数是否过拟合。答这类题先列风险点再给改进方案比上来就写代码得分高。金融基础这块的复习策略是把夏普、索提诺、最大回撤、年化波动率这四类指标从公式到边界条件全部手推一遍然后对同一组净值数据分别用 Python 和 Excel 算一次确保结果一致。这样笔试里出现任何指标计算题你都能快速定位公式。3. 分题型复盘参考答案思路与易错点这一章把汇总里四种最常见题型拿出来做深度拆解。每一类都按“题干描述 → 答题思路 → 参考答案 → 易错点”的顺序展开你可以把这里的内容当作刷题时的对照模板。注意参考答案不是背的是在理解后能现场复述的。3.1 TopK 与优先队列参考答案思路和三种解法题干概括给定一个整数数组和一个整数 K找出其中最大的 K 个数数组长度可能达到千万级别。这道题所有解法都绕不开三个方向。第一种是排序后取前 K 个复杂度 O(n log n)适合 n 小时快速作答。第二种是用大小为 K 的最小堆堆顶是当前第 K 大的数遍历一次数组堆满后只有比堆顶大的元素才入堆复杂度 O(n log K)。第三种是快速选择基于快排的 partition 操作平均复杂度 O(n)但最坏退化为 O(n²)笔试现场不推荐优先写这种。参考答案中堆解法是最稳的直接调用语言内置堆即可import heapq from typing import List def top_k_largest(nums: List[int], k: int) - List[int]: if k 0 or not nums: return [] # 维护一个大小为 k 的最小堆堆顶是当前第 k 大的元素 heap nums[:k] heapq.heapify(heap) for x in nums[k:]: if x heap[0]: heapq.heapreplace(heap, x) return heap逻辑说明前 k 个元素建堆后堆顶是堆内最小值。每来一个新元素只要比堆顶大就替换堆顶并重新调整始终保持堆内是当前已遍历元素中最大的 k 个。heapreplace一步完成弹出和压入比heappop加heappush快在千万级数据量下差异明显。参数说明k等于 0 或数组为空时直接返回空列表这是参考答案里最容易漏掉的边界。heap返回的顺序不保证有序如要求有序输出最后做一次sorted(heap, reverseTrue)。如果题目要求求最小的 K 个数把比较符号反过来即可。易错点一是直接用nlargest偷懒有的笔试环境允许但会特意加一条“需自己实现堆”的约束二是忽略 K 大于数组长度时返回全部元素的要求三是在循环里用heappush加heappop两步操作虽然功能对但常数时间差一倍。3.2 最大回撤与夏普比率金融指标题的完整答题框架题干概括给出一段基金净值序列计算最大回撤并给出手写的实现思路。这道题的意义在于验证你理解“回撤”和“亏损”的区别。最大回撤衡量的是从任何一个历史峰值到其后最低点的最大跌幅它刻画的是持有者可能承受的最深浮亏。答题思路分三步。第一步遍历净值序列记录当前见过的最高净值第二步计算当前净值相对该峰值的回撤比例第三步更新全局最大回撤。参考答案用单次线性扫描完成def max_drawdown(nav: list[float]) - float: if not nav: return 0.0 peak nav[0] max_dd 0.0 for price in nav: if price peak: peak price dd (peak - price) / peak if dd max_dd: max_dd dd return max_dd逻辑说明peak始终保存当前已扫描部分的历史最大值dd是当前价格相对峰值回撤的比例。因为是比例值所以无量纲可以用于不同净值区间产品的横向比较。需要注意这里用的是“当前价格”而不是“峰值之后的最低价格”每一步都动态更新 max_dd天然覆盖了多个回撤区间的比较。参数说明nav是净值序列要求按时间升序排列。返回值单位是小数比如 0.15 代表最大回撤 15%。题里有时要求返回百分比注意是否需要乘 100。如果有分红、拆分等复权处理需要先确认净值是否做过前复权否则算出来的回撤是失真的。易错点一是有人用(price - peak) / peak得到负数也参与比较导致结果恒为 0二是峰值更新放在计算回撤之后遇到连续下跌时峰值仍是旧值但代码逻辑顺序写错会漏掉新峰值三是把最大回撤算成峰谷落差绝对值没有除峰值这在净值起点不等于 1 时结果完全错误。夏普比率类题的边界点则在年化因子上日频数据年化乘根号 252周频乘根号 52月频乘根号 12这三个数必须记牢。3.3 线性回归手推最小二乘与梯度下降哪种答案更稳题干概括给定特征矩阵 X 和标签 y写出线性回归参数估计的闭式解并说明与梯度下降的适用差异。这题各家机构换着花样考但核心就是抓住“最小化 MSE”这一目标。闭式解的标准写法是先写出损失函数 L(θ) (1/2m) ‖Xθ − y‖²对 θ 求导并令导数为零得到 θ (X^T X)^(−1) X^T y。这里要特别注意前提条件X^T X 必须可逆即特征列之间不存在完全多重共线性。笔面试时需要额外说明当特征数大于样本数时X^T X 奇异此时加 L2 正则后变成岭回归的闭式解 θ (X^T X λI)^(−1) X^T y这才是工业场景里更常用的形式。参考答案里除了公式还需要写一小段向量化实现的伪代码或代码片段import numpy as np def linear_regression_closed_form(X: np.ndarray, y: np.ndarray) - np.ndarray: # X: 形状为 (n_samples, n_features)调用前自行拼接截距列 # y: 形状为 (n_samples,) theta np.linalg.inv(X.T X) X.T y return theta逻辑说明X.T X是特征相关矩阵inv求逆再乘X.T y得到参数向量。使用运算符替代np.dot在高维矩阵乘法上可读性和性能都更好。实际笔试卷子上不会要求你把矩阵求逆手算出来更看重你是否知道加截距项和正则项这两个操作。参数说明X需要包含一列全 1 向量来拟合偏置如果忘了拼截距列模型跑到最后会整体平移损失函数虽然在训练集上可收敛但预测值系统性偏移。lambda正则项在闭式解里加在X.T X的对角线上需要注意是对整个矩阵加lambda * I还是只对非截距项加后者更常见。易错点一是把特征标准化和闭式解混在一起闭式解并不需要标准化梯度下降才需要二是遗漏不可逆判断回答时主动说一句“当 X^T X 不可逆时用伪逆或岭回归”这个补充会让答案完整度提升三是把样本方差分母那里混淆成 m−1线性回归的损失函数分母习惯用 m这是约定问题写清楚即可。3.4 条件概率与蒙特卡洛概率题的验证闭环题干概括掷一枚均匀硬币直到出现一次正面求投掷次数不超过 N 的概率或者求期望。汇总里的概率题很少直接考公式基本都有实际业务包装比如“交易信号连续失败多少次后应该停止”。答题框架是一致的先建模再列式最后用模拟验证。以抛到正面为止的期望为例。设 E 为期望投掷次数有 E p × 1 (1−p) × (1 E)因为第一次结果为反面时已经消耗一次投掷且期望重新开始。解得 E 1/p。p0.5 时期望是 2。这个解法的优势是简洁但很多人会忽略一个隐含假设每次投掷独立且 p 恒定。参考答案可以用蒙特卡洛模拟做交叉验证这也是汇总里多份参考答案的通用收尾动作import random def simulate_until_head(n_trials: int 200000, p: float 0.5) - float: total 0 for _ in range(n_trials): cnt 0 while random.random() p: cnt 1 total cnt 1 return total / n_trials逻辑说明random.random()返回 [0.0, 1.0) 的均匀采样大于等于 p 视为反面每出现一次反面 cnt 加一第一次小于 p 出现正面时本次实验的投掷次数是 cnt1。累加所有实验次数后除以实验总数得到期望的模拟近似值。当 p0.5、n_trials200000 时结果通常在 2.0 ± 0.01 范围内波动。参数说明n_trials是模拟次数越大结果越接近理论值但耗时线性增长。p是正面概率改成 0.03 可以模拟小概率事件的期望此时理论期望为 33.33 左右模拟出的结果波动会明显变大这是因为方差随期望增大而增大。用这个代码验证任何概率题的答案都非常方便只需改 while 里的条件分支。易错点一是把“反面”和“正面”的判定条件写反导致模拟结果为 0二是模拟次数取 1000 次就下结论小样本下随机波动可能超过 5%误判为公式错误三是忽略随机种子设置不同运行结果差异较大笔试现场虽然不需要固定种子但本地验证时建议random.seed(42)保证可复现。4. 代码实现把参考答案跑起来并做边界测试这一章的目标很直接把汇总里最常出现的参考答案变成你本地能跑的代码并验证边界条件。不建议只把代码存进收藏夹手动跑一遍、改几个参数、故意制造输入错误这比看十遍参考答案都有效。4.1 最小可运行环境一条命令装齐依赖笔试题的代码实现通常只依赖 Python 标准库和 numpy、pandas。为了不让环境配置拖后腿我建议用虚拟环境隔离并提前装好固定版本。常见的做法是新建一个干净的 Python 3.10 虚拟环境然后统一安装依赖python3 -m venv quant_env source quant_env/bin/activate pip install numpy pandas scipy逻辑说明venv创建独立环境避免全局环境中包版本互相冲突。numpy 用于矩阵运算和线性回归实现pandas 用于处理净值序列数据scipy 在笔试中偶尔涉及统计分布函数。安装完成后可以用python -c import numpy; print(numpy.__version__)验证环境是否就绪。参数说明Python 版本建议不低于 3.8否则list[float]这类类型注解在新旧语法间会报错。如果笔试环境明确是 Python 2 就更要注意不过现在仍用 Python 2 的量化私募已经很少了。装包速度慢时可以使用国内镜像源在 pip 后追加镜像地址即可这不影响代码逻辑。4.2 TopK 与最大回撤的完整可运行代码把前面章节的参考答案合并成一个完整脚本方便直接运行和观察输出。这段代码同时覆盖算法题和金融指标题两个方向import heapq def top_k_largest(nums, k): if k 0 or not nums: return [] heap nums[:k] heapq.heapify(heap) for x in nums[k:]: if x heap[0]: heapq.heapreplace(heap, x) return sorted(heap, reverseTrue) def max_drawdown(nav): if not nav: return 0.0 peak nav[0] max_dd 0.0 for price in nav: if price peak: peak price dd (peak - price) / peak if dd max_dd: max_dd dd return max_dd if __name__ __main__: nums [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] print(top_k_largest(nums, 3)) nav [1.0, 1.2, 0.9, 1.1, 0.8, 1.3] print(max_drawdown(nav))逻辑说明示例数据里top_k_largest(nums, 3)的输出是[9, 6, 5]。注意这里返回的是排序后的列表笔试如果不要求有序可以免去最后一步sorted。净值序列nav的峰值是 1.2随后跌到 0.8回撤比例是 (1.2−0.8)/1.2 ≈ 0.3333之后涨到 1.3 不再影响结果因此输出是约 0.3333。参数说明top_k_largest第二参数k大于列表长度时切片nums[:k]会直接取全部元素返回结果排序后即为完整降序列表符合常见题意。max_drawdown对下跌后再创新高的场景会正确重置峰值对一直上涨的净值序列输出 0.0。两个函数都对空输入做了保护这是笔试判分时容易被挑出来的边界。4.3 线性回归与蒙特卡洛模拟的完整代码这一段把机器学习手推题和概率题串起来用闭式解拟合参数再用模拟验证一个概率题结论。代码如下import numpy as np def linear_regression_closed_form(X, y): X_b np.hstack([np.ones((X.shape[0], 1)), X]) theta np.linalg.inv(X_b.T X_b) X_b.T y return theta def simulate_until_head(n_trials, p0.5, seed42): rng np.random.default_rng(seed) total 0 for _ in range(n_trials): cnt 0 while rng.random() p: cnt 1 total cnt 1 return total / n_trials X np.array([[1], [2], [3], [4]]) y np.array([2.1, 3.9, 6.1, 7.8]) print(linear_regression_closed_form(X, y)) print(simulate_until_head(200000))逻辑说明线性回归代码中np.hstack在第一列前插入全 1 向量np.linalg.inv求逆矩阵做矩阵乘法。示例数据 y 与 x 近似满足 y 2x 0.1输出结果第一个元素接近 0.1、第二个元素接近 2.0。蒙特卡洛模拟使用 numpy 的随机生成器替代标准库 random在大量模拟时性能更好输出接近理论值 2.0。参数说明seed控制随机种子固定后每次运行结果一致方便验证代码是否改坏。n_trials设置 200000 时结果波动范围约 ±0.01设置 5000 时波动可能到 ±0.05笔试时间有限可以调小但至少要看到结果在理论值附近而不是偏差数倍。线性回归的X要求是二维数组如果传入一维数组shape[0]会取行数np.hstack拼接维度时可能报错这是一个容易忽视的输入前提。4.4 复杂度与参数选择改哪里、为什么笔试答题时代码后面通常要附带一段复杂度分析。汇总的多份参考答案里复杂度说明是踩分点之一不能省略。TopK 堆解法的时间复杂度是 O(n log k)最坏情况下每个元素都触发一次堆调整空间复杂度 O(k)。最大回撤单次扫描时间复杂度 O(n)空间 O(1)。线性回归闭式解的时间开销主要在矩阵求逆复杂度 O(d²n d³)d 是特征数特征很多时闭式解不如梯度下降划算。参数选择上要区分两个场景。场景一是笔试环境给了超大数组比如 10 的 7 次方量级TopK 的 k 很小堆解法优势明显如果 k 接近 n直接排序更合理。场景二是净值序列存在缺失值pandas 读入后要注意是否要先dropna最大回撤对缺失值没有天然处理机制遇到 NaN 时比较运算返回 False会导致回撤被低估。5. 刷题避坑真题里最容易翻车的地方刷这套汇总的过程中有几个坑反复出现。这里按“现象 → 原因 → 解决”的顺序记录下来每条都是真实会踩中的问题不是理论推演。5.1 本地能跑、笔试环境跑不了现象代码在本地输出正确粘贴到笔试网页后运行报错最常见的是import失败或语法错误。原因笔试环境很多是受限的在线解释器不允许装第三方包或者 Python 版本比本地低f-string 的新语法和类型注解不兼容。解决写代码前先确认笔试环境支持哪些包。如果只允许标准库那么 TopK 就自己手写堆线性回归用 numpy 的写法就要改成纯 Python 循环求和。本地练习时也尽量把解释器版本固定在 3.8 或 3.9和多数在线环境对齐。另一个处理是减少类型注解的使用函数签名里能不写- List[int]就不写避免低版本解释器报错。5.2 公式推导对、输出数值对不上现象手推线性回归的闭式解公式写在卷面上没问题但换成代码后算出的参数和参考答案不一致。原因多半是忘记在特征矩阵里拼接截距列或者标准化后被公式里的截距项绕晕。闭式解中的 θ 包含截距代码里必须显式加一列全 1。解决写完代码先用一个小数据集验证比如 y 2x 1 的精确线性关系取四个点拟合将结果代回损失函数看是否为接近 0 的值。如果计算截距列还是对不上检查np.linalg.inv(X.T X)时X.T X是否可逆特征之间存在共线性时数值会异常。5.3 暴力解能过样例、数据一大就超时现象TopK 用排序方案小数据集测试全过但题目里明确说了数组长度 10 的 7 次方运行直接超时。原因排序复杂度 O(n log n) 在大数据量下常数时间被放大笔试环境的时间限制普遍较紧。解决刷题时把时间复杂度标注写进代码注释养成习惯。遇到 TopK 一律默认堆解除非 k 很大。另一个常见超时点是概率题的蒙特卡洛模拟模拟次数从 100000 加到 1000000 时耗时线性增长笔试时如果题目要求手算理论值模拟只做验证用次数控制在 50000 以内比较合适。5.4 概率题手算对、模拟结果总差一截现象理论上期望是 2.0模拟跑出来却是 1.96 或 2.04然后开始怀疑公式是不是错了。原因模拟次数太少随机波动没有被平滑掉或者没有固定随机种子每次结果都不同或者模拟循环的边界条件处理错误比如把“抽到反面继续、抽到正面停止”的逻辑写反。解决固定随机种子并加大模拟次数到十万以上。验证时不只是对比数值还要去看标准误模拟到十万次时误差一般在 0.01 量级。如果偏差超过 0.05优先检查循环条件再检查参数传递。还有一种隐蔽错误是随机数生成器用random.random()但比较符号写错导致某个概率边界被重复计入。5.5 把金融业务题当成纯算法题答现象一道最大回撤题直接写了个min减max的公式交卷后自认为没问题结果被判错。原因最大回撤要求回撤是从历史峰值算起而不是全局最高点减全局最低点。全局最低点可能出现在全局最高点之前这时候两者相减没有意义。这是金融概念和数学直觉的边界容易翻车。解决按“动态更新峰值、再算当前相对峰值回撤”的框架实现并在答案开头写一句“回撤以历史峰值到当前值的最大跌幅定义”明确概念后再上代码。遇到夏普比率同理先写年化因子再写公式让阅卷人看到你清楚边界条件。业务情景题更要先列约束——交易成本、滑点、最小交易单位——再谈优化方案。6. 把真题利用率翻倍的复盘方法刷题不是做一遍就结束复盘方式决定你一周后还记得多少。我的习惯是不按机构顺序复习而是按题型建索引把做错的题归到“容器算法 / 概率建模 / 公式推导 / 边界条件”四类标签下每道错题旁标记错误原因而不是正确答案。原因写三条看错题、公式记忆偏差、边界漏判。两周后回看时只看原因标签就能快速定位自己的薄弱环节。另一个有效方法是边界条件自测。每道题提交前用四组输入过一遍空输入、单元素输入、极端大 K、全涨或全跌行情。TopK 检查k0和k等于数组长度最大回撤检查净值一路向上时是否输出 0线性回归检查特征全为常数列时是否报错或输出发散。四组输入能挡住八成隐性 bug。最后是口述式复盘。不看代码把每道题的解题思路对着电脑讲一遍讲不顺的地方就是理解有缺口的地方。我自己筛题时养成的习惯是一道题至少讲两遍第二遍假装在向别人解释突然就能发现第一遍漏掉的细节。这套方法坚持两周做过的题基本不会再错。希望帮到你。本文还有配套的精品资源点击获取