☰
量化笔试十套题拆解:概率统计、随机过程与编程算法高频题型解析
2026/10/20 6:53:21 网站建设 项目流程

简介:这份资源面向准备量化投资岗位笔试的求职者与在校学生,整理了诚奇、概率投资、海悦、天演、衍复、佳期、平方和、集微、九坤、凯读投资十家公司的量化笔试题及参考答案,覆盖统计学、概率论、金融工程、机器学习与算法交易等核心考点。内容按公司逐一解析,涉及线性回归、时间序列、蒙特卡洛模拟、Black-Scholes期权定价、GARCH波动率模型、遗传算法、神经网络与决策树、动量与反转策略、统计套利与协整、限价订单簿与高频交易、新闻情感分析及DCF、PE、PB等估值模型,并延伸至Python、Pandas、NumPy、Matlab、R等工具的实际应用。资源为zip压缩包,整体约48.43MB,文件总数与类型明细上游暂未提供。目前已有753人学习下载,适合希望系统梳理量化知识框架、对照真题查漏补缺、提升笔试通过率的读者参考。

1. 十套量化笔试题拆开看:从刷题到上机,这份资源到底怎么用

如果你正在准备量化岗位的笔试,大概率经历过这样的场景:投了十几家,每家笔试风格完全不同,有的上来就是概率期望连环套,有的让你手写一个订单簿撮合逻辑,还有的干脆扔一道时间序列预测让你现场推公式。网上题解零零散散,刷完也不知道自己到底缺哪块。这份「量化笔试题十家公司附答案」的资源,把十家不同风格机构的笔试卷子和参考答案整理到了一起,覆盖概率统计、随机过程、编程实现、策略逻辑、脑筋急转弯等常见题型。它适合两类人:一是正在集中投递、需要快速摸清各家出题套路的求职者;二是想系统检验自己量化基础、查漏补缺的转行选手。我拿到手第一件事不是从头刷,而是先按题型分类,把十套卷子拆成「计算类」「编程类」「逻辑类」三堆,再决定每堆花多少时间。这个动作很关键,后面会细说。

2. 先拆题型再动手:十套卷子的分类逻辑与优先级

2.1 为什么不能从第一套开始顺序刷

顺序刷题最大的问题是反馈周期太长。你做完一套可能花两小时,对答案再花一小时,中间遇到卡壳的题还会打断节奏。更麻烦的是,十家机构的出题偏好差异很大,有的偏理论推导,有的偏工程实现,顺序刷会让你在切换思维模式上浪费大量精力。我一般会先花二十分钟把十套卷子快速过一遍,只做一件事:给每道题打标签。标签分四类——概率统计、随机过程与衍生品、编程与算法、策略与市场微观结构。打完标签后统计每类题的数量和分值占比,这样就能看出哪家偏理论、哪家偏实战。比如有的卷子编程题占六成,那你就得优先保证代码能跑通;有的卷子全是概率推导,那公式熟练度就是第一优先级。

2.2 分类标签的具体定义与操作步骤

分类不是随便看看就行,得有明确的判定规则,否则同一道题两个人可能归到不同类。我的做法是:

  • 概率统计类:题目核心是求期望、方差、条件概率、贝叶斯更新、分布识别。典型问法包括「求某个随机变量的期望」「已知先验求后验」「抛硬币直到出现连续两次正面,期望次数是多少」。
  • 随机过程与衍生品类:涉及布朗运动、伊藤引理、期权定价、蒙特卡洛模拟、马尔可夫链。典型问法包括「用风险中性定价求期权价格」「证明某个过程是鞅」「模拟一条几何布朗运动路径」。
  • 编程与算法类:要求写代码实现某个功能,或者分析算法复杂度。典型问法包括「实现一个限价订单簿的撮合逻辑」「给定数组求最大子序和」「设计一个数据结构支持 O(1) 插入和查询中位数」。
  • 策略与市场微观结构类:涉及买卖价差、市场冲击、订单流、做市策略逻辑。典型问法包括「解释什么是逆向选择」「如何用订单簿不平衡预测短期价格」「设计一个简单的做市策略并说明风险点」。

操作上,我建议用表格记录每套卷子的题型分布,格式如下:

卷号概率统计随机过程编程算法策略微观总题量
卷一523010
卷二216110
..................

这张表填完,你就能一眼看出哪家偏编程、哪家偏理论。接下来按「先补短板、再刷目标机构」的顺序安排时间。如果你编程弱但目标机构编程题占比高,那就先把编程类题目集中刷三天,再回头刷整套。

2.3 优先级排序:时间有限时先刷哪几套

十套卷子全刷完至少需要三十到四十小时,如果你只有一周准备时间,必须做取舍。我的优先级规则是:

