Skip to content

CAPM and Market Beta

CAPM says a stock's expected return is just the risk-free rate plus its beta times the market premium. It's wrong in interesting ways, and understanding those ways is foundational.

1 of 8 ~7 min

CAPM was published in 1964. It assumes one factor (the market) explains all stock returns. Reality has hundreds. CAPM is still on every quant interview because the failures reveal what factors matter.

If you remember one thing: CAPM is wrong, and the ways it’s wrong are exactly the alphas you can extract. Every consistent deviation from CAPM is a factor model waiting to be discovered. Eugene Fama won the 2013 Nobel Prize in Economic Sciences for empirical analysis of asset prices; Kenneth French co-authored the foundational multi-factor work with him but did not share the prize.

The Model

The Capital Asset Pricing Model says the expected return of asset ii is:

E[Ri]=Rf+βi⋅(E[Rm]−Rf)\mathbb{E}[R_i] = R_f + \beta_i \cdot \left(\mathbb{E}[R_m] - R_f\right)

Three pieces, then a conclusion:

  • RfR_f, the risk-free rate. Treated as known. In practice, 3-month T-bill yield.
  • E[Rm]−Rf\mathbb{E}[R_m] - R_f, the market risk premium. The extra return the market gives you for bearing market risk. Historically 4-7% annual in the US. Estimate varies enormously by sample period and method.
  • βi\beta_i, the asset’s sensitivity to the market. The slope coefficient when you regress the asset’s returns on the market’s.

The punchline: under CAPM, two stocks with the same beta have the same expected return. Period. There is no value, size, momentum, quality, or sentiment premium. Just market risk.

This is wrong. The rest of this section walks through why.

What Beta Means Mechanically

Beta is the covariance between the asset and the market, divided by the variance of the market:

βi=Cov(Ri,Rm)Var(Rm)\beta_i = \frac{\text{Cov}(R_i, R_m)}{\text{Var}(R_m)}

Interpretation:

  • β=1\beta = 1: moves with the market dollar-for-dollar. SPY is approximately 1.
  • β=1.5\beta = 1.5: moves 1.5x the market. If the market falls 10%, expect this stock to fall 15% on average.
  • β=0.5\beta = 0.5: moves at half the market. Defense.
  • β<0\beta < 0: moves opposite the market. Some assets (e.g., gold) are sometimes described as “safe havens,” but their realized equity betas are typically small (near zero to slightly positive), not reliably negative. The safe-haven channel shows up more in conditional returns during specific stress events than as a persistently negative regression slope.
  • β=0\beta = 0: uncorrelated. Doesn’t exist in reality, but fixed income and gold often have low betas.

Beta is a historical slope. It’s the average co-movement conditional on past data. It does not assume causation or any economic mechanism. It’s just a regression coefficient.

Decomposing Total Return

CAPM gives you a clean decomposition of any stock’s realized return:

Ri−Rf=αi+βi(Rm−Rf)+εiR_i - R_f = \alpha_i + \beta_i (R_m - R_f) + \varepsilon_i

Three components:

  • αi\alpha_i, the part the CAPM can’t explain. This is what you’d call “alpha” in a Jensen’s alpha sense.
  • βi(Rm−Rf)\beta_i (R_m - R_f), the part explained by market exposure. If you have a high-beta stock in an up market, this is most of your return.
  • εi\varepsilon_i, residual noise. Stock-specific surprise.

A trading strategy’s “alpha” is what it earns after removing the beta × market piece. If your strategy has β=0.3\beta = 0.3 and the market is up 20%, you got 6% of “free” return just from market exposure, which isn’t alpha at all.

Regressing AAPL on SPY in Python

The canonical CAPM exercise pulls daily returns for AAPL and SPY, runs the regression, and extracts alpha and beta.

import numpy as np
import pandas as pd
import yfinance as yf
import statsmodels.api as sm
import matplotlib.pyplot as plt

# Five years of daily data
px = yf.download(["AAPL", "SPY"], start="2020-01-01", end="2024-12-31",
                 auto_adjust=True)["Close"]
px = px.dropna()

# Daily returns
ret = px.pct_change().dropna()

# Excess returns vs 3-month T-bill proxy (close enough for the example)
# Use 0% for simplicity; illustrative, not exact
excess_aapl = ret["AAPL"] - 0.0
excess_spy  = ret["SPY"]  - 0.0

# Run the regression: AAPL ~ beta * SPY + alpha
X = sm.add_constant(excess_spy)   # add intercept
model = sm.OLS(excess_aapl, X).fit()
print(model.summary())

alpha = model.params["const"]
beta  = model.params["SPY"]

PROMPT

Use numpy, pandas, yfinance, and statsmodels to run a CAPM regression of AAPL on SPY from daily prices.

Expected output (truncated):

                 coef      std err          t      P>|t|
const        0.0006      0.0002      3.420      0.001
SPY          1.1834      0.0253     46.780      0.000

R-squared:    0.62

Reading it: AAPL has β≈1.18\beta \approx 1.18 over 2020-2024. It moves about 18% more than the market on average. The intercept (Jensen’s alpha) is 6 bps per day, which annualizes to roughly α≈15%\alpha \approx 15\%, but this is misleading because the sample period includes a massive tech rally and a major tech drawdown.

R-squared of 0.62 means 62% of AAPL’s daily return variance is explained by SPY. The other 38% is stock-specific noise (earnings, product launches, management changes, etc.). For a single name, that’s about as much market-beta explanation as you’ll ever get.

Now rescale to monthly returns to get cleaner statistics:

