Quant Research Guide
Factor Models & Asset Pricing
Factor models are the backbone of systematic investing. Every quant research conversation references alpha, beta, IC, and IR. You must be able to run time-series and cross-sectional regressions, interpret every coefficient, and explain what makes a factor 'work' both statistically and economically.
Core Theory
- 1CAPM: E[Rᵢ] = Rƒ + βᵢ(E[Rₘ] - Rƒ). Beta measures systematic (market) risk; alpha (Jensen's alpha) is the intercept in a time-series regression of excess returns on market excess returns. Alpha should be zero under CAPM — non-zero alpha is the object of quant research.
- 2Fama-French 3-Factor Model: Rᵢ - Rƒ = αᵢ + βᵢ·MKT + sᵢ·SMB + hᵢ·HML + εᵢ. SMB (Small Minus Big) captures the size premium. HML (High Minus Low book-to-price) captures the value premium. The FF3 model explains ~90% of cross-sectional return variance vs ~70% for CAPM.
- 3FF5 adds RMW (Robust Minus Weak profitability) and CMA (Conservative Minus Aggressive investment). These were added to address the profitability and investment anomalies that FF3 fails to explain. Novy-Marx (2013) showed gross profitability is the most powerful value-adjacent factor.
- 4Barra-style risk model: total portfolio variance = factor variance + specific variance. Factor exposures (X matrix) multiply factor returns (f) plus residuals: r = Xf + ε. The factor covariance matrix Fₙₓₙ is estimated from returns; the specific risk diagonal matrix D is estimated from residual variance. This decomposition enables factor risk attribution.
- 5Fama-MacBeth (1973) two-step procedure: (1) cross-sectional regression each period t: rᵢ,ₜ = γ₀,ₜ + γ₁,ₜ·xᵢ,ₜ₋₁ + εᵢ,ₜ; (2) time-series average of γ₁ across T periods with t-stat = mean(γ₁)/std(γ₁)×√T. This corrects for cross-sectional correlation in residuals that OLS on the pooled panel ignores.
- 6Information Ratio: IR = α / TE where α is active return and TE is tracking error (std of active return). IR measures the consistency of alpha generation. IR > 0.5 is good; IR > 1.0 is exceptional. Typical quant equity strategies achieve IR of 0.3-0.8.
- 7Fundamental Law of Active Management (Grinold 1989): IR = IC × √BR × TC. IC = Information Coefficient (signal quality), BR = breadth (number of independent bets per year), TC = transfer coefficient (fraction of insights actually implemented, 0-1). More bets with the same IC improves IR proportionally to √BR.
- 8Factor zoo problem: as of 2023, over 400 factors have been published as significant predictors of returns (Cochrane's 'zoo'). Most are likely false discoveries from data mining. Harvey, Liu & Zhu (2016) argue a new factor needs t > 3 to be credible. Hou, Xue & Zhang (2020) failed to replicate 65% of published anomalies.
Key Formulas
| 1 | import numpy as np |
| 2 | import pandas as pd |
| 3 | from scipy import stats |
| 4 | |
| 5 | np.random.seed(42) |
| 6 | T = 120 # 10 years monthly |
| 7 | N = 50 # stocks |
| 8 | |
| 9 | # --- Simulate Fama-French factors --- |
| 10 | mkt = np.random.randn(T) * 0.04 + 0.005 # market excess return |
| 11 | smb = np.random.randn(T) * 0.025 # size factor |
| 12 | hml = np.random.randn(T) * 0.025 # value factor |
| 13 | |
| 14 | # --- Simulate stock returns with known factor loadings --- |
| 15 | beta_mkt = np.random.uniform(0.6, 1.4, N) |
| 16 | beta_smb = np.random.uniform(-0.5, 1.0, N) |
| 17 | beta_hml = np.random.uniform(-0.3, 0.8, N) |
| 18 | true_alpha = np.random.randn(N) * 0.001 # small true alphas |
| 19 | |
| 20 | returns = (true_alpha[None, :] + |
| 21 | np.outer(mkt, beta_mkt) + |
| 22 | np.outer(smb, beta_smb) + |
| 23 | np.outer(hml, beta_hml) + |
| 24 | np.random.randn(T, N) * 0.05) |
| 25 | |
| 26 | rf = 0.0002 # monthly risk-free rate |
| 27 | excess_ret = returns - rf |
| 28 | |
| 29 | # --- Time-series FF3 regression for each stock --- |
| 30 | X = np.column_stack([np.ones(T), mkt, smb, hml]) |
| 31 | betas_hat = np.linalg.lstsq(X, excess_ret, rcond=None)[0] # (4, N) |
| 32 | alphas_hat = betas_hat[0] # intercepts = Jensen's alpha |
| 33 | |
| 34 | # t-stats for alpha |
| 35 | residuals = excess_ret - X @ betas_hat |
| 36 | sigma_e = residuals.std(axis=0) |
| 37 | XtXinv = np.linalg.inv(X.T @ X) |
| 38 | se_alpha = sigma_e * np.sqrt(XtXinv[0, 0]) |
| 39 | t_alpha = alphas_hat / se_alpha |
| 40 | |
| 41 | sig_count = (np.abs(t_alpha) > 2.0).sum() |
| 42 | print(f"Stocks with |t_alpha| > 2: {sig_count}/{N}") |
| 43 | print(f"Annualized alpha: mean={alphas_hat.mean()*12:.4f}, max={alphas_hat.max()*12:.4f}") |
| 44 | |
| 45 | # --- Fama-MacBeth cross-sectional regression --- |
| 46 | # Use lagged HML beta as predictor of next-month return |
| 47 | gammas = np.zeros(T - 1) |
| 48 | for t in range(T - 1): |
| 49 | # Cross-section: regress realized return on prior-period HML beta |
| 50 | x_t = betas_hat[3] # HML loadings (estimated once, simplification) |
| 51 | y_t = excess_ret[t + 1] # next-month excess returns |
| 52 | slope, intercept, r, p, se = stats.linregress(x_t, y_t) |
| 53 | gammas[t] = slope |
| 54 | |
| 55 | # Fama-MacBeth t-stat |
| 56 | fm_t = gammas.mean() / (gammas.std() / np.sqrt(T - 1)) |
| 57 | print(f"\nFama-MacBeth HML premium: {gammas.mean()*12:.4f} ann.") |
| 58 | print(f"FM t-statistic: {fm_t:.2f} ({'Significant' if abs(fm_t) > 2 else 'Not significant'})") |
Implements the two workhorses of factor research: (1) time-series FF3 regression for each stock to estimate Jensen's alpha and factor loadings, with t-statistics; (2) Fama-MacBeth cross-sectional regression to estimate the factor risk premium — averaging cross-sectional slope coefficients across time corrects for cross-sectional correlation.
Worked Interview Problems
3 problemsProblem
A long-short portfolio has monthly FF3 regression output: α=0.0025 (t=2.8), β_MKT=0.05 (t=1.2), β_SMB=0.42 (t=6.1), β_HML=-0.31 (t=-4.5), R²=0.38. Interpret each coefficient.
Solution
α = 0.0025 per month = 3.0% per year annualized. t = 2.8 is significant at 5% (but below quant t ≥ 3 standard). This is the portfolio's risk-adjusted excess return beyond all three factors — pure alpha.
β_MKT = 0.05: very low market exposure (near market-neutral). The portfolio's returns are barely correlated with market moves — good for a long-short strategy.
β_SMB = 0.42 (t=6.1): significant positive loading on the size factor — the portfolio is net long small-cap stocks. This must be examined: is it intentional, and is the alpha partly compensation for small-cap illiquidity risk?
β_HML = -0.31 (t=-4.5): significant negative value loading — the portfolio is net long growth stocks (low book/price). If this is intentional, the 'alpha' may partly be growth premium. If unintentional, neutralize it.
R² = 0.38: the three factors explain 38% of portfolio return variance. The remaining 62% is specific/idiosyncratic — either true alpha or unexplained factor exposure.
Answer
α=3%/yr is economically meaningful but t=2.8 is marginally below quant threshold. Key risk: positive SMB and negative HML loadings mean returns are partly factor compensation, not pure alpha. Neutralize factor exposures to isolate true alpha.
Common Mistakes
Calling the OLS intercept 'alpha' without verifying the regression is on excess returns (R - Rf). Jensen's alpha is defined on excess returns; running the regression on raw returns inflates alpha by the risk-free rate.
Interpreting a high R² in a factor regression as evidence of good performance. R² measures how much variance is explained by the factors — high R² just means high factor exposure, not good alpha. Alpha is the intercept, not R².
Running Fama-MacBeth without Newey-West correction on the time-series of gamma estimates. If factor premia are autocorrelated (they often are), the FM standard errors are still understated. Always apply NW correction to the second-step t-stat.
Confusing factor returns with factor exposures. Factor returns (the premia, e.g., HML monthly return) are time-series. Factor exposures (loadings, e.g., a stock's book-to-price ratio) are cross-sectional. Regressing returns on returns vs. returns on characteristics are different exercises.
Treating the Fundamental Law as exact. IR = IC × √BR assumes all bets are independent — in practice, stocks are correlated and IC is non-stationary. The realized IR is usually below the Fundamental Law prediction; use it as an upper bound.