☰
量化笔试真题解析:概率统计、编程与回测高频考点全攻略
2026/10/25 2:13:41 网站建设 项目流程

简介:量化投资笔试往往同时考察数学、编程与市场理解,这份资源恰好针对十家知名公司的量化笔试题给出答案解析与知识点梳理。面向正在准备量化岗笔面试的候选人,内容包括线性回归、时间序列、布莱克-斯科尔斯期权定价、GARCH波动率建模、动量与反转策略、统计套利中的协整关系、限价订单簿与高频交易,并延伸至深度学习与情感分析在择时中的应用。资源为zip压缩包,大小约48.43MB,文件总数与类型明细在页面暂未标注,以实际下载后内容为准。目前已有757位学习者浏览使用,适合需要快速摸清各家公司考察重点、并有针对性地补强薄弱环节的求职者。通过题案对照,既能巩固概率统计与金融工程理论,也能提升用Python、Pandas、NumPy解决实际投资问题的能力。

1. 考什么:十家公司量化笔试怎么拿分

十家公司、十套笔试题、附答案,这套题把量化岗笔试里真正反复出现的考点全部摊开了。很多同学刷题的第一反应是死磕数学,但量化笔试不是纯竞赛:它一边考你概率统计和线性代数能不能快速给结果,一边又要求你现场写出可运行的Python函数,再讲清楚回测里为什么不能用未来数据。这三块能力在真题里的权重可以粗略看成4:3:3,数学决定你的下限,代码决定你能不能进下一轮,策略题决定面试官要不要继续深挖。正在准备量化实习、校招或券商自营岗笔试的人,用这份真题做限时训练,比漫无目的刷题更接近真实考场。

2. 高频考点:数学与统计题的出题套路与答题模板

从十家公司真题的分布看,数学模块占了约三成到四成,但这类题不像竞赛题那样绕,反而更贴近收益分析和组合构建本身:给你一只股票的收益率分布,你就要会求期望;给你一个因子相关矩阵,你就要判断它能不能拿来解优化问题。面试官真正想看你的是能不能把数学式子落到一个明确的量化结论上。

模块常见问法出现频率
概率统计期望、方差、条件概率、正态分布最高
线性代数特征值、正定性、矩阵奇异中
时间序列平稳性、鞅、ADF检验中

2.1 概率统计:期望、方差与条件概率的必考问法

真题一:设某策略的日收益率服从标准正态分布,求收益率的平方的期望,以及该平方序列的方差。拿到这种题,先别急着展开积分,直接写两个结论:对标准正态变量Z,E[Z²]=1,E[Z⁴]=3。于是E[Z²]=Var(Z)+E²(Z)=1,Var(Z²)=E[Z⁴]-E²[Z²]=3-1=2。答题模板是“先标准化,再代矩结论”,很多答案只写了期望,把第二问漏掉,白白丢一半分。

真题二:某策略单日盈利概率为0.55,各日之间相互独立,求连续三天至少有一天盈利的概率。正确做法是先算对立事件:三天全亏的概率是0.45³=0.091125,所以答案是0.908875。不少人着急写成1-0.55³,它算的是“不是连续三天天天盈利”的概率,跟题意差了十万八千里。这类题属于送分题,错了最伤士气。

真题三:某因子在上涨股票中有效的概率为80%,在下跌股票中有效的概率为60%;某股票上涨的概率为70%,求“该股票上涨且因子有效”的概率。先看清问的是联合概率,不是条件概率:P(涨且有效)=0.7×0.8=0.56。最容易错的是把0.8直接当答案写,因为题干故意把“上涨且有效”包装成“在上涨股票中有效的概率”,两个概念只差几个字。

这块还容易连着问:如果已知因子有效,股票上涨的概率是多少?那就变成条件概率,要用贝叶斯公式:P(涨|有效)=0.56 / [0.56 + 0.3×0.6]≈0.757。答完这一问,面试官对概率功底基本就有数了。

2.2 线性代数:对称矩阵正定性与特征值分解