第一优先级:目标机构的卷子。如果你已经投了其中某几家,先把那几家的卷子刷透,确保每道题都能独立复现解题过程。

第二优先级:题型覆盖最全的卷子。通常有一两套卷子题型分布均匀,没有明显偏科,这种卷子适合用来检验综合水平。

第三优先级:风格差异最大的卷子。比如你目标机构偏理论,那就找一套偏编程的卷子来刷,强迫自己切换思维模式,避免考试时遇到不熟悉的题型直接懵掉。

提示:不要因为某套卷子「看起来难」就跳过。难往往意味着它覆盖了你没掌握的知识点,跳过等于把漏洞留到考场上。

3. 概率统计与随机过程:手推公式的四个核心套路

3.1 期望与条件期望的递推法

量化笔试里最高频的题型就是求期望,尤其是那种「重复某个过程直到出现特定结果」的题。比如「抛一枚公平硬币,直到出现连续两次正面为止,求期望抛掷次数」。这类题的标准解法是设状态、列方程、解递推。

设 E0 为当前没有连续正面的期望次数,E1 为当前已经有一个正面的期望次数。则:

  • E0 = 1 + 0.5 * E1 + 0.5 * E0
  • E1 = 1 + 0.5 * 0 + 0.5 * E0

解这个方程组得到 E0 = 6。这个套路的通用步骤是:先定义状态(已经匹配了多少前缀),再对每个状态列转移方程,最后解线性方程组。参数说明:0.5 是硬币正反面概率,如果是非公平硬币就替换成对应概率;E1 方程里的 0 表示已经完成目标,不需要再抛。

代码验证可以用蒙特卡洛模拟:

import random def simulate(trials=100000): total = 0 for _ in range(trials): flips = 0 consecutive_heads = 0 while consecutive_heads < 2: if random.random() < 0.5: consecutive_heads += 1 else: consecutive_heads = 0 flips += 1 total += flips return total / trials print(simulate()) # 输出应接近 6

逻辑说明:每次模拟独立抛硬币,直到连续两次正面停止,记录总次数。参数 trials 控制模拟次数,次数越多结果越接近理论值。如果理论推导结果是 6,模拟结果在 5.95 到 6.05 之间就说明推导正确。

3.2 布朗运动与伊藤引理的公式速查

随机过程类题目里,布朗运动和伊藤引理是绕不开的。常见考法包括:给定一个随机过程,求其微分形式;或者给定微分方程,求其解。核心公式必须背熟:

  • 标准布朗运动:dW_t,满足 W_t - W_s ~ N(0, t-s)
  • 伊藤引理:若 X_t 满足 dX_t = μ dt + σ dW_t,则对 f(X_t, t) 有 df = (∂f/∂t + μ ∂f/∂x + 0.5 σ² ∂²f/∂x²) dt + σ ∂f/∂x dW_t
  • 几何布朗运动:dS_t = μ S_t dt + σ S_t dW_t,解为 S_t = S_0 exp((μ - 0.5σ²)t + σ W_t)

考试时最常见的坑是把伊藤引理里的二阶项漏掉。记住:只要函数里有 X_t 的平方或更高次项,二阶导就不为零,必须保留。我一般会在草稿纸上先把 f 对 x 的一阶导和二阶导都写出来,再代入公式,避免心算出错。

3.3 期权定价的两种手算路径

期权定价题通常要求用风险中性方法或者构造无套利组合来推导。以欧式看涨期权为例,二叉树模型是最容易手算的路径:

设当前股价 S0=100,执行价 K=100,无风险利率 r=0,波动率对应上涨因子 u=1.1,下跌因子 d=0.9,到期时间一步。则:

  • 上涨后股价 Su=110,期权价值 Cu=max(110-100,0)=10
  • 下跌后股价 Sd=90,期权价值 Cd=max(90-100,0)=0
  • 风险中性概率 p=(1 - d)/(u - d)=(1-0.9)/(1.1-0.9)=0.5
  • 期权现值 C = pCu + (1-p)Cd = 0.510 + 0.50 = 5

如果是两步二叉树,就倒推两轮。参数说明:u 和 d 通常由波动率决定,u=exp(σ√Δt),d=1/u;p 的公式在 r=0 时简化为 (1-d)/(u-d),如果 r 不为零则 p=(exp(rΔt)-d)/(u-d)。

注意:手算二叉树时,每一步的折现因子别漏掉。r=0 时折现因子为 1,但 r 不为零时要除以 exp(rΔt)。

3.4 马尔可夫链的稳态分布求解

