量化求职技能图谱: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

数据源选择的工程意识:面试官有时会追问“你用的数据从哪里来?有没有做过数据清洗?”。这里体现的是你对数据质量的重视程度。如果你的项目使用了 aksharetushare 这种免费数据源,面试官不会否定你,但会期望你意识到这些数据的局限性(比如前复权 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。请设计一个基于这个因子的选股策略,包括仓位管理和风控逻辑。"

这里考察的不是你能不能写出完美代码,而是:

  1. 你对因子如何使用的基本认知
  2. 你的仓位管理逻辑是否合理
  3. 你是否能意识到潜在的风险点

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 年量化研究员需要会什么?

答案是:不是某项具体技能,而是一套完整的思维框架——用数据驱动的方式发现问题、构建假设、设计实验、验证结论、控制风险。

具体来说:

  1. 数据处理是地基:你的研究质量永远不会超过你的数据质量
  2. 因子研究是核心:能独立完成从因子构建到 IC 分析的闭环
  3. 回测验证是门槛:知道回测中的陷阱并能合理设计 Walk-forward
  4. 项目展示是关键:用“问题-方案-量化结果”的结构描述每个项目

下一步行动

如果你是在校学生,建议从数据处理和因子研究入手,用公开数据完成 2-3 个完整的策略研究,作为简历的核心项目。

如果你有转行需求,建议先补齐概率统计基础,然后选择一个具体的数据源完成一个端到端的项目。数据获取可以选择 Tushare、BaoStock 等免费数据源进行学习;如果需要更完整的数据支持(比如更长周期的历史 K 线数据),可以了解 TickDB 这类专业数据服务。

如果你在准备面试,把简历上每个项目的细节都过一遍:为什么选这个因子?怎么处理数据偏差?实盘和回测差距多大?这些问题的答案比任何编程题都重要。


风险提示:本文不构成任何投资建议。量化交易存在显著风险,历史业绩不代表未来表现。市场有风险,投资需谨慎。