真题:判断矩阵A=[[2,1],[1,2]]是否正定,并说明它在量化里的应用。先写特征方程det(A-λI)=(2-λ)²-1=0,解得λ=1、3,全部为正,所以矩阵正定。然后回答应用:协方差矩阵必须半正定,组合优化求解时要保证它是正定矩阵,否则最优权重可能发散或不唯一。

还有一个问法:矩阵奇异是什么含义?答:存在非零向量x使得Ax=0,等价于列向量线性相关;放到因子模型里就是因子之间存在多重共线性,回归系数不稳定,解不唯一。答题模板按三个层次走:先给定义,再写代数表达,最后落到量化场景。面试官最怕听到你背定义而说不出“这意味着什么”。

如果追问PCA,可以接一句:主成分分析本质上就是做协方差矩阵的特征值分解,特征值表示各主成分解释的方差大小,前几个主成分的累计解释率通常用来判断因子降维是否够用。这一句能把线性代数和选股因子的降维思路串起来,属于加分内容。

2.3 时间序列:平稳性判断与鞅的辨析

真题:随机游走X_t=X_{t-1}+ε_t,ε_t为白噪声,判断序列是否平稳。不要凭直觉说“看起来随机”,要按弱平稳的三条件作答:均值恒定、方差恒定、自协方差只依赖于时间间隔。该序列的方差会随t线性增大,所以不平稳。如果提到检验方法,再加上一句:ADF检验的原假设是存在单位根,P值大于0.05时不能拒绝非平稳。

另一道笔试题:鞅的定义是什么?随机游走是不是鞅?答题分两步:给定过去全部信息F_t,若E[X_{t+1}|F_t]=X_t,则称X_t是鞅;当随机游走增量ε_t均值为0时,它满足该条件,所以是鞅。还要注意一点:鞅不等于平稳,鞅关心条件期望,平稳关心分布性质,这两个概念经常被混着考。

面试官如果追问到布朗运动,可以答:布朗运动是连续时间鞅,鞅性质在衍生品定价中保证“风险中性测度下未来价格的期望等于当前价格”,这也是为什么很多期权定价公式看起来都是“期望折现”。这一句属于额外的加分内容,答不出来不扣分,答出来能明显提升专业感。

3. 高频考点:编程题的答题框架与现场调试

编程题是量化笔试里最能拉开差距的环节。十家公司的真题中,大约有六到七成会让你现场用Python处理因子数据或写回测函数,也有公司会兼考C++基础。高频考点非常集中:pandas的分组和向量化操作、numpy的广播、最大回撤这类经典算法,以及C++智能指针的内存管理。答题的隐藏要求是“既要能跑,又不要踩坑”,所以写代码的顺序应该先保证正确性,再提优化,最后做边界防御。

3.1 Python数据处理:按股票分组计算动量的完整写法

真题:数据表含stock、date、close三列,要求计算每只股票过去20日的动量,并返回当前动量最大的5只股票。这是很标准的pandas题,考察排序、分组、shift和dropna的综合使用。

import pandas as pd def top_momentum(df, lookback=20, top=5): # 先按股票和日期排序,保证 shift 取到的是同股票的历史数据 df = df.sort_values(['stock', 'date']) # 用 transform 保留原 DataFrame 结构,避免与全表行数不一致 df['momentum'] = df.groupby('stock')['close'].transform( lambda s: s / s.shift(lookback) - 1.0 ) # 取每只股票最新一天的动量,去掉数据不足 lookback 天的股票 latest = df.groupby('stock')['momentum'].last().dropna() return latest.nlargest(top).index.tolist()

代码里有三处关键设计。第一,必须先sort_values再分组,否则groupby内部的顺序保持原表顺序,shift会把上一只股票的收盘价当成当前股票的数据。第二,用transform而不是apply,是因为transform后行数和原DataFrame保持一致,可以直接赋给新列。第三,groupby(...).last()拿到的是每个股票最后一条记录,dropna会把上市时间不足20天、动量计算结果为NaN的股票剔除掉,避免它们混进Top名单。

3.2 经典算法:最大回撤的O(n)写法

