Caloogy Article
中文

What is a Factor: From CAPM to Fama–French

Date
Apr 15, 2026
Series
Quant
Reading
5 min
Topics
QuantFactorCapmFama french

The one-sentence version

The returns of a stock (or a portfolio) can be decomposed into two parts: one part comes from its exposure to several common drivers (market movement, small-cap vs. large-cap, cheap vs. expensive stocks...), and the other part is unique to it. These common drivers are called factors, and the sensitivity to each factor is called factor exposure (beta). Once decomposed, the remaining average excess return that cannot be explained by the factors is called alpha. From the CAPM of the 1960s, which had only a single "market factor," to the Fama–French three-factor and five-factor models of the 1990s, and then to momentum, quality, low volatility, and more, factor models are the common language of modern quantitative investing.

Disclaimer

This article is for technical educational purposes only and does not constitute any investment advice. The code in this article uses simulated data.


Layer 1: The Intuition

1.1 Where does the taste of a soup come from?

Is a soup very salty because of the salt and soy sauce added, or because of the chef's special skill? If you know how much salt and soy sauce were put into the soup, you can estimate how much the "skill" contributed.

A fund earns 20%:

A factor model is a tool to decompose returns into "ingredients" and "skill."

1.2 Why this matters

Use Case Description
Performance Attribution Determining whether a fund manager has real skill or has simply bet on the right style
Risk Management Knowing which factors a portfolio is exposed to helps you understand how it will be affected when the market changes
Strategy Construction Deliberately exposing oneself to factors that have long-term premiums ("Smart Beta")
Pricing Explaining why the expected returns of different assets differ

Layer 2: Evolution of Factor Models

2.1 CAPM: Only one factor

The Capital Asset Pricing Model (Sharpe, Lintner, etc., 1960s) posits that:

E[Ri]−Rf=βi(E[Rm]−Rf),E[R_i] - R_f = \beta_i \big(E[R_m] - R_f\big),

The excess return of an asset depends only on its exposure βi\beta_i to the market. High beta stocks have higher risk, and thus higher expected returns.

The problem: In empirical studies, many phenomena cannot be explained by CAPM. For example, small-cap stocks and low price-to-book ("cheap") stocks have long-term average returns that are higher than what CAPM predicts.

2.2 Fama–French Three-Factor Model (1993)

Ri−Rf=αi+βi MKT+si SMB+hi HML+εiR_i - R_f = \alpha_i + \beta_i\,\text{MKT} + s_i\,\text{SMB} + h_i\,\text{HML} + \varepsilon_i

Factor Full Name Construction
MKT Market Excess Return Market Portfolio Return − Risk-free Rate
SMB Small Minus Big Small-cap Portfolio − Large-cap Portfolio
HML High Minus Low High Book-to-Market (Value) Portfolio − Low Book-to-Market (Growth) Portfolio

2.3 More factors

Year Model / Factor Addition
1993 Jegadeesh–Titman Momentum: Stocks that have risen a lot over the past 3–12 months continue to outperform for a period of time
1997 Carhart Four-Factor Three factors + Momentum
2015 Fama–French Five-Factor Added Profitability (RMW) and Investment (CMA)
Others Quality, Low Volatility, Dividend, Short-term Reversal... Academia and industry have successively proposed hundreds of "factors" (see The Multiple Testing and the Factor Zoo)

2.4 Where does the factor premium come from?

This is one of the most debated issues in academia:

Explanation Viewpoint Meaning
Risk Compensation Small-cap and value stocks drop more severely during economic downturns; they bear extra risk and thus demand higher returns The premium will persist long-term
Behavioral Bias Investors are overly optimistic about growth stocks or overreact to bad news, leading to mispricing The premium may diminish once widely recognized
Data Mining Some "factors" are only effective in historical data by chance They will disappear out-of-sample (see The Seven Sins of Backtesting)

For example, the value factor performed poorly for a long time around 2010, triggering intense discussions on whether "the value factor is dead."


Layer 3: Perform a Factor Regression

3.1 Performing a factor regression with simulated data

We will first "create" a portfolio: we know its true exposures are Market 1.1, Size 0.5, and Value −0.3, with a monthly alpha of 0.1%, plus random noise. Then, we will use regression to see if we can recover these numbers.

import numpy as np, pandas as pd, statsmodels.api as sm
rng = np.random.default_rng(42)
n = 120  # 10 years of monthly data
f = pd.DataFrame({
    "MKT": rng.normal(0.006, 0.045, n),
    "SMB": rng.normal(0.002, 0.030, n),
    "HML": rng.normal(0.003, 0.030, n),
})
true_alpha, true_beta = 0.001, {"MKT": 1.1, "SMB": 0.5, "HML": -0.3}
excess = true_alpha + sum(true_beta[k] * f[k] for k in f) + rng.normal(0, 0.02, n)

X = sm.add_constant(f)
res = sm.OLS(excess, X).fit()
print(res.params.round(3).to_dict())
print(res.tvalues.round(2).to_dict())
print("R2", round(res.rsquared, 3))

Output:

{'const': 0.002, 'MKT': 0.999, 'SMB': 0.459, 'HML': -0.375}
{'const': 0.8, 'MKT': 18.5, 'SMB': 7.39, 'HML': -6.1}
R2 0.803

3.2 How to read these results

Result Interpretation
MKT ≈ 1.0, t = 18.5 The portfolio's exposure to the market is accurately estimated (true value 1.1, with estimation error)
SMB ≈ 0.46, HML ≈ −0.38 The portfolio is biased toward small-cap and growth, consistent with the true settings
R² = 0.80 80% of the return volatility can be explained by the three factors
alpha = 0.2%/month, but t is only 0.8 The true alpha is 0.1%/month, but given 10 years of data and this noise level, it is statistically indistinguishable from 0

The last line is the most important lesson: alpha is hard to prove. Factor exposures (beta) are usually estimated accurately because the factors themselves have high volatility; whereas alpha is a very small constant buried in a large amount of noise. Roughly speaking, the t-value of alpha grows with the square root of the sample length; a true but tiny alpha might require decades of data to confirm.

3.3 Engineering details for practical use

res_robust = sm.OLS(excess, X).fit(cov_type="HAC", cov_kwds={"maxlags": 3})

Summary

Layer Key points
Concept Returns = Factor Exposure × Factor Returns + alpha + Noise
Evolution CAPM (Market) → Three-Factor (Size, Value) → Momentum → Five-Factor → Factor Zoo
Debate Does the premium come from risk compensation, behavioral bias, or data mining
Practice Beta is easy to estimate, alpha is hard to prove; use robust standard errors; pay attention to factor construction details