08 — Portfolio Construction

Factor Models#

DecompositionStatistical1 min read
◆ The PatternDecompose returns into systematic factor exposures

CAPM uses a single factor (market beta). The Fama-French three-factor model adds size and value. Modern models include momentum, quality, and low-volatility.

ri = αi + β1F1 + β2F2 + … + εi
Factor tilts explain most of long-only active returns. Pure alpha — returns unexplained by any factor — is exceedingly rare.
// Factor decomposition — beta exposures
FactorPremium Source
Market (β)Equity risk premium
Size (SMB)Small-firm illiquidity
Value (HML)Distress / behavioral
MomentumUnder-reaction
Pattern bridge: Regression and betas are explored in ML Math — Linear Regression.
Worked example

Five years of simulated monthly returns for a fund that is 1.1 × the market plus 0.4 × a size factor, and no alpha. Regressing on both factors recovers betas of 1.08 and 0.33, an R² of 0.97 and an annual alpha of just 0.3%. Leave out the size factor and the same fund shows an alpha of 1.5% a year — skill invented by a missing factor.

Where it misleads
  • Alpha is defined relative to the factors you include; change the model and the “skill” changes.
  • Hundreds of factors have been published; many are likely false discoveries, and Harvey, Liu & Zhu (2016) argue for a t-statistic above 3 for new ones.
  • Betas drift over time; a five-year regression averages over regimes.
In code
rng = np.random.default_rng(8)
n = 60                                                     # five years of monthly returns, simulated
mkt = rng.normal(0.007, 0.045, n)
smb = rng.normal(0.002, 0.03, n)                           # small minus big
fund = 0.000 + 1.1 * mkt + 0.4 * smb + rng.normal(0, 0.01, n)   # no true alpha
X = np.column_stack([np.ones(n), mkt, smb])
coef, *_ = np.linalg.lstsq(X, fund, rcond=None)
alpha, b_mkt, b_smb = coef
resid = fund - X @ coef
r2 = 1 - resid.var() / fund.var()
capm_alpha = np.linalg.lstsq(X[:, :2], fund, rcond=None)[0][0]   # leaving out the size factor
Python, in your browser — edit the code and run it again

Assumes import numpy as np and import pandas as pd. Each snippet carries its own example numbers; the comments say which are made up or simulated.

Sources
  • W. F. Sharpe, “Capital Asset Prices: A Theory of Market Equilibrium under Conditions of Risk”, Journal of Finance 19(3), 1964
  • E. F. Fama & K. R. French, “Common Risk Factors in the Returns on Stocks and Bonds”, Journal of Financial Economics 33(1), 1993
  • C. R. Harvey, Y. Liu & H. Zhu, “… and the Cross-Section of Expected Returns”, Review of Financial Studies 29(1), 2016

Last reviewed October 2026 · How this site checks its content · Report a mistake

Linked from 1
← Previous
Risk Parity
Open in the full reader, with the topic sidebar