题目:给一个价格序列,写函数计算最大回撤。很多人的第一版代码是双层循环,找所有高点后面的所有低点,复杂度O(n²),在几千个点的日线回测里还能跑,到分钟级数据就崩。更标准的做法是维护“截至当前位置的历史最高价”。

def max_drawdown(prices): peak = prices[0] max_dd = 0.0 for price in prices: peak = max(peak, price) # 更新历史最高价 dd = (peak - price) / peak # 当前距历史最高点的回撤 max_dd = max(max_dd, dd) return max_dd

这里需要注意,peak不是整个数组的全局最高点,而是遍历到当前时刻为止出现的最高点,这样才能保证“先涨到120再跌到90”中的120被正确识别为峰值。如果传入的是空列表,函数会直接访问prices[0]报错,实际答题时应加一句判断:if not prices: return 0.0。面试官通常还会追问“最大回撤和最大亏损有什么不同”,答案就是:最大亏损只比较起始点和终点,最大回撤则要求严格按照时间顺序,从一个峰到后续谷底的最大跌幅。

3.3 夏普比率的numpy实现与参数化设计

这道题几乎每隔一两家公司就会出现:给定日收益率序列,计算年化夏普比率,无风险收益率为3%。写的时候最容易犯的错是没有把无风险利率拆成日频,或者忘记乘以sqrt(252)。

import numpy as np def annual_sharpe(returns, risk_free=0.03, periods=252): # returns: 日收益率序列,支持 list 或 numpy 数组 returns = np.asarray(returns, dtype=float) daily_rf = risk_free / periods # 年化无风险利率转换成日频 excess = returns - daily_rf sigma = excess.std(ddof=1) # 用样本标准差,不用总体标准差 if sigma == 0: return np.nan return excess.mean() / sigma * np.sqrt(periods)

三个参数决定了函数能不能应对追问。risk_free被除以periods,避免用“年化利率减日收益率”这种口径错误。std(ddof=1)是样本标准差,更符合实际收益率序列的自由度。periods=252表示日频年化,如果面试官把数据换成周频,直接把periods改成52,这一设计比写死常数要稳妥。面试官如果继续追问“收益率序列全是相等的数字怎么办”,函数返回np.nan而不是抛异常,这也是一种答题加分项。

3.4 C++基础:智能指针与内存管理的问答模板

有的公司会考C++,范围通常不深但很典型。真题比如:为什么unique_ptr不允许拷贝?答:智能指针在析构时会释放所管理的对象,如果允许拷贝,两个unique_ptr指向同一块内存,析构时会发生双重释放,所以设计上只允许移动。这个问题的完整回答是“所有权转移”四个字,而不是简单背一句“不能复制”。

再追问shared_ptr时,要提循环引用:两个shared_ptr互相持有对方,引用计数永远无法降到0,内存无法释放,需要用weak_ptr打破环。答题模板先讲生命周期,再讲引用计数,最后给一个具体场景。这类题对写过C++项目的人偏简单,对只刷过Python的人往往是几道题里最没有思路的部分,建议考前把智能指针三种类型和移动语义完整过一遍。

4. 高频考点:策略设计与机器学习题的作答框架

策略题在这十家公司真题里占比不低,通常以“简述一个策略”或“如何评估回测结果”的方式出现。这类题没有标准代码,但有标准框架。面试官想听的往往不是你的策略多复杂,而是你能不能把信号生成、仓位管理、交易成本、风控这条链路讲完整。机器学习题目则是以线性回归假设、过拟合控制、因子有效性评估为主。

4.1 机器学习:线性回归假设与共线性处理

真题:线性回归有哪些基本假设?至少答三点:自变量与因变量之间存在线性关系;误差项相互独立且均值为0;同方差性;没有完全多重共线性。如果题目问“多重共线性会造成什么问题”,就要回答:参数估计的方差变大,参数含义不稳定,但模型的整体拟合效果仍然可以很好。解决办法常见三种:删除高相关因子、对因子做PCA降维、加L2正则化也就是岭回归。