# Monthly aggregation
monthly = (1 + ret).resample("ME").prod() - 1
X_m = sm.add_constant(monthly["SPY"])
m_model = sm.OLS(monthly["AAPL"], X_m).fit()
print(f"Monthly alpha : {m_model.params['const']*100:.2f}% / month")
print(f"Monthly beta  : {m_model.params['SPY']:.2f}")
print(f"R-squared     : {m_model.rsquared:.2f}")

PROMPT

Use pandas and statsmodels to run a monthly CAPM regression and print alpha, beta, and R-squared.

Monthly beta will be roughly stable around 1.15-1.25. The alpha reading will swing wildly depending on what year you cut the sample.

The Three Famous CAPM Failures

CAPM predicts that beta alone explains cross-sectional expected returns. Three patterns break this, and each one became a named factor.

Failure 1: Value: cheap beats expensive

Stocks with high book-to-market (B/M) ratios (“value” stocks) earn higher returns than CAPM predicts. Growth stocks (low B/M) underperform.

Documented in:

  • Basu (1977): earnings yield (the inverse of P/E).
  • Rosenberg, Reid, Lanstein (1985): book-to-market specifically.
  • Fama & French (1993): formalized HML (High Minus Low) as a factor.

The 1963-1990 evidence was decisive: value stocks outperformed growth by about 5% annually on a market-adjusted basis. CAPM has no prediction for this. Under CAPM, they should have the same expected return because they have similar betas.

Failure 2: Size: small beats big

Small-cap stocks (below the median market cap) historically beat large-cap stocks on a market-adjusted basis. Banz (1981) documented this first; Fama & French (1993) made it the SMB factor (Small Minus Big).

Size premium was strong from the 1970s through the early 1990s. It has been weak-to-negative since 2008. Small caps now earn roughly their CAPM-implied returns, sometimes less. Whether size is “dead” or just arbitraged is contested.

Failure 3: Momentum: winners keep winning

Past 12-month return positively predicts future 12-month return. Jegadeesh & Titman (1993). This is not predicted by CAPM at all. CAPM implies momentum should be zero.

Momentum is the largest, most reliable anomaly in published finance. It works in equities, bonds, currencies, and commodities. It also crashed about -50% in 2009 over 3 months, which comes up again later.

Honest Take: Why You Still Use It

CAPM is wrong. Use it anyway as a baseline. Every alpha you find is what CAPM missed.

The reason: CAPM gives you a baseline against which to measure “did my strategy actually generate alpha, or did it just generate market exposure plus luck?” The model is a yardstick, not a claim about the world.

If you backtest a strategy and report a Sharpe of 1.5 with no benchmark comparison, you don’t know whether you earned alpha or rode a beta-heavy exposure. CAPM regression gives you the answer in 30 seconds. Use it first, then move to more sophisticated factor models.

Beta Is Not Stable

One practical issue that doesn’t get enough airtime: betas change over time. A lot.

# Estimate rolling 252-day beta for AAPL over 5 years
rolling_beta = ret["AAPL"].rolling(252).cov(ret["SPY"]) / ret["SPY"].rolling(252).var()
rolling_beta.plot(figsize=(11, 4), title="AAPL rolling 252-day beta on SPY (2020-2024)")
plt.axhline(1.0, color="black", lw=0.7, ls="--")
plt.ylabel("Beta")
plt.show()

PROMPT

Use pandas and matplotlib to estimate a rolling 252-day beta and plot it over time.

You’ll see the beta swing from below 1.0 in calm periods to above 1.4 in stress periods. A 2019 beta of 0.8 might be 1.5 in 2022. This is the beta-instability problem, which is why stat-arb hedge funds spend real money on rolling, regime-conditional, and exponentially-weighted beta estimators.

Three rules to live by:

  1. Don’t trust beta estimated on less than 60 monthly observations. Daily data lets you go shorter but introduces autocorrelation noise.
  2. Use exponentially weighted beta in production. Recent observations matter more.
  3. Expect beta to spike during crises. If your stop-loss is calibrated to your calm-market beta, you’ll get run over during a crash.

This is one reason single-factor CAPM is universally replaced by multi-factor models (Fama-French, Carhart). Managing the time-varying beta problem with a single factor amplifies the noise.

Where It Fits

CAPM is the floor. The Fama-French three-factor model and Carhart four-factor model extend it by adding value, size, and momentum exposures. Once you’ve measured a strategy’s CAPM alpha and beta, the next question is: “Is this alpha just value + size + momentum exposure?” That’s where the next article picks up.

In the Arithmion SDK, arithmion.factor.capm_regression() returns alpha, beta, and residuals for any stock versus any benchmark over any window. Standard output. The interesting part is what comes after.

References

  • Sharpe, “Capital Asset Prices: A Theory of Market Equilibrium Under Conditions of Risk,” Journal of Finance, 1964.
  • Lintner, “The Valuation of Risk Assets and the Selection of Risky Investments in Stock Portfolios and Capital Budgets,” Review of Economics and Statistics, 1965. (Independent derivation of CAPM.)
  • Fama & French, “Common Risk Factors in the Returns on Stocks and Bonds,” Journal of Financial Economics, 1993.
  • Grinold & Kahn, Active Portfolio Management, Ch. 3. McGraw-Hill, 2000. ISBN: 978-0-07-135638-4.
  • Ang, Asset Management, Ch. 5-6. Oxford University Press, 2014. ISBN: 978-0-19-995932-3.
  • Frazzini, Israel, Moskowitz, “Trading Against the Anomaly,” Journal of Financial Economics, 2018 (on beta instability and the “betting against beta” factor).