Home/Quant Research/Factor Models & Asset Pricing
Back
🏛️

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.

CAPMFama-FrenchFactor ModelsAlphaBarraFama-MacBeth

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

01CAPM: E[Ri]=Rf+βi(E[Rm]Rf)E[R_i] = R_f + \beta_i (E[R_m] - R_f)
02Jensen's alpha: αi=RˉiRfβ^i(RˉmRf)\alpha_i = \bar{R}_i - R_f - \hat{\beta}_i(\bar{R}_m - R_f)
03FF3: RiRf=α+βMKTMKT+βSMBSMB+βHMLHML+εR_i - R_f = \alpha + \beta_{MKT}\cdot MKT + \beta_{SMB}\cdot SMB + \beta_{HML}\cdot HML + \varepsilon
04Information Ratio: IR=α/TE=α/σ(RpRb)IR = \alpha / TE = \alpha / \sigma(R_p - R_b)
05Fundamental Law: IR=IC×BRIR = IC \times \sqrt{BR} (with perfect transfer coefficient)
06Fama-MacBeth t-stat: t=γˉ1/(σγ1/T)t = \bar{\gamma}_1 / (\sigma_{\gamma_1} / \sqrt{T})
python
1import numpy as np
2import pandas as pd
3from scipy import stats
4
5np.random.seed(42)
6T = 120 # 10 years monthly
7N = 50 # stocks
8
9# --- Simulate Fama-French factors ---
10mkt = np.random.randn(T) * 0.04 + 0.005 # market excess return
11smb = np.random.randn(T) * 0.025 # size factor
12hml = np.random.randn(T) * 0.025 # value factor
13
14# --- Simulate stock returns with known factor loadings ---
15beta_mkt = np.random.uniform(0.6, 1.4, N)
16beta_smb = np.random.uniform(-0.5, 1.0, N)
17beta_hml = np.random.uniform(-0.3, 0.8, N)
18true_alpha = np.random.randn(N) * 0.001 # small true alphas
19
20returns = (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
26rf = 0.0002 # monthly risk-free rate
27excess_ret = returns - rf
28
29# --- Time-series FF3 regression for each stock ---
30X = np.column_stack([np.ones(T), mkt, smb, hml])
31betas_hat = np.linalg.lstsq(X, excess_ret, rcond=None)[0] # (4, N)
32alphas_hat = betas_hat[0] # intercepts = Jensen's alpha
33
34# t-stats for alpha
35residuals = excess_ret - X @ betas_hat
36sigma_e = residuals.std(axis=0)
37XtXinv = np.linalg.inv(X.T @ X)
38se_alpha = sigma_e * np.sqrt(XtXinv[0, 0])
39t_alpha = alphas_hat / se_alpha
40
41sig_count = (np.abs(t_alpha) > 2.0).sum()
42print(f"Stocks with |t_alpha| > 2: {sig_count}/{N}")
43print(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
47gammas = np.zeros(T - 1)
48for 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
56fm_t = gammas.mean() / (gammas.std() / np.sqrt(T - 1))
57print(f"\nFama-MacBeth HML premium: {gammas.mean()*12:.4f} ann.")
58print(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 problems

Problem

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

1

α = 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.

2

β_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.

3

β_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?

4

β_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.

5

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.

Only works in the Electron app

<webview> is an Electron-only tag. Run npm run electron:dev to use this.

25:00Focus
0

25 min focus · 5 min break · long break every 4 sessions

The Ultimate Grind