马尔可夫链类题目通常给一个转移矩阵,要求求稳态分布或者求某个状态的期望访问次数。稳态分布 π 满足 πP = π 且 π 各分量之和为 1。手算步骤:

  1. 写出转移矩阵 P
  2. 设 π = (π1, π2, ..., πn)
  3. 列出方程组 πP = π,再加上 Σπi = 1
  4. 解方程组

例如两状态转移矩阵 P = [[0.8, 0.2], [0.3, 0.7]],则:

  • π1 = 0.8π1 + 0.3π2
  • π2 = 0.2π1 + 0.7π2
  • π1 + π2 = 1

解得 π1 = 0.6,π2 = 0.4。这个结果表示长期来看系统有 60% 时间处于状态 1。

4. 编程与算法题:从订单簿到动态规划的实现细节

4.1 限价订单簿撮合逻辑的代码框架

订单簿题是量化编程笔试里出现频率最高的题型之一。题目通常要求实现一个简单的限价订单簿,支持插入限价单、市价单,并能返回成交结果。核心数据结构是两个优先队列:买单按价格从高到低排序,卖单按价格从低到高排序。价格相同时按时间优先。

import heapq from collections import deque class OrderBook: def __init__(self): self.bids = [] # 最大堆,存 (-price, time, order_id, qty) self.asks = [] # 最小堆,存 (price, time, order_id, qty) self.time = 0 def add_limit_order(self, side, price, qty, order_id): self.time += 1 if side == 'buy': heapq.heappush(self.bids, (-price, self.time, order_id, qty)) else: heapq.heappush(self.asks, (price, self.time, order_id, qty)) self.match() def add_market_order(self, side, qty): if side == 'buy': while qty > 0 and self.asks: price, t, oid, aqty = heapq.heappop(self.asks) traded = min(qty, aqty) qty -= traded aqty -= traded if aqty > 0: heapq.heappush(self.asks, (price, t, oid, aqty)) else: while qty > 0 and self.bids: neg_price, t, oid, bqty = heapq.heappop(self.bids) traded = min(qty, bqty) qty -= traded bqty -= traded if bqty > 0: heapq.heappush(self.bids, (neg_price, t, oid, bqty)) def match(self): while self.bids and self.asks: best_bid = -self.bids[0][0] best_ask = self.asks[0][0] if best_bid >= best_ask: _, t1, oid1, qty1 = heapq.heappop(self.bids) _, t2, oid2, qty2 = heapq.heappop(self.asks) traded = min(qty1, qty2) qty1 -= traded qty2 -= traded if qty1 > 0: heapq.heappush(self.bids, (-best_bid, t1, oid1, qty1)) if qty2 > 0: heapq.heappush(self.asks, (best_ask, t2, oid2, qty2)) else: break

逻辑说明:买单用负价格存入最小堆,模拟最大堆效果;时间戳保证同价格下先到先成交。参数说明:side 取 'buy' 或 'sell',price 是限价,qty 是数量,order_id 用于标识订单。撮合条件是最优买价大于等于最优卖价。这个框架在笔试里足够用,但如果题目要求支持撤单,就需要额外维护一个订单 ID 到堆中元素的映射,撤单时标记失效而不是直接删除。

4.2 动态规划题的识别与状态定义

量化笔试里的动态规划题通常包装成「最优交易」「最大收益」「最小成本」等形式。识别信号是:问题可以分解成重叠子问题,且每个子问题的最优解可以组合成全局最优解。常见题型包括:

  • 股票买卖最大收益(允许 k 次交易)
  • 硬币找零最小硬币数
  • 最长递增子序列
  • 编辑距离

以「最多完成 k 笔交易的最大收益」为例,状态定义是关键。设 dp[i][j][0] 表示第 i 天、最多 j 笔交易、当前不持股的最大收益;dp[i][j][1] 表示当前持股的最大收益。转移方程:

  • dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j][1] + price[i])
  • dp[i][j][1] = max(dp[i-1][j][1], dp[i-1][j-1][0] - price[i])

参数说明:i 从 1 到 n,j 从 1 到 k。初始化 dp[0][j][0]=0,dp[0][j][1]=-inf。最终答案是 dp[n][k][0]。

def max_profit(k, prices): n = len(prices) if n == 0 or k == 0: return 0 dp = [[[0, float('-inf')] for _ in range(k+1)] for _ in range(n+1)] for i in range(1, n+1): for j in range(1, k+1): dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j][1] + prices[i-1]) dp[i][j][1] = max(dp[i-1][j][1], dp[i-1][j-1][0] - prices[i-1]) return dp[n][k][0]

逻辑说明:外层循环遍历天数,内层循环遍历交易次数。注意买入时消耗一次交易次数,所以从 j-1 转移。参数 k 是最大交易笔数,prices 是每日价格列表。