后续追问通常是模型选择:随机森林和XGBoost在量化选股里怎么选?答题时不要说得太绝对,按场景拆:随机森林对异常值和噪声更鲁棒,支持并行训练,不容易因为个别极端因子把模型带偏;XGBoost在特征维度高且样本量充足时更容易提升精度,但过拟合风险更高,通常要靠早停和学习率控制。最后落一句“实际使用时可先用随机森林做特征重要性筛选,再对剩余因子用XGBoost预测”,既回答了比较,又体现工程经验。

4.2 回测评估:未来函数、幸存者偏差与成本假设

真题:你刚拿到一份回测结果,年化收益率超过50%,第一反应应该检查什么?这类题几乎每年都出现,常规回答是三个检查点。

先看未来函数:信号是不是用了当日收盘价并在当日成交?正确做法是信号必须只用截至昨日的数据,或对因子做shift(1)后再买入。再看幸存者偏差:回测股票池里有没有包含后来退市的公司,如果只保留今天还活着的股票,收益会被系统性高估。最后看交易成本:手续费、印花税、滑点是否设成0,或者只有佣金没有冲击成本。作答顺序建议按“数据-信号-成交-成本-绩效”链路逐项排查,面试官会觉得你有完整的问题定位思路。

如果要提到绩效指标,就把夏普比率、最大回撤、卡玛比率和换手率四个指标一起讲:夏普看风险调整后收益,最大回撤看尾部风险,卡玛比率等于年化收益除以最大回撤,换手率用来评估策略容量与交易成本。量化笔试中这类题的常见模板是“先检查,再指标,最后给改进方向”。

4.3 策略设计题:均值回归策略的现场作答模板

题目:请设计一个均值回归策略并说明关键参数。建议按四步作答,不要一开口就报买卖点。第一步,定义信号:用价格与N日均值的偏离构造z-score,z=(p-mean)/std,z小于-2时做多,z大于2时做空。第二步,定义仓位:单票仓位上限设为组合的5%-10%,或用资金规模除以信号强度。第三步,定义平仓:z回归到0附近时平仓,超过止损线强制离场。第四步,定义风控:设置单日最大亏损,并对行业暴露做中性化。

把动量策略和均值回归策略放在一起比较,能体现对不同市场环境的理解:

维度动量策略均值回归策略
适用环境趋势明确、有持续动能震荡市、价格偏离后回归
持有周期相对较长相对较短,换手更高
主要风险趋势反转均值不回归、长期偏离
关键参数回看窗口、持有期标准化窗口、开仓阈值

作答时还要提一句绩效评估:回测需要覆盖完整的牛熊周期,不能只拿一段上涨行情证明策略有效。这一句话通常是策略题的最后加分点,尤其当面试官追问“你怎么知道策略未来还赚钱”时,标准回答是“用样本外测试和参数稳定性检验来判断,而不是只改参数让历史曲线变好看”。

5. 易错点:五道高频题的失分细节与正确答法

以下五个易错点,基本对应十家公司真题里最高频的失分场景。每一条都按“错在哪、为什么错、怎么答对”拆开,考前建议专门过两遍。

5.1 年化夏普被当成日频夏普

错在哪:算完日收益率的均值和标准差后,直接相除当结果上报,连sqrt(252)都没乘。为什么错:没有把无风险利率按日折算,也没有做年化处理,算出来的数值看起来偏小,和面试官的预期对不上。怎么答对:先写完整公式:sharpe = (mean(returns) - rf/252) / std(returns) * sqrt(252)。再把代码写出来,risk_free和periods都做成参数,并说明如果是周频数据,periods改成52。写完之后用一组样例口头验证一遍,比如日收益率均值0.001、标准差0.02、无风险利率0.03,计算结果的量级应该在0.6左右,如果算出0.04,就是漏乘了sqrt(252)。

5.2 条件概率与联合概率混用

