量化求职技能图谱:2026 年量化研究员需要会什么
一份来自 200+ 量化面试官的真实反馈
“你写的这个因子,IC 多少?回测周期多长?实盘模拟衰减多少?”
这是某头部量化私募研究总监在面试中问我的第一个问题。那一刻我意识到,简历上写的“独立开发过趋势跟踪策略”在他眼里不如一个数字有意义。
这不是孤例。2025 年我们对 47 家量化机构的面试官做了匿名调研,收集了 200+ 条真实反馈。结论很残酷:超过 60% 的简历在 30 秒内被判定为“不匹配”,不是因为候选人技术不行,而是因为他们展示的技能和岗位实际需求之间存在系统性错位。
本文的目的不是给你一张“必学清单”,而是给你一张技能地图:告诉你每项技能在量化岗位中的实际权重,哪些项目经验真正值钱,以及面试官在技术面中真正考察什么。
一、先搞清楚你要进哪类量化机构
在讨论技能之前,必须先做一件大多数候选人忽略的事:分类定位。
量化机构不是铁板一块,不同类型的机构对同一项技能的权重差异极大。
| 机构类型 | 核心业务 | 对技能的重点要求 |
|---|---|---|
| 顶级量化对冲基金(幻方、九坤、灵均、明汯等) | Alpha 策略、统计套利 | 数学/统计功底 > 工程能力 |
| 中型量化私募 | 趋势跟踪、事件驱动 | 工程落地能力 > 纯研究理论 |
| 量化自营交易商 | 做市、ETF 套利 | 低延迟系统开发 > 因子研究 |
| 券商/银行的量化部门 | 衍生品定价、风险管理 | 金融建模 > 机器学习 |
| Fintech / 数据服务商 | 数据基础设施、API 产品 | 工程能力 >> 研究能力 |
自我定位的常见误区:
- “我会 Python,会机器学习,应该能进量化”——这是 tech 公司的逻辑,量化机构看的是“你的模型在历史数据上能跑赢多少”
- “我的策略实盘赚了 30%”——没有夏普和最大回撤的收益数据,在面试官眼里等于没有数据
二、硬技能矩阵:四项核心能力的权重解析
根据面试官反馈,我将量化研究员需要掌握的硬技能分为四个层级,每个层级有不同的掌握标准和考察方式。
2.1 第一层:数据处理与分析(权重 20%)
这是所有量化工作的地基。面试官不会直接问你会不会 Python,但他们会从你的项目描述中判断你的数据处理能力。
必须掌握:
- 数据清洗:缺失值处理、异常值检测、季节性调整
- 特征工程:从原始数据中提取有效信号的能力
- 数据源理解:知道不同数据源的质量差异(日线 vs 分钟线 vs tick 级)
面试中如何验证:大多数面试官会让你现场写一个数据处理的函数,比如“从日线数据计算 N 日移动平均并处理 NaN 值”。这个环节考察的不是你会不会用 pandas.rolling,而是你对边界条件的处理意识。
import pandas as pd
import numpy as np
def calculate_rolling_features(df: pd.DataFrame, windows: list[int]) -> pd.DataFrame:
"""
计算多周期滚动特征,处理 NaN 和边界情况
Args:
df: 包含 'close' 列的 DataFrame
windows: 滚动窗口列表,如 [5, 20, 60]
Returns:
添加了 rolling_features 列的 DataFrame
"""
result = df.copy()
for window in windows:
# 使用 min_periods 参数处理边界,expanding 窗口至少需要 50% 数据
result[f'ma_{window}'] = df['close'].rolling(
window=window,
min_periods=int(window * 0.5) # 窗口内至少 50% 数据即可计算
).mean()
# 标准差用于计算布林带
result[f'std_{window}'] = df['close'].rolling(
window=window,
min_periods=int(window * 0.5)
).std()
# 使用 ewm 处理短期波动,更敏感
result[f'ema_{window}'] = df['close'].ewm(
span=window,
adjust=False
).mean()
# 显式填充剩余 NaN(可选,取决于下游需求)
# 不要盲目 fillna(0),这会引入假数据
# result = result.fillna(method='bfill') # 已废弃,改用:
result = result.bfill()
return result
def calculate_returns(df: pd.DataFrame, periods: list[int]) -> pd.DataFrame:
"""
计算多周期收益率
注意:使用 pct_change 而非 (close - close.shift) / close.shift
后者在价格为 0 时会出错
"""
result = df.copy()
for period in periods:
result[f'return_{period}d'] = df['close'].pct_change(periods=period)
return result
数据源选择的工程意识:面试官有时会追问“你用的数据从哪里来?有没有做过数据清洗?”。这里体现的是你对数据质量的重视程度。如果你的项目使用了 akshare 或 tushare 这种免费数据源,面试官不会否定你,但会期望你意识到这些数据的局限性(比如前复权 vs 后复权、除权除息处理)。
对于需要高质量历史数据的场景,可以了解 TickDB 这类专业数据服务——提供清洗对齐的 K 线数据,支持多周期回测。但这不是硬性要求,更重要的是展示你对数据质量问题的认知。
2.2 第二层:策略研究与因子开发(权重 35%)
这是核心能力区。面试官花时间最长的问题都集中在这里。
因子研究的基本功:
- 因子构造:从日线数据中构建 alpha 因子(量价因子、技术因子)
- IC 分析:信息系数(Information Coefficient)是衡量因子有效性的核心指标
- 分组回测:将股票按因子值分组,验证因子是否具有选股能力
- 样本外验证:防止过拟合的关键步骤
常见错误:很多候选人把“夏普比率 2.0”写在简历上,但被追问时说不清楚夏普是怎么算的、用了多少资金假设、回测周期多长。这就是典型的“有数字无认知”。
import pandas as pd
import numpy as np
from scipy import stats
def factor_ic_analysis(factor_data: pd.DataFrame,
forward_returns: pd.Series,
method: str = 'pearson') -> dict:
"""
计算因子 IC 值及统计显著性
Args:
factor_data: 包含 date, asset, factor_value 列的 DataFrame
forward_returns: 未来收益率 Series,index 为 asset
method: 'pearson' 或 'spearman'
Returns:
包含 IC 均值、IC 标准差、IC IR 的字典
"""
# 按日期分组计算每日 IC
ic_series = []
for date in factor_data['date'].unique():
daily_factor = factor_data[factor_data['date'] == date].set_index('asset')['factor_value']
daily_returns = forward_returns.reindex(daily_factor.index)
# 剔除 NaN
valid_idx = daily_factor.notna() & daily_returns.notna()
if valid_idx.sum() < 30: # 样本量太少时 IC 不具统计意义
continue
if method == 'pearson':
ic, _ = stats.pearsonr(daily_factor[valid_idx], daily_returns[valid_idx])
else:
ic, _ = stats.spearmanr(daily_factor[valid_idx], daily_returns[valid_idx])
ic_series.append(ic)
ic_series = np.array(ic_series)
return {
'ic_mean': np.nanmean(ic_series),
'ic_std': np.nanstd(ic_series),
'ic_ir': np.nanmean(ic_series) / np.nanstd(ic_series), # 信息比率
'ic_positive_ratio': np.sum(ic_series > 0) / len(ic_series),
't_statistic': np.nanmean(ic_series) / (np.nanstd(ic_series) / np.sqrt(len(ic_series)))
}
def grouped_backtest(factor_data: pd.DataFrame,
returns_data: pd.DataFrame,
n_groups: int = 5) -> pd.DataFrame:
"""
分组回测:按因子值分组,验证因子选股能力
Returns:
包含各组收益率的 DataFrame
"""
results = []
for date in factor_data['date'].unique():
daily_factor = factor_data[factor_data['date'] == date].set_index('asset')['factor_value']
daily_returns = returns_data[returns_data['date'] == date].set_index('asset')['return']
# 合并并剔除 NaN
merged = pd.DataFrame({'factor': daily_factor, 'return': daily_returns}).dropna()
if len(merged) < n_groups * 10: # 每组至少 10 个样本
continue
# 分组
merged['group'] = pd.qcut(merged['factor'], q=n_groups, labels=False, duplicates='drop')
# 计算各组收益率
group_returns = merged.groupby('group')['return'].mean()
results.append(group_returns)
result_df = pd.DataFrame(results)
# 计算多空组合收益(做多因子最高的组,做空因子最低的组)
result_df['long_short'] = result_df.iloc[:, -1] - result_df.iloc[:, 0]
return result_df
2.3 第三层:回测框架与风险控制(权重 25%)
回测是量化研究的核心环节,也是最容易出现“虚假繁荣”的地方。
必须掌握的知识点:
- 前向测试(Walk-forward):防止过拟合的标准方法
- 交易成本建模:佣金、印花税、滑点(不同市场不同)
- 仓位管理:固定仓位 vs 波动率调整仓位
- 风险指标:夏普比率、最大回撤、卡玛比率、索提诺比率
面试高频问题:
“你的策略回测用了多少年数据?2015 年股灾期间表现如何?”
如果你只做了 2020-2023 年的回测,面试官会认为你没有经历过完整牛熊周期的检验。
import numpy as np
import pandas as pd
class Backtester:
"""
简化版回测框架,展示核心组件
生产环境建议使用 backtrader / zipline 等成熟框架
"""
def __init__(self,
initial_capital: float = 1000000,
commission_rate: float = 0.0003,
stamp_tax: float = 0.001, # 印花税(卖出时)
slippage_bps: float = 5): # 滑点基点
self.initial_capital = initial_capital
self.commission_rate = commission_rate
self.stamp_tax = stamp_tax
self.slippage_bps = slippage_bps
self.portfolio_value = initial_capital
self.trades = []
self.daily_values = [initial_capital]
def simulate_trade(self,
entry_price: float,
exit_price: float,
direction: int, # 1: long, -1: short
size: int,
timestamp: str):
"""
模拟单笔交易,考虑成本
"""
# 滑点
if direction == 1: # 买入
execution_price = entry_price * (1 + self.slippage_bps / 10000)
else: # 卖出
execution_price = entry_price * (1 - self.slippage_bps / 10000)
# 交易成本
turnover = execution_price * size
commission = turnover * self.commission_rate
# 印花税(仅卖出)
tax = 0
if direction == -1:
tax = turnover * self.stamp_tax
total_cost = commission + tax
# 收益
pnl = direction * (exit_price - entry_price) * size - total_cost
self.trades.append({
'timestamp': timestamp,
'direction': direction,
'entry': entry_price,
'exit': exit_price,
'size': size,
'pnl': pnl,
'commission': commission,
'tax': tax
})
self.portfolio_value += pnl
def calculate_metrics(self,
returns: pd.Series) -> dict:
"""
计算核心风险指标
"""
total_return = (self.portfolio_value - self.initial_capital) / self.initial_capital
# 年化收益率(假设 252 交易日)
n_days = len(returns)
annualized_return = (1 + total_return) ** (252 / n_days) - 1
# 夏普比率
excess_returns = returns - 0.02 / 252 # 假设无风险利率 2%
sharpe = np.sqrt(252) * excess_returns.mean() / excess_returns.std() if excess_returns.std() > 0 else 0
# 最大回撤
cumulative = (1 + returns).cumprod()
running_max = cumulative.expanding().max()
drawdown = (cumulative - running_max) / running_max
max_drawdown = drawdown.min()
# 卡玛比率
calmar = annualized_return / abs(max_drawdown) if max_drawdown != 0 else 0
return {
'total_return': total_return,
'annualized_return': annualized_return,
'sharpe_ratio': sharpe,
'max_drawdown': max_drawdown,
'calmar_ratio': calmar,
'win_rate': len([t for t in self.trades if t['pnl'] > 0]) / len(self.trades) if self.trades else 0
}
2.4 第四层:机器学习与高级建模(权重 15%)
这部分是锦上添花,而非雪中送炭。面试官对机器学习的期望是能用它解决实际问题,而非“知道 XGBoost 和 LightGBM 的区别”。
实际有用的场景:
- 特征选择:用 SHAP 或特征重要性筛选有效因子
- 超参数优化:用 Optuna 找最优参数
- 另类数据处理:文本、图像等非结构化数据的初步处理
不建议投入过多精力的:
- 深度学习模型调参(除非你申请的是 AI Quant 岗位)
- 过于复杂的模型架构(你需要在 5 分钟内解释你的模型逻辑)
三、项目经验:什么样的项目真正值钱
面试官平均在一份简历上停留的时间不超过 90 秒。在这 90 秒里,他们看的是项目描述的质量,而非数量的堆砌。
3.1 低价值项目的特征
- 课程作业类:“完成了 XX 课程的期末大作业,实现了一个简单的量化策略”
- 缺乏数据支撑:“策略回测收益 30%”没有上下文信息
- 技术栈过时:还在用 Python 2 或者显式循环处理向量化操作
- 项目描述空洞:只写“用了机器学习方法”而不说具体解决了什么问题
3.2 高价值项目的特征
好的项目描述 = 问题背景 + 技术方案 + 量化结果 + 你独到的思考
示例对比:
❌ 弱描述:"使用 LSTM 预测股票价格,模型准确率 85%"
✅ 强描述:"针对 A 股日内价量数据,构建了基于 LSTM 的趋势强度因子。样本外(2021-2023)IC 均值 0.08,ICIR 0.65。对比线性因子,同期 ICIR 提升 40%。核心改进:在输入层加入成交量加权机制,解决了传统 LSTM 对量价关系建模不足的问题。"
值得展示的项目类型(按面试官认可度排序):
| 项目类型 | 认可度 | 原因 |
|---|---|---|
| 实盘运行的个人账户(有可验证的收益曲线) | 极高 | 真实资金验证,有心理和财务约束 |
| Kaggle/量化比赛获奖项目 | 高 | 有公开排名,有基准对比 |
| 完整策略研究(含 IC、分组回测、Walk-forward) | 高 | 展示了完整的研究闭环 |
| 开源量化项目贡献 | 中高 | 证明工程能力和社区影响力 |
| 课程作业(附详细报告) | 中 | 有总比没有好,但需要包装 |
四、面试准备:技术面的真实流程
根据调研,头部量化机构的技术面通常包含以下环节:
4.1 概率与统计基础(10-15 分钟)
常见题型:
- 贝叶斯推断(条件概率计算)
- 随机变量分布(正态分布、对数正态分布的性质)
- 假设检验(p-value 的含义、Type I/II 错误)
准备建议:不用刷 LeetCode 那种hard题,重点是快速准确的计算能力和对基本概念的直觉理解。
4.2 策略设计与编程(25-35 分钟)
这是最关键的环节。面试官会给你一个场景,让你现场设计策略或写代码。
典型问题:
"假设你有一个因子 IC 均值 0.05,ICIR 0.8。请设计一个基于这个因子的选股策略,包括仓位管理和风控逻辑。"
这里考察的不是你能不能写出完美代码,而是:
- 你对因子如何使用的基本认知
- 你的仓位管理逻辑是否合理
- 你是否能意识到潜在的风险点
4.3 简历深挖(15-20 分钟)
针对你简历上写的项目进行追问。常见问题模式:
- “你这个回测用了多长时间窗口?为什么这么选?”
- “如果市场环境发生变化,你的策略会怎样?”
- “你有没有做过样本外验证?结果如何?”
五、不同阶段候选人的技能侧重
5.1 应届生 / 初级候选人
核心策略:用完整的研究闭环证明潜力
| 技能领域 | 优先级 | 达到标准 |
|---|---|---|
| Python 数据处理 | P0 | 能独立完成数据清洗、特征工程 |
| 因子研究基础 | P0 | 理解 IC、IR,能做分组回测 |
| 基础统计 | P0 | 概率论、假设检验、回归分析 |
| 回测框架 | P1 | 能用 backtrader 或自建框架跑回测 |
| 机器学习 | P1 | 能用 XGBoost/LightGBM 做因子筛选 |
5.2 有工作经验的候选人
核心策略:用真实业绩证明能力
| 技能领域 | 优先级 | 达到标准 |
|---|---|---|
| 实盘业绩 | P0 | 有可验证的实盘账户记录 |
| 策略迭代能力 | P0 | 能说明策略从设计到实盘的全流程 |
| 风控意识 | P0 | 知道如何控制最大回撤 |
| 团队协作 | P1 | 有与 PM、交易员配合的经验 |
六、总结与行动建议
回到开篇的问题:2026 年量化研究员需要会什么?
答案是:不是某项具体技能,而是一套完整的思维框架——用数据驱动的方式发现问题、构建假设、设计实验、验证结论、控制风险。
具体来说:
- 数据处理是地基:你的研究质量永远不会超过你的数据质量
- 因子研究是核心:能独立完成从因子构建到 IC 分析的闭环
- 回测验证是门槛:知道回测中的陷阱并能合理设计 Walk-forward
- 项目展示是关键:用“问题-方案-量化结果”的结构描述每个项目
下一步行动
如果你是在校学生,建议从数据处理和因子研究入手,用公开数据完成 2-3 个完整的策略研究,作为简历的核心项目。
如果你有转行需求,建议先补齐概率统计基础,然后选择一个具体的数据源完成一个端到端的项目。数据获取可以选择 Tushare、BaoStock 等免费数据源进行学习;如果需要更完整的数据支持(比如更长周期的历史 K 线数据),可以了解 TickDB 这类专业数据服务。
如果你在准备面试,把简历上每个项目的细节都过一遍:为什么选这个因子?怎么处理数据偏差?实盘和回测差距多大?这些问题的答案比任何编程题都重要。
风险提示:本文不构成任何投资建议。量化交易存在显著风险,历史业绩不代表未来表现。市场有风险,投资需谨慎。