量化面试、策略论文、开源工具与学习资源。
- 🌟 VectorBT - 向量化回测引擎,NumPy/Numba 加速,大规模参数扫描首选
- 🌟 Backtrader - 事件驱动回测框架,功能全面,支持实盘
- Zipline Reloaded - Quantopian 经典引擎的社区维护版
- 🌟🌟 Qlib - 微软 AI 量化平台,数据→模型→回测→分析全流程
- 🌟 vnpy - 国内最流行的量化框架,股票/期货/期权/加密货币实盘
- 🌟 Hummingbot - 开源做市与套利机器人,CEX + DEX 全覆盖
- 🌟🌟 RD-Agent - 微软亚研院自动化研发 Agent,读论文→做因子→跑实验,集成 Qlib
- 🌟 FinRL - 金融强化学习框架
- FinGPT - 开源金融 LLM,LoRA 微调,情感分析/研报解读
- FinRobot - 基于 LLM 的多 Agent 金融分析平台
- 🌟🌟 QuantsPlaybook - 券商金工研报复现合集(华泰/光大/招商/国信),100+ 策略
- huatai-finengi-report - 华泰金工研报集合:CNN 选股、时序交叉验证、ML 多因子
- 🌟 QuantLib - 工业级衍生品定价库,C++ 内核 + Python 绑定
- cvxpy - Python 凸优化,组合优化/风险预算
- NautilusTrader - 高性能回测+实盘,Rust 内核 + Python API
- Polars - 比 pandas 快 10-50x 的数据处理库
- 🌟 awesome-quant - 量化金融资源大全:库、框架、数据源、书籍
- 🌟 quant-wiki - 量化知识开源与汉化,打破国内外量化金融行业信息差
- awesome-ai-in-finance - AI + 金融:LLM、深度学习策略、RL 交易
- awesome-systematic-trading - 系统化交易资源,覆盖期货/期权/外汇/加密
量化交易不是一条路,而是很多条。不同方向的底层逻辑、数据频率、持仓周期差异巨大,选方向比选策略更重要。下面按主流方向整理了奠基性论文和经典著作,每篇都是这个领域绕不开的工作。
在期货和外汇市场上做系统化趋势与动量。天然多空双向,对冲股市 Beta,08 年金融危机期间不少 CTA 基金逆势盈利,所以也叫"危机 Alpha"。国内 CTA 私募近年发展很快,是量化求职的热门方向之一。
- 🌟 Moskowitz, Ooi & Pedersen (2012). Time Series Momentum. JFE
- 🌟 Hurst, Ooi & Pedersen (2017). A Century of Evidence on Trend-Following Investing. AQR
- Fung & Hsieh (2001). The Risk in Hedge Fund Strategies: Theory and Evidence from Trend Followers. RFS
- Hamill, Rattray & Van Hemert (2016). Trend Following: Equity and Bond Crisis Alpha. AQR
- Baltas & Kosowski (2013). Momentum Strategies in Futures Markets and Trend-Following Funds.
- Levine & Pedersen (2016). Which Trend Is Your Friend? FAJ
- 📖 Perry Kaufman.《Trading Systems and Methods》
和 CTA 高度重叠,但更纯粹地聚焦方向性信号。胜率通常只有 30%-40%,靠盈亏比赚钱。核心不是预测,而是跟随——趋势来了跟上,反转了止损走人。纪律比模型重要。
- 🌟 Jegadeesh & Titman (1993). Returns to Buying Winners and Selling Losers. JF
- 🌟 Asness, Moskowitz & Pedersen (2013). Value and Momentum Everywhere. JF
- Lempérière et al. (2014). Two Centuries of Trend Following. JIS
- Faber (2007). A Quantitative Approach to Tactical Asset Allocation. JWM
- Baz et al. (2015). Dissecting Investment Strategies in the Cross Section and Time Series.
- Babu et al. (2020). You Can't Always Trend When You Want. JPM
- 📖 Andreas Clenow.《Following the Trend》
毫秒甚至微秒级持仓,通过速度优势和微观结构信息赚取微小但高频的利润。基础设施(co-location、FPGA、网络延迟)是真正的壁垒,策略容量有限但利润率极高。面试中微观结构的论文是必考内容。
- 🌟 Kyle (1985). Continuous Auctions and Insider Trading. Econometrica
- 🌟 Glosten & Milgrom (1985). Bid, Ask and Transaction Prices in a Specialist Market. JFE
- 🌟 Avellaneda & Stoikov (2008). High-Frequency Trading in a Limit Order Book. QF
- Cont, Stoikov & Talreja (2010). A Stochastic Model for Order Book Dynamics. OR
- Bouchaud, Farmer & Lillo (2009). How Markets Slowly Digest Changes in Supply and Demand.
- Menkveld (2013). High Frequency Trading and the New Market Makers. JFM
- 📖 Cartea, Jaimungal & Penalva (2015).《Algorithmic and High-Frequency Trading》
- 📖 Hasbrouck (2007).《Empirical Market Microstructure》
- 📖 Ernest Chan.《Quantitative Trading》
在买卖两端持续报价,赚取 bid-ask spread。听起来简单,难点在于逆向选择——和知情交易者成交就是亏钱。做市的数学框架非常优美,Avellaneda-Stoikov 模型几乎是所有做市面试的起点。Hummingbot 等开源项目让你可以在加密市场上实际跑做市策略。
- 🌟 Ho & Stoll (1981). Optimal Dealer Pricing Under Transactions and Return Uncertainty. JFE
- 🌟 Guéant, Lehalle & Fernandez-Tapia (2013). Dealing with the Inventory Risk. MFE
- Grossman & Miller (1988). Liquidity and Market Structure. JF
- Stoikov (2018). The Micro-Price: A High-Frequency Estimator of Future Prices. QF
- Glosten & Harris (1988). Estimating the Components of the Bid-Ask Spread. JFE
- Amihud & Mendelson (1980). Dealership Market: Market-Making with Inventory. JFE
- Guilbaud & Pham (2013). Optimal High-Frequency Trading with Limit and Market Orders. QF
利用资产间的统计关系(协整、相关性、因子结构),在偏离时建仓、回归时平仓。市场中性,不赌方向。配对交易是最经典的入门,但现代统计套利早已进化到 PCA 驱动的篮子交易和机器学习信号。需要警惕相关性崩溃的尾部风险。
- 🌟 Engle & Granger (1987). Co-integration and Error Correction. Econometrica
- 🌟 Gatev, Goetzmann & Rouwenhorst (2006). Pairs Trading: Performance of a Relative-Value Arbitrage Rule. RFS
- Avellaneda & Lee (2010). Statistical Arbitrage in the US Equities Market. QF
- Kakushadze (2016). 101 Formulaic Alphas. Wilmott
- Krauss (2017). Statistical Arbitrage Pairs Trading Strategies: Review and Outlook. JES
- 📖 Pole (2007).《Statistical Arbitrage》
- 📖 Vidyamurthy (2004).《Pairs Trading: Quantitative Methods and Analysis》
不赌涨跌,赌波动率。利用期权的非线性特性和隐含波动率的错误定价获利。策略包括波动率套利、gamma scalping、dispersion trading、尾部对冲等。Black-Scholes 是起点,但真正赚钱靠的是对波动率曲面的理解——Gatheral 的书是业界圣经,粗糙波动率(Rough Vol)是近年最大的理论突破。
- 🌟 Black & Scholes (1973). The Pricing of Options and Corporate Liabilities. JPE
- 🌟 Heston (1993). A Closed-Form Solution for Options with Stochastic Volatility. RFS
- 🌟 Gatheral, Jaisson & Rosenbaum (2018). Volatility Is Rough. QF
- Dupire (1994). Pricing with a Smile. Risk
- Carr & Madan (1999). Option Valuation Using the Fast Fourier Transform. JCF
- Bates (1996). Jumps and Stochastic Volatility. RFS
- Bergomi (2005). Smile Dynamics. Risk
- 📖 Gatheral (2006).《The Volatility Surface: A Practitioner's Guide》
- 📖 Taleb (1997).《Dynamic Hedging: Managing Vanilla and Exotic Options》
面试
| 书名 | 说明 |
|---|---|
| 🌟《A Practical Guide to Quantitative Finance Interviews》(Xinfeng Zhou) | 绿皮书,量化面试人手一本,概率/数学/脑筋急转弯全覆盖 |
| 《Heard on the Street》(Timothy Crack) | 华尔街经典面试题集,偏概率和智力题 |
| 《Quant Job Interview Questions and Answers》(Mark Joshi) | 偏衍生品定价方向,适合期权岗 |
数学与统计
| 书名 | 说明 |
|---|---|
| 🌟《Introduction to Probability》(Blitzstein & Hwang) | Harvard 概率论教材,有免费 PDF,例题极好,面试前刷完前 6 章 |
| 《Probability and Statistics for Engineering and the Sciences》(Devore) | 概率统计标准教材,覆盖面广 |
| 《All of Statistics》(Wasserman) | 统计学速成,写给 CS 背景的人看的,紧凑高效 |
| 🌟《Analysis of Financial Time Series》(Tsay) | 金融时间序列的权威教材,ARMA/GARCH/协整全覆盖 |
| 🌟《Stochastic Calculus for Finance I & II》(Shreve) | 随机微积分的金标准,I 是离散,II 是连续,推导 Black-Scholes 的必经之路 |
| 《Convex Optimization》(Boyd & Vandenberghe) | 凸优化经典,有免费 PDF,组合优化和风控都离不开 |
编程
| 书名 | 说明 |
|---|---|
| 《Python for Data Analysis》(McKinney) | pandas 作者亲著,数据清洗的工具书 |
| 《Effective Modern C++》(Meyers) | 现代 C++ 最佳实践,低延迟系统岗必读 |
| 《Python for Finance》(Hilpisch) | 从零到量化系统的 Python 实战 |
| 《Introduction to Linear Algebra》(Strang) | 配合 MIT 18.06 公开课食用,PCA/因子模型的数学基础 |
因子与策略
| 书名 | 说明 |
|---|---|
| 《Quantitative Equity Portfolio Management》(Chincarini & Kim) | 量化股票组合从因子到实盘的全流程 |
| 🌟《Advances in Financial Machine Learning》(de Prado) | 金融 ML 实战圣经,数据结构化/防过拟合/回测方法论,业界人手一本 |
| 🌟《Active Portfolio Management》(Grinold & Kahn) | 主动管理的理论框架,信息比率、alpha 转移,基金公司研究员必读 |
| 《Options, Futures, and Other Derivatives》(Hull) | 衍生品入门标准教材,覆盖期货/互换/期权,适合建立全局观 |
| 《Option Volatility and Pricing》(Natenberg) | 期权交易实战视角,Greeks 直觉讲得很好 |
机器学习
| 书名 | 说明 |
|---|---|
| 🌟《The Elements of Statistical Learning》(Hastie et al.) | 统计学习理论经典,有免费 PDF,树模型/正则化/集成学习讲得最透彻 |
| 《Deep Learning》(Goodfellow et al.) | "花书",深度学习理论基础,CNN/RNN/GAN/优化全覆盖 |
| 《Machine Learning for Asset Managers》(de Prado) | 资管视角的 ML,聚类/特征重要性/组合构建,薄但密度极高 |
中文
| 书名 | 说明 |
|---|---|
| 🌟 石川 等.《因子投资:方法与实践》 | 中文因子投资圣经,从因子定义到组合构建到陷阱规避,系统性最强 |
| 丁鹏.《量化投资:策略与技术》 | 国内量化入门经典,适合建立全局认知 |
| 杨博理 等.《量化投资:以Python为工具》 | Python 量化实操入门,有代码可跑 |
- 🌟 石川 / 川总写量化 - 知乎 / 公众号. 国内因子投资写得最好的人,没有之一。每篇文章都有学术论文支撑,但写得让非科班也能看懂。做因子方向必须关注。
- 🌟 因子动物园 (Factor Zoo) - 公众号. 石川团队出品,系统梳理学术因子文献,追踪前沿论文,比自己翻 SSRN 效率高十倍。
- 🌟 量化投资与机器学习 (QIML) - 公众号. 国内最大的量化公众号,覆盖 ML 策略、因子研究、行业招聘动态,信息密度高。
- 交易门 - 播客/公众号. 对话国内外顶尖交易员和量化基金经理,听行业里的人怎么想问题。
- 数量经济学 - 知乎/公众号. 偏学术向,计量经济学与金融实证方法,适合想打扎实理论基础的人。
- 大邓和他的Python - 知乎/B站. Python 量化编程教程,适合零基础入门。
- 🌟 聚宽 JoinQuant - 国内最大量化投研平台,免费数据、回测引擎、社区策略分享,入门首选。
- 米筐 RiceQuant - 专业量化研究平台,数据质量高,机构用户多。
- 优矿 Uqer - 通联数据旗下,数据全面,API 友好。
- QuantConnect - 国际量化平台,Lean 引擎开源,支持多资产多市场。
- 发明者量化 FMZ - 数字货币/期货量化,支持多语言策略,社区活跃。
- 知乎:量化交易 - 高质量问答和专栏,搜具体问题经常能找到好答案。
- 经管之家 - 老牌经济金融学术论坛,有不少历史沉淀的好帖。
| 数据源 | 类型 | 链接 |
|---|---|---|
| 🌟 Tushare Pro | 免费,股票/基金/期货/可转债 | tushare.pro |
| 🌟 AKShare | 开源免费 | akfamily/akshare |
| BaoStock | 免费,日K/分钟K/财报 | baostock.com |
| Wind 万得 | 机构级,最全(付费) | wind.com.cn |
| 东方财富 Choice | 机构级(付费) | choice.eastmoney.com |
| efinance | 开源爬虫 | mpquant/efinance |
| 团队 | 研究方向 |
|---|---|
| 🌟 华泰金工 | 「人工智能选股」系列、因子体系 |
| 🌟 光大金工 | 因子择时、事件驱动 |
| 天风金工 | 基本面因子、另类数据 |
| 中金量化 | 宏观量化、资产配置 |
| 招商金工 | 多因子模型、行业轮动 |
| 开源证券金工 | 覆盖面广 |
- 🌟 QuantGuide.io - 量化版 LeetCode,概率与数学题库
- Brainstellar - 量化面试脑筋急转弯
- Jane Street Puzzles - 月度谜题,高于面试难度
- Zetamac - 心算速度训练,目标 50+
- Jane Street Kaggle - $100K 奖金,真实市场数据
- WorldQuant BRAIN - 10万+ 用户,为 alpha 信号付费
- Citadel Datathon - 直通面试
- SSRN - 量化金融工作论文
- arXiv q-fin - 金融领域最新预印本
- NBER Working Papers
- Risk.net / Journal of Financial Economics / Journal of Portfolio Management
标准答案:
条件概率
贝叶斯公式:
直觉:贝叶斯公式是"用新证据更新旧信念"的数学表达。$P(A)$ 是先验(你原来的判断),$P(B|A)$ 是似然(新证据在你判断下出现的可能性),$P(A|B)$ 是后验(看到证据后的新判断)。
量化应用:贝叶斯方法在信号衰减判断、因子择时、Black-Litterman模型中被广泛使用。
标准答案:
- 大数定律(LLN):样本均值随样本量增大而趋近于总体均值。强调的是收敛。
- 中心极限定理(CLT):无论总体分布如何,样本均值的分布在n足够大时近似正态分布。强调的是分布形态。
关键区别:LLN告诉你"平均值会收敛到真值",CLT告诉你"收敛过程的波动长什么样"。
量化应用:CLT是计算VaR、构建置信区间、进行策略回测统计检验的理论基础。如果收益率不满足独立同分布假设(如存在自相关或异方差),CLT的收敛速度会变慢,需要用Newey-West等方法修正。
标准答案:
鞅是一种随机过程,满足
金融意义:
- 在风险中性测度下,折现后的资产价格是鞅——这是期权定价的理论基础
- 如果市场价格是鞅,则不存在趋势性的可预测利润,与有效市场假说一致
- 鞅差分序列(Martingale Difference Sequence)常用于检验收益率的可预测性
标准答案:
| 分布 | 特征 | 量化应用 |
|---|---|---|
| 正态分布 | 均值对称、薄尾 | 收益率建模的基准假设(但实际中有偏度和峰度) |
| 对数正态分布 | 取对数后为正态 | 股票价格建模(GBM中价格服从对数正态) |
| t 分布 | 厚尾 | 更真实地描述收益率尾部风险,小样本推断 |
| 泊松分布 | 离散事件计数 | 跳跃扩散模型中的跳跃次数 |
| 指数分布 | 等待时间 | 订单到达间隔建模(高频) |
延伸:实际收益率分布通常呈现"尖峰厚尾"(leptokurtic),正态假设会低估极端风险。用Student-t、GED或混合正态分布能更好地拟合。
标准答案:
- MLE:寻找使观测数据出现概率最大的参数值。$\hat{\theta}{MLE} = \arg\max{\theta} \prod_{i} f(x_i | \theta)$
- GMM(广义矩估计):利用总体矩条件与样本矩的匹配来估计参数,不需要假定完整的分布形式
核心区别:MLE需要完整的分布假设,效率高但对错误假设敏感;GMM更灵活,只需要矩条件,是半参数方法。
量化应用:GARCH模型常用MLE估计;资产定价模型(如Fama-French)的参数常用GMM估计;Hansen(1982)提出的GMM框架是实证资产定价的核心方法论。
标准答案:
p 值是在零假设为真的前提下,观测到当前统计量或更极端值的概率。
不能说"零假设为真的概率",因为p值是条件概率
量化应用中的陷阱:
- 策略回测中对数百个参数组合做假设检验,会出现多重检验问题(Multiple Testing)
- 一个p < 0.05的策略,如果是从1000个策略中筛选出来的,真实显著性远低于5%
- 修正方法:Bonferroni校正、Benjamini-Hochberg(FDR控制)、Bailey-López de Prado-Marcos的**"发夹弯"校正**
标准答案:
协方差矩阵
困难之处:
-
维度灾难:N个资产需要估计
$N(N+1)/2$ 个参数,当N大于样本量T时,样本协方差矩阵奇异 - 噪声放大:样本协方差矩阵中的小特征值会被取逆时放大,导致组合权重极端
- 非平稳性:协方差结构随时间变化
常用解决方案:
- Ledoit-Wolf收缩估计:将样本矩阵向结构化目标(如对角阵)收缩
-
因子模型降维:假设
$\Sigma = B F B^T + D$ (因子部分 + 特异性部分) - 随机矩阵理论(RMT):用Marchenko-Pastur分布识别并剔除噪声特征值
- DCC-GARCH:建模时变协方差
标准答案:
- EVD:$A = P \Lambda P^{-1}$,仅适用于方阵。$\Lambda$ 是特征值对角阵。
- SVD:$A = U \Sigma V^T$,适用于任意矩阵。$\Sigma$ 是奇异值对角阵。
对于对称半正定的协方差矩阵,EVD和SVD等价。
量化应用:
- PCA(主成分分析):对收益率协方差矩阵做EVD,前几个主成分通常对应市场、规模、价值等系统性因子
- 降噪:去除小特征值对应的成分
- 正则化:SVD用于病态线性回归(岭回归本质上是对奇异值做收缩)
标准答案:
正定矩阵满足对任意非零向量
协方差矩阵必须半正定,因为组合方差
标准答案:
- 严平稳:联合分布不随时间平移改变
- 宽平稳(弱平稳):均值和自协方差函数不随时间变化
为什么关心:几乎所有时间序列建模方法(ARMA、协整分析等)都假设平稳性。对非平稳序列直接建模会产生伪回归(Spurious Regression),R²虚高但没有真实关系。
检验方法:ADF检验、PP检验、KPSS检验(注意KPSS的零假设是平稳)。
处理方法:差分(I(1)序列差分一次变平稳)、去趋势、对数变换。
标准答案:
- ARIMA(p,d,q):建模条件均值。描述收益率本身的自回归和移动平均结构。
- GARCH(p,q):建模条件方差。描述波动率的聚集效应(volatility clustering)。
联系:通常组合使用,ARIMA建模均值方程,GARCH建模残差的方差方程。完整模型:
量化应用:GARCH族模型广泛用于波动率预测、VaR计算、期权隐含波动率建模。常用扩展包括EGARCH(捕捉杠杆效应)、GJR-GARCH等。
标准答案:
- 相关性:衡量两个变量线性关联的强度,是静态的
- 协整:两个非平稳序列的某个线性组合是平稳的,是动态的长期均衡关系
经典例子:醉汉和他的狗——各自随机游走(非平稳),但距离围绕某个均值波动(协整)。
量化应用:配对交易(Pairs Trading)的理论基础。找到协整关系后:
- 构建价差
$S_t = Y_t - \beta X_t$ - 当价差偏离均值时建仓,回归时平仓
- 常用Engle-Granger两步法或Johansen检验判断协整关系
注意:高相关不代表协整,协整也不要求高相关。
标准答案:
布朗运动(维纳过程)
$W_0 = 0$ - 增量独立且服从
$W_{t+s} - W_t \sim N(0, s)$ - 路径连续但处处不可微
Itô引理:随机微积分的"链式法则"。若
比普通链式法则多了
量化应用:推导Black-Scholes公式、理解对冲比率(Delta)、推导各种衍生品定价公式。
标准答案:
GBM模型:$dS_t = \mu S_t , dt + \sigma S_t , dW_t$
解为:$S_t = S_0 \exp\left[(\mu - \frac{\sigma^2}{2})t + \sigma W_t\right]$
假设:
- 对数收益率独立同分布且服从正态
- 波动率恒定
- 无跳跃
局限:
- 实际中波动率不恒定(波动率微笑/偏斜)
- 收益率有厚尾(极端事件被低估)
- 存在跳跃(如财报发布、政策突变)
- 收益率存在自相关和波动率聚集
改进模型:随机波动率模型(Heston)、跳跃扩散模型(Merton)、局部波动率模型(Dupire)。
标准答案:
| 类型 | 可变性 | 有序性 | 查找复杂度 | 量化场景 |
|---|---|---|---|---|
| list | 可变 | 有序 | O(n) | 时间序列存储、策略信号列表 |
| tuple | 不可变 | 有序 | O(n) | 作为dict的key(如 (date, ticker))、函数多返回值 |
| dict | 可变 | 有序(3.7+) | O(1) | ticker→price映射、参数配置 |
| set | 可变 | 无序 | O(1) | 股票池去重、集合运算(交集并集求共同持仓) |
面试高频追问:dict的底层实现是哈希表,冲突解决用开放寻址法(CPython);set也是哈希表。
标准答案:
- 浅拷贝(
copy.copy()或list.copy()):创建新对象,但内部元素仍引用原对象 - 深拷贝(
copy.deepcopy()):递归复制所有层级的对象
量化踩坑:
# 危险:portfolio_b 和 portfolio_a 共享内部列表
portfolio_a = {'holdings': [{'ticker': 'AAPL', 'weight': 0.5}]}
portfolio_b = portfolio_a.copy() # 浅拷贝
portfolio_b['holdings'][0]['weight'] = 0.3 # portfolio_a 也被修改了!回测中修改了一个策略的持仓,另一个策略的持仓也被污染——这类bug极其隐蔽。
标准答案:
性能排序(快→慢):NumPy向量化 > Pandas内置方法 > apply > 纯Python循环
# 最快:向量化
df['ret'] = df['close'].pct_change()
# 较快:内置方法
df['log_ret'] = np.log(df['close'] / df['close'].shift(1))
# 慢:apply(每行调用一次Python函数)
df['signal'] = df.apply(lambda row: my_func(row['a'], row['b']), axis=1)
# 最慢:iterrows
for idx, row in df.iterrows(): ...原则:能向量化就不用apply,能用内置方法就不自己写。处理大型tick数据时,性能差异可达100倍以上。
进阶:对无法向量化的复杂逻辑,考虑用 numba.jit 加速或用 polars 替代Pandas。
标准答案:
GIL(全局解释器锁)使得CPython中同一时刻只有一个线程执行Python字节码。
影响:CPU密集型任务(如大规模因子计算)无法通过多线程加速。
解决方案:
| 方案 | 适用场景 | 工具 |
|---|---|---|
| 多进程 | CPU密集型因子计算 | multiprocessing, joblib, concurrent.futures.ProcessPoolExecutor |
| 多线程 | IO密集型(数据下载、API请求) | threading, asyncio |
| 向量化/C扩展 | 数值计算 | NumPy, Numba, Cython |
| 分布式计算 | 超大规模回测 | Dask, Ray, Spark |
标准答案:
这个警告出现在对DataFrame切片的赋值操作中,因为切片可能返回视图(view)而非副本(copy),赋值行为不确定。
# 危险写法:链式索引
df[df['sector'] == 'tech']['weight'] = 0.5 # 可能无效
# 正确写法1:.loc
df.loc[df['sector'] == 'tech', 'weight'] = 0.5
# 正确写法2:显式copy
subset = df[df['sector'] == 'tech'].copy()
subset['weight'] = 0.5标准答案:
装饰器本质上是一个接收函数并返回新函数的高阶函数,语法糖 @decorator 等价于 func = decorator(func)。
量化中的实际应用:
import time
import functools
# 1. 计时器:监控因子计算耗时
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
elapsed = time.perf_counter() - start
print(f"{func.__name__} took {elapsed:.4f}s")
return result
return wrapper
# 2. 缓存:避免重复计算(如日频因子值)
from functools import lru_cache
@lru_cache(maxsize=1024)
def get_factor_exposure(ticker, date):
...
# 3. 重试机制:应对数据源不稳定
def retry(max_retries=3, delay=1):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for attempt in range(max_retries):
try:
return func(*args, **kwargs)
except Exception as e:
if attempt == max_retries - 1:
raise
time.sleep(delay * (attempt + 1))
return wrapper
return decorator标准答案:
生成器是使用 yield 关键字的函数,它惰性地产生值,不会一次性将所有结果加载到内存。
量化应用:处理大规模tick数据时避免内存溢出。
def read_ticks(filepath):
"""逐行读取数亿行tick数据,内存占用恒定"""
with open(filepath) as f:
header = f.readline().strip().split(',')
for line in f:
values = line.strip().split(',')
yield dict(zip(header, values))
# 流式处理,内存友好
for tick in read_ticks('huge_tick_data.csv'):
process(tick)也常用于滚动窗口计算、事件驱动回测引擎的信号生成等。
标准答案:
| 特性 | 指针 | 引用 |
|---|---|---|
| 可否为空 | 可以为nullptr | 不可以,必须绑定对象 |
| 可否重新绑定 | 可以指向其他对象 | 不可以,绑定后不变 |
| 语法 | 需要 * 解引用 |
直接使用,语法透明 |
| 内存 | 占用空间(存地址) | 通常被编译器优化为别名 |
量化场景:高频交易系统中传递大型订单簿对象时用 const & 避免拷贝开销;智能指针(shared_ptr, unique_ptr)管理行情数据的生命周期。
标准答案:
虚函数允许通过基类指针/引用调用派生类的重写方法,实现运行时多态。底层通过虚函数表(vtable)实现。
class Strategy {
public:
virtual void on_market_data(const MarketData& md) = 0; // 纯虚函数
virtual ~Strategy() = default; // 虚析构函数(重要!)
};
class MomentumStrategy : public Strategy {
public:
void on_market_data(const MarketData& md) override {
// 动量策略的具体实现
}
};面试追问:为什么基类析构函数要声明为virtual?——如果不声明,通过基类指针delete派生类对象时只调用基类析构函数,派生类资源不会释放,造成内存泄漏。
标准答案:
C++11引入右值引用(&&)和 std::move,允许"窃取"临时对象的资源而非拷贝。
// 拷贝:O(n) —— 分配新内存,逐元素复制
std::vector<Order> orders2 = orders1;
// 移动:O(1) —— 直接接管 orders1 的内存
std::vector<Order> orders3 = std::move(orders1);
// orders1 此后处于"有效但未定义"状态高频意义:在微秒级延迟的交易系统中,一次不必要的深拷贝可能就是几微秒的延迟。移动语义在订单传递、行情数据转发等热路径上至关重要。
标准答案:
| 容器 | 底层结构 | 查找 | 插入/删除 | 量化场景 |
|---|---|---|---|---|
vector |
连续数组 | O(n) | 尾部O(1) | 时间序列、K线存储 |
deque |
分段连续 | O(n) | 头尾O(1) | 滑动窗口 |
map/set |
红黑树 | O(log n) | O(log n) | 有序订单簿 |
unordered_map/set |
哈希表 | O(1)均摊 | O(1)均摊 | ticker→策略映射 |
priority_queue |
堆 | 取极值O(1) | 插入O(log n) | 事件驱动引擎的事件队列 |
高频考虑:vector 因内存连续、缓存友好,在遍历性能上远优于链表。高频系统中优先使用 vector + 排序,而非 map。
标准答案:
模板允许在编译期生成特化代码,实现零开销抽象。
// 编译期计算阶乘
template<int N>
struct Factorial {
static constexpr int value = N * Factorial<N-1>::value;
};
template<>
struct Factorial<0> {
static constexpr int value = 1;
};量化应用:
- 表达式模板(Expression Templates):避免临时对象,实现高效矩阵运算(Eigen库的核心技术)
- 策略模式的编译期实现:用模板参数选择不同的执行逻辑,避免虚函数的间接调用开销
- CRTP(Curiously Recurring Template Pattern):静态多态,高频系统中替代虚函数
标准答案:
广播允许不同形状的数组进行运算。规则:
- 从最后一个维度开始对齐
- 每个维度要么相同,要么其中一个为1
- 维度为1的那个轴会被"广播"(逻辑复制)
# 对每只股票的收益率减去其均值(截面去均值)
returns = np.random.randn(252, 500) # (252天, 500只股票)
mean_ret = returns.mean(axis=0) # (500,)
demeaned = returns - mean_ret # 广播:(252, 500) - (500,) → (252, 500)理解广播是写出高效NumPy代码的关键,避免不必要的循环和内存分配。
标准答案:
# 方法1:stride_tricks(零拷贝,最高效)
from numpy.lib.stride_tricks import sliding_window_view
windows = sliding_window_view(prices, window_shape=20) # (n-19, 20)
rolling_mean = windows.mean(axis=1)
# 方法2:cumsum技巧(O(n),适合求和/均值)
cumsum = np.cumsum(np.insert(prices, 0, 0))
rolling_sum = cumsum[20:] - cumsum[:-20]
rolling_mean = rolling_sum / 20
# 方法3:Pandas(最方便,但慢于纯NumPy)
pd.Series(prices).rolling(20).mean()在大规模因子计算中,方法1和2比Pandas快3-10倍。
标准答案:
因子:能够系统性解释资产收益率截面差异的变量。
Alpha vs Beta:
- Beta(系统性风险暴露):承担市场、规模、价值等公共因子风险获得的补偿,人人可以获取
- Alpha(超额收益):在控制所有已知因子暴露后剩余的收益,来自信息优势或更优的执行
如果
核心洞察:今天的Alpha可能是明天的Beta——当一个信号被足够多的人知晓和使用后,它就变成了一个定价因子。
标准答案:
三因子模型(1993):
- MKT(市场因子):市场组合超额收益
- SMB(Small Minus Big):小盘股超额收益
- HML(High Minus Low):高B/M(价值股)超额收益
五因子模型(2015)新增:
- RMW(Robust Minus Weak):高盈利vs低盈利
- CMA(Conservative Minus Aggressive):低投资vs高投资
核心贡献:建立了因子投资的分析框架。任何策略的收益都应该用这些因子回归分解——如果Alpha不显著,说明你只是在承担已知风险。
争议:HML在五因子模型中可能是冗余的(被RMW和CMA吸收);动量因子(UMD)未被包含但实证上很强。
标准答案:
| 因子类别 | 代表因子 | 构建逻辑 |
|---|---|---|
| 动量 | 12-1月动量 | 过去12个月累计收益(跳过最近1个月) |
| 反转 | 短期反转 | 过去1个月/1周收益取反 |
| 波动率 | 特质波动率 | 回归残差的标准差(IVOL) |
| 流动性 | Amihud非流动性 |
|
| 换手率 | 平均换手率 | 日均成交量 / 流通股本 |
| 量价背离 | 价升量缩 | 价格与成交量趋势方向不一致的程度 |
构建流程:
- 原始值计算 → 2. 截面标准化(z-score或排序) → 3. 异常值处理(MAD/Winsorize) → 4. 行业/市值中性化 → 5. 缺失值填充
标准答案:
-
IC:因子值与下期收益率的截面Rank相关系数(Spearman)。衡量因子单期选股能力。
- IC > 0.03 就算不错了
- 更稳健的变体:RankIC、quantile-spread
-
ICIR:$ICIR = \frac{\overline{IC}}{\sigma_{IC}}$,即IC均值除以IC标准差。衡量因子的稳定性。
- ICIR > 0.5 通常认为是优秀因子
-
IR(策略层面):$IR = \frac{\text{年化超额收益}}{\text{年化跟踪误差}}$。衡量策略承担主动风险的效率。
基本定律(Fundamental Law of Active Management):
其中
标准答案:
当多个因子高度相关时(如EP和BP都是价值因子),回归系数不稳定,单因子测试有效但组合后失效。
处理方法:
- 正交化:对因子做Gram-Schmidt正交化或回归取残差
- PCA降维:提取主成分作为合成因子
- 因子分组:同类因子等权合成为一个复合因子
- 弹性网络(Elastic Net):L1+L2正则化自动处理共线性
- VIF检验:方差膨胀因子 > 10 视为严重共线性
标准答案:
因子拥挤:过多资金追逐同一个因子策略,导致因子估值过高、预期收益下降、崩盘风险上升。
检测信号:
- 因子多空组合的估值价差达到历史极端
- 短边借股成本飙升(做空拥挤)
- 同类策略的相关性上升
- 因子回撤加深且恢复变慢
历史案例:2007年8月量化危机——大量统计套利基金同时去杠杆,价值和动量因子在几天内回撤超过20%。
应对:
- 监控因子估值水平和拥挤度指标
- 分散因子来源(基本面+量价+另类数据)
- 动态调整因子暴露
- 保持流动性缓冲
标准答案:
原理(Markowitz, 1952):
求解得到有效前沿上的最优组合。
实践中的问题:
- 对输入极度敏感:期望收益率微小变化会导致权重剧烈变动("误差最大化器")
- 估计风险:期望收益率极难准确估计,协方差矩阵含噪
- 集中持仓:最优解常常极度集中在少数资产上
- 忽略交易成本:理论最优组合频繁调仓不现实
改进方法:
- Black-Litterman模型(融入主观观点)
- 加入正则化约束(如持仓上下限、换手约束)
- 风险平价(Risk Parity):$w_i \propto 1/\sigma_i$
- 最小方差组合(不需要估计期望收益率)
- 收缩估计(Ledoit-Wolf)改进协方差矩阵输入
标准答案:
风险平价:使每个资产对组合总风险的贡献相等。
资产i的风险贡献:$RC_i = w_i \cdot (\Sigma w)_i$
风险平价要求:$RC_1 = RC_2 = \cdots = RC_N = \frac{w^T \Sigma w}{N}$
vs 等权:等权是
典型应用:Bridgewater的All Weather策略。股债配比中,股票波动率远高于债券,等权配比下股票贡献90%+的风险;风险平价下需要大量增配债券(通常加杠杆),使风险贡献均衡。
标准答案:
| 偏差 | 描述 | 危害 |
|---|---|---|
| 前视偏差(Look-ahead Bias) | 使用了回测时刻不可得的未来信息 | 收益虚高,致命 |
| 幸存者偏差(Survivorship Bias) | 只用了存续至今的股票/基金数据 | 高估历史收益 |
| 过拟合偏差 | 参数过度拟合历史数据 | 样本外表现崩塌 |
| 交易成本忽略 | 不考虑滑点、手续费、冲击成本 | 盈利被吃掉 |
| 时间段选择偏差 | 选择有利的回测区间 | 不具代表性 |
如何减轻:
- 严格使用 point-in-time 数据库
- 在回测框架中内置时间戳检查
- 分样本内/样本外/前向验证
- 纸交易(Paper Trading)验证
标准答案:
| 指标 | 公式/含义 | 局限 |
|---|---|---|
| 年化收益率 | 不反映风险 | |
| 夏普比率(Sharpe) | 假设正态分布,忽略尾部风险 | |
| 索提诺比率(Sortino) | 用下行偏差替代标准差 | 更关注下行风险,但对下行的定义依赖阈值 |
| 最大回撤(Max DD) | 峰值到谷底的最大跌幅 | 只描述单次最坏情况 |
| Calmar比率 | 年化收益 / 最大回撤 | 对单一极端事件敏感 |
| 信息比率(IR) | 超额收益 / 跟踪误差 | 依赖于基准选择 |
进阶指标:
- t统计量:$t = \frac{SR \times \sqrt{T}}{\text{correction}}$,检验夏普比率是否显著异于零
-
Bailey-López de Prado建议:至少需要
$t > 3$ 才可信(考虑多重检验后)
标准答案:
过拟合:模型/策略在历史数据上表现优异,但在新数据上表现大幅衰减。本质上是拟合了噪声而非信号。
判断信号:
- 样本内夏普比率远高于样本外
- 策略逻辑过于复杂(大量参数、特殊规则)
- 对参数微调极度敏感
避免方法:
- 数据层面:训练集/验证集/测试集严格分离;使用 Walk-Forward 验证
- 模型层面:限制参数数量;用简单模型作为基线
- 统计层面:对多重测试做校正(Deflated Sharpe Ratio)
- 经济学层面:策略逻辑必须有合理的经济学解释
- 稳健性检验:更换时间窗口、市场、参数范围看策略是否稳定
Marcos López de Prado 的名言:"回测不是研究工具,而是验证工具。"
标准答案:
交易成本构成:
- 显性成本:佣金、印花税、交易所费用
- 隐性成本:买卖价差(bid-ask spread)、市场冲击(market impact)、时机成本
市场冲击模型:
Almgren-Chriss模型(经典):
其中
平方根模型(业界常用简化版):
重要性:高换手策略(如短期反转)的收益可能被冲击成本完全吃掉。策略开发时必须将冲击成本纳入回测。
标准答案:
- 偏差(Bias):模型假设过于简单导致的系统性误差。欠拟合。
- 方差(Variance):模型对训练数据过度敏感导致的波动。过拟合。
在量化中的含义:
- 高偏差模型(如简单线性回归)可能错过非线性alpha
- 高方差模型(如深度神经网络)可能拟合市场噪声
- 金融数据信噪比极低(信号微弱、噪声巨大),通常偏向低方差模型更安全
- 原则:宁可欠拟合也不要过拟合——错过一个机会的代价远小于错误地相信一个不存在的机会
标准答案:
| 正则化 | 惩罚项 | 效果 | 量化场景 |
|---|---|---|---|
| L1(Lasso) | 产生稀疏解,自动选择因子 | 从大量候选因子中筛选有效因子 | |
| L2(Ridge) | 缩小权重但不为零 | 因子共线性处理,稳定回归 | |
| Elastic Net | 兼具稀疏和稳定 | 高维因子选择的默认选择 |
直觉:L1像用刀切(有的因子直接砍到0),L2像用手压(所有因子都缩小但保留)。
量化中的额外考虑:正则化强度
标准答案:
问题:普通K-Fold随机划分,破坏了时间序列的时序结构,导致未来信息泄漏到训练集。
正确方法:
Time →
|---Train---|---Gap---|--Test--| 第1轮
|------Train-------|---Gap---|--Test--| 第2轮
|---------Train-----------|---Gap---|--Test--| 第3轮
- Walk-Forward(前向验证):固定或扩展窗口训练,向前滚动测试
- Embargo Gap:训练集和测试集之间留缓冲期,防止特征计算中的信息泄漏
- Purged K-Fold(López de Prado提出):在K-Fold基础上,清除训练集中与测试集标签在时间上重叠的样本
Embargo的计算:如果特征使用了过去20天的数据来预测未来5天的收益,Embargo至少应设为5天(标签的前瞻窗口)。
标准答案:
核心优势:
- 天然处理非线性和交互:树模型自动捕捉因子间的非线性关系和交互效应
- 对异常值鲁棒:基于排序分裂,不受因子分布影响
- 特征重要性:内置特征选择,直接看哪些因子有用
- 缺失值处理:原生支持缺失值
- 训练效率高:GPU加速,大规模因子矩阵可快速训练
量化中的关键调参:
max_depth:3-7即可,太深容易过拟合learning_rate:0.01-0.1,配合较多的n_estimatorssubsample / colsample_bytree:0.5-0.8,增加随机性min_child_weight:防止拟合噪声
注意:树模型在量化中的表现上限可能不如线性模型——因为金融数据信噪比极低,复杂模型更容易拟合噪声。实际中线性模型+好因子常常比复杂模型+普通因子更稳定。
标准答案:
| 技巧 | 描述 | 原因 |
|---|---|---|
| 截面排序/z-score | 每个截面时间点标准化 | 消除时间趋势,保留截面排序信息 |
| 滞后特征 | feature_lag1, feature_lag5 |
捕捉因子动量或反转 |
| 滚动统计量 | 均值、标准差、偏度、峰度 | 捕捉分布特征的时变性 |
| 交互特征 | 因子A × 因子B | 捕捉条件效应(如"价值+动量"联合信号) |
| 分位数编码 | 连续值→分位数桶 | 减少异常值影响,对树模型可提升稳定性 |
| 目标编码的陷阱 | 不可对测试集做全局编码 | 信息泄漏的常见来源 |
最重要的原则:每个特征必须在预测时刻(point-in-time)确实可以获得。回测中使用了未来信息的特征工程是最隐蔽的前视偏差。
标准答案:
| 模型 | 优势 | 劣势 | 量化适用 |
|---|---|---|---|
| RNN | 简单、参数少 | 梯度消失、长程依赖弱 | 基本淘汰 |
| LSTM | 门控机制解决长程依赖 | 串行计算慢,超参敏感 | 中频时序预测 |
| GRU | 比LSTM简化、参数更少 | 能力略弱于LSTM | LSTM的轻量替代 |
| Transformer | 并行计算、全局注意力 | 对位置敏感,数据需求大 | 多因子截面学习,注意力权重可解释 |
| Temporal Fusion Transformer | 专为时序设计,内置变量选择 | 复杂度高 | 多变量时序+可解释性需求 |
实践建议:不要迷信模型复杂度。在低信噪比的金融数据中,简单LSTM配合好的特征工程和正则化,常常优于Transformer。
标准答案:
AutoEncoder(AE):
量化应用:
- 因子降维:从上百个原始因子中提取非线性压缩表示
- 异常检测:重建误差大的样本可能是异常行情
- 缺失值填充:用训练好的AE重建缺失的因子值
VAE(变分自编码器):
在AE基础上引入概率,latent space是参数化的高斯分布:$q(z|x) \sim N(\mu, \sigma^2)$
额外能力:
- 生成合成金融数据(数据增强)
- 对市场状态的不确定性建模
- 更平滑的latent space有利于下游任务
标准答案:
金融数据生成:
- 生成合成的价格路径/收益率序列,用于扩充训练集
- 生成极端行情场景(压力测试)
- 保护隐私的数据共享
常用变体:
- TimeGAN:专门针对时间序列数据,保留时序依赖性
- WGAN-GP:训练更稳定,避免模式崩塌
核心挑战:
- 评估生成质量困难——FID等图像指标不直接适用
- 必须验证生成数据的统计特性(自相关、波动率聚集、厚尾、杠杆效应)
- 用生成数据训练的模型,样本外表现仍需在真实数据上验证
标准答案:
金融市场天然是图结构:股票之间通过产业链、股东关系、资金流、相关性等形成网络。
应用场景:
- 关联股预测:上下游公司的信息传导(供应链图谱)
- 行业传导:行业龙头的涨跌对同行业/产业链的影响建模
- 风险传染:金融机构间的系统性风险传导
- 知识图谱因子:从企业关系图中提取因子(如"供应商动量"因子)
常用模型:GCN、GAT(Graph Attention Network)、GraphSAGE
关键难点:图结构本身是动态变化的(公司关系、股东结构会变),需要时序图网络(Temporal GNN)或定期更新图结构。
标准答案:
应用场景:
- 最优执行:将大单拆分为小单逐步执行,最小化冲击成本(Almgren-Chriss的RL版本)
- 动态组合管理:根据市场状态动态调整持仓,考虑交易成本
- 做市策略:动态调整报价价差和挂单量
常用算法:
- PPO / A2C / SAC(连续动作空间,适合权重/价格决策)
- DQN(离散动作空间,适合买/卖/持有决策)
核心挑战:
- 数据不足:金融数据的有效样本远少于游戏/机器人场景
- 非平稳环境:市场结构持续变化,训练好的agent可能快速失效
- 奖励设计困难:简单用PnL做reward会导致高方差;需要设计风险调整后的reward
- 模拟器偏差:回测模拟器无法完美还原真实市场的冲击和流动性
- 可解释性差:策略决策过程不透明,难以获得风控信任
实践建议:RL在执行优化(Optimal Execution)中最为成熟,在alpha策略中仍处于研究阶段。
标准答案:
场景:预测涨跌时,实际中大量微小变动(噪声),真正大涨大跌是少数。
处理方法:
- 标签重定义:不用涨跌,用超额收益分位数(Top 20% vs Bottom 20%,中间丢弃)
- 重采样:过采样少数类(SMOTE)或欠采样多数类
- 损失函数加权:
class_weight='balanced'或 Focal Loss - 评估指标:不用Accuracy,用AUC、Precision-Recall、IC等
量化特有考虑:金融中"不平衡"不一定是问题——中间区域的样本可能确实不包含有效信号,强行学习反而引入噪声。Triple-barrier方法(López de Prado)通过止盈、止损、最长持有期三个条件定义标签,是更好的方案。
标准答案:
常见泄漏来源:
-
特征泄漏:
- 使用了包含未来信息的因子(如未来才发布的财报数据)
- 用全局统计量做标准化(应该用历史窗口内的统计量)
-
标签泄漏:
- 收益率标签与特征时间窗口重叠
- 例:用t-20到t天的均值预测t到t+5的收益,但t-20到t已包含了部分t+5的信息
-
验证泄漏:
- 用未来数据调参(如用整个时期做网格搜索选最优参数)
- K-Fold未保持时序
-
数据处理泄漏:
- 先做全局PCA再划分训练/测试集
- 缺失值用全局均值填充
防御清单:
- 所有数据处理管道必须在训练集上fit,在测试集上transform
- 建立 point-in-time 数据库,每条数据标注其可用时间
- 用
sklearn.pipeline.Pipeline封装所有预处理步骤
标准答案:
传统多因子模型对所有因子等权或固定权重组合,Attention机制允许模型动态地、针对不同股票和不同时期为因子分配不同权重。
具体做法:
输入:N只股票 × K个因子 × T个时间步
↓
时间维度 Attention:关注哪些历史时刻更重要
↓
因子维度 Attention:关注哪些因子在当前市场环境下更有效
↓
输出:每只股票的预测收益率 / 排序分数
优势:
- 自动实现"因子择时"——在不同市场状态下侧重不同因子
- Attention权重提供可解释性——可以看到模型关注了哪些因子
- Cross-Attention可以捕捉股票之间的关联信息
挑战:模型容易过拟合,需要较强的正则化和较大的样本量。
标准答案:
| 方法 | 原理 | 量化应用 |
|---|---|---|
| Bagging | 多个模型在不同子样本上训练,平均预测 | 随机森林做因子打分 |
| Boosting | 串行训练,每个模型修正前一个的残差 | XGBoost/LightGBM因子选股 |
| Stacking | 用元模型组合基模型的预测 | 第一层多个异质模型,第二层线性组合 |
| Blending | 简单加权平均多个模型的输出 | 多策略信号等权/风险平价组合 |
量化中的特殊集成技巧:
- 时间集成:对不同时间窗口训练的模型取平均,增强稳定性
- 因子集成:同一个Alpha逻辑,用多个模型(线性、树、NN)分别实现,取中位数信号
- 交叉验证集成:K个Fold的模型全部保留,对新数据取K个预测的均值
核心洞察:集成学习的价值不在于提高精度,而在于降低方差——在低信噪比的金融数据中,降低方差比提高精度更重要。
标准答案:
已落地的应用:
- 新闻/公告情感分析:用LLM解析财报电话会议、新闻、社交媒体的情绪
- 事件提取:从非结构化文本中提取并购、高管变动、产品发布等事件
- 研报摘要与因子化:将卖方研报的观点量化为多空信号
- 代码辅助:加速策略开发、回测代码编写
前沿探索:
- LLM作为Alpha信号:直接让LLM根据新闻判断涨跌方向
- 多模态理解:结合文本、表格、图像(如K线图)的分析
- 策略推理:让LLM解释因子失效原因或生成交易假设
关键限制:
- 推理成本高,实时交易中延迟大
- 幻觉问题——LLM可能自信地给出错误的金融分析
- 训练数据截止日期导致的信息滞后
- 不适合需要精确数值计算的场景
最后的话:量化是一个需要持续学习的领域。市场在变,技术在进化,Alpha在衰减。八股文是入门的钥匙,但真正的护城河来自于对市场的深刻理解、严谨的研究方法论、以及不断迭代的能力。祝每位量化人都能找到属于自己的Alpha。