错在哪:看见“在上涨股票中有效的概率是80%”,就把0.8当成P(涨且有效)的答案。为什么错:条件概率的“给定上涨”和联合概率的“上涨且有效”在题干里只差几个字,抢时间时特别容易跳读,尤其题干还把两个数字放在同一句话里。怎么答对:先把事件符号写出来,区分P(有效|涨)和P(涨且有效),再决定用乘法还是贝叶斯公式。上面那道真题里,P(涨且有效)=0.7×0.8=0.56;如果是“已知因子有效,股票上涨的概率”,则要用0.56除以因子有效的总概率0.74,约0.757。这个习惯能帮你稳定拿到概率题的分数。

5.3 按股票取前一天数据却没有排序

错在哪:对DataFrame直接groupby然后shift,结果发现shift取到的是上一只股票的数据。为什么错:groupby不会自动重新排序,原始数据不是按date升序时,组内shift取到的是物理顺序的上一条记录,即上一只股票的最后一行。怎么答对:写成df.sort_values(['stock','date'])再groupby,并记住用transform保持行数一致。比如在计算个股动量时,正确写法是df['mom'] = df.groupby('stock')['close'].transform(lambda s: s / s.shift(20) - 1)。如果看到结果里第一行不是NaN,就要怀疑排序是否生效。

5.4 全样本标准化等于算未来函数

错在哪:回测时先拿全体股票的历史数据求均值和标准差,再对每一天的z-score做标准化,回测结果特别好,但一实盘就崩。为什么错:标准化时用到了当天之后的数据,属于典型的未来函数,回测里相当于偷偷让你看到了后续走势。怎么答对:改成滚动窗口或expanding窗口,并对因子做shift(1)后再排序选股,确保决策时只用当前时点之前能拿到的信息。可以写成:factor[date] = (value[date] - value.iloc[:date].mean()) / value.iloc[:date].std()。在笔试题里只要写出这个思路,面试官就知道你理解数据时效性。

5.5 最大回撤用全局高低点计算

错在哪:直接求prices数组的max和min,然后做差除以max。为什么错:回撤要求按时间顺序,从“截至当前的历史最高点”到“当前价格”的最大跌幅;全局最高点可能出现在某个低点之后,导致计算错配。比如序列[100, 90, 120, 80],全局最高120出现在全局最低80之前,用全局高低点算出的回撤是33.3%,但按时间顺序,120到80也是33.3%,这组数据恰好碰巧一致;换成[100, 120, 90, 110, 80],正确回撤是(120-80)/120=33.3%,而全局最高100到全局最低80是20%,结果完全错误。怎么答对:用一个变量维护峰值,边遍历边更新回撤,写成O(n)循环;如果要用numpy向量化,先做累积最大值:dd = (np.maximum.accumulate(prices) - prices) / np.maximum.accumulate(prices),再取max。

6. 真题答题顺序:筛题、拆题、复盘三个拿分习惯

拿到一份十家公司真题,建议不要从头到尾按顺序硬刷。先用5分钟把整卷扫一遍,按题目类型分成三类:送分题是期望方差、特征值这类计算量小、答案明确的题,争取一遍做对;中等题是pandas处理大表、回测判断这类要花时间写代码的题,留够40分钟;难题是策略设计或机器学习开放性问答,先列提纲再动笔,不要想到哪写到哪。时间分配可以参考:概率统计30分钟,编程题40分钟,策略设计30分钟,最后20分钟统一检查。

从十家公司真题的分布看,接下来笔试大概率还会落在三块内容上:第一是正态分布的四阶矩与方差计算,这类题能背结论就能拿分;第二是按股票分组计算动态因子,必须会排�序、shift、dropna这一套pandas组合;第三是回测里识别未来函数,表面问代码,实际问数据时效性。这三块都适合用重复练习稳定拿分,值得考前做专项训练。

我第一次限时刷这套题时,就是在概率题里写得太慢,导致编程题只剩20分钟,最后动量因子代码没处理空值,交卷前才发现。从那以后我给自己定了条规矩:概率题先写公式再填数字,编程题先写空函数和返回类型再补实现;每道题做完,强制问自己一句“这里有没有用到未来数据”。把每条易错点也过一遍再上考场,你会比同场多数人多拿至少十分。希望帮到你。

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

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

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

立即咨询