4.3 时间复杂度分析的常见陷阱

编程题除了写代码,还经常要求分析复杂度。这里有两个容易翻车的地方:

第一,堆操作的时间复杂度是 O(log n),不是 O(1)。在订单簿题里,每次插入和弹出都是 O(log n),如果题目要求分析整体复杂度,别写成 O(n)。

第二,递归算法的时间复杂度不能只看递归深度。比如朴素递归求斐波那契数列是 O(2^n),不是 O(n)。如果加了记忆化,才是 O(n)。

提示:笔试时如果时间紧张,先把代码写对,复杂度分析写在注释里。很多阅卷人更看重代码逻辑是否正确,复杂度写错扣分有限,但代码跑不通直接零分。

5. 避坑与排查:十套卷子里最容易翻车的五个地方

5.1 答案里的公式符号和题目定义不一致

现象:对照答案时发现公式里用的符号和题目里的定义对不上,比如题目用 σ 表示波动率,答案里用 σ² 表示方差,但中间推导时混用了。

原因:整理答案的人可能从不同来源拼凑,没有统一符号体系。

解决:自己动手把每道题的符号定义重新写一遍,确保前后一致。如果答案里的符号和题目冲突,以题目为准,自己重新推导一遍。

5.2 编程题答案只给代码不给输入输出示例

现象:答案里有一段代码,但没有说明输入格式和预期输出,你不知道怎么验证。

原因:整理时只保留了核心逻辑,省略了测试用例。

解决:自己补测试用例。比如订单簿题,构造几笔限价单和市价单,手动算出预期成交结果,再跑代码对比。如果结果不一致,先检查堆的排序方向是否正确。

5.3 概率题答案跳步导致看不懂推导过程

现象:答案从第一步直接跳到第三步,中间省略了关键的代数变换。

原因:整理者默认读者能心算补全,但实际上大多数人需要看到完整步骤。

解决:遇到跳步的地方,自己在草稿纸上把中间步骤补全。如果补不出来,说明这个知识点没掌握,回去翻教材或者找同类题练手。

5.4 不同卷子的同一道题答案互相矛盾

现象:卷三和卷七有一道类似的期望题,但答案不一样。

原因:题目条件可能有细微差别,比如一个是「直到出现正面」,另一个是「直到出现连续两次正面」。

解决:逐字对比题目条件,确认差异点。如果条件完全相同但答案不同,以推导过程更完整的那份为准,另一份大概率有误。

5.5 策略题答案过于笼统,没有具体参数

现象:策略设计题答案只写了「用订单簿不平衡因子预测价格」,但没说不平衡因子怎么算、阈值怎么定。

原因:这类题本身开放性强,答案可能只是方向性提示。

解决:自己补全参数。比如订单簿不平衡因子可以定义为 (bid_volume - ask_volume) / (bid_volume + ask_volume),阈值用历史数据回测确定。笔试时如果遇到这类题,先写清楚假设和参数定义,再展开逻辑。

6. 从刷题到上机:用 Python 复现三类高频题型的验证脚本

刷完十套卷子不等于万事大吉,笔试里经常要求现场写代码验证思路。我习惯在考前把三类高频题型各写一个验证脚本,考试时直接改参数就能用。第一类是蒙特卡洛模拟,用来验证期望和概率结果。比如验证「连续两次正面的期望次数」,脚本跑十万次,结果在 6 附近就说明推导正确。第二类是二叉树定价,把步数、波动率、利率做成参数,改一下就能算不同期权。第三类是订单簿撮合,把买卖单序列写成列表,跑一遍看成交结果是否符合预期。

# 通用蒙特卡洛验证框架 import random def mc_expectation(simulate_once, trials=100000): total = 0 for _ in range(trials): total += simulate_once() return total / trials # 示例:验证连续两次正面的期望次数 def one_trial(): flips = 0 streak = 0 while streak < 2: if random.random() < 0.5: streak += 1 else: streak = 0 flips += 1 return flips print(mc_expectation(one_trial))

逻辑说明:mc_expectation 接收一个单次模拟函数,重复调用并取平均。参数 trials 控制模拟次数,一般十万次足够。这个框架可以套用到任何求期望的题目上,只需要改 one_trial 里的逻辑。

我自己的习惯是:考前一周把这三类脚本各跑一遍,确认环境没问题、库都装好了。考试时如果允许用本地环境,直接改参数;如果不允许,就在草稿纸上手算关键步骤,用脚本验证思路。从那以后我每次准备量化笔试,都会先把这三类脚本跑通再刷题,避免考场上因为环境问题翻车。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询