Fama-MacBeth Regression
A two-pass method for testing whether a stock characteristic earns a return premium: run one cross-sectional regression per month, then treat the sequence of monthly slopes as an ordinary time series and t-test its average. It exists because pooling every stock-month into one regression produces standard errors that are far too small.
Prerequisites: Ordinary Least Squares (OLS), Cross-Sectional vs. Time-Series Strategies
You have twenty years of monthly returns for two thousand stocks, and one number attached to each stock in each month — say its book-to-market ratio. The question is plain: do cheap stocks earn more than expensive ones, and is the gap real or is it luck? The obvious move is to stack all 480,000 rows into a single regression of return on book-to-market and read off the t-statistic. Do that and you will declare victory, because the t-statistic will be enormous. It will also be badly wrong. In any given month every stock in the market is shoved around by the same handful of shocks, so those 480,000 rows are nowhere near 480,000 independent pieces of evidence.
An analogy: 240 polls, not 480,000 voters
Suppose you want to know whether a political slogan moves opinion. You run a poll every month for twenty years, two thousand people per poll. If a national news story swings everyone in a given month, then within that month the two thousand answers are close to one answer repeated two thousand times. You do not have 480,000 independent observations. You have something much nearer to 240 — one per poll.
The honest way to summarise that evidence is not to pool the people. It is to compute one number per poll, then look at how those 240 numbers behave over time. If the slogan's effect averages plus two points across the polls and swings by five points from poll to poll, you can say exactly how sure you are — and the shared national shocks are already accounted for, because they are precisely what makes the poll-to-poll number bounce.
Fama-MacBeth is that procedure applied to stocks. One regression per month gives one estimate of the premium per month. Then you run the simplest test there is on that little sequence of numbers.
The two passes, one symbol at a time
Let be the return on stock in month . Let be the characteristic you are testing, measured before the return so there is no look-ahead. Let ("gamma-one at time t") be the reward per unit of that characteristic in month , and the common intercept for that month.
Pass 1 — one cross-section at a time. For each month separately, run
In plain English: inside a single month, line the stocks up by their characteristic and fit a line through them; the slope is what one extra unit of the characteristic paid that month. Repeat times and you hold a time series of slopes, .
Pass 2 — a t-test on those slopes. The estimated premium is their average, and its uncertainty is their scatter:
In plain English: the premium is the average monthly slope, and how confident you are depends on how much that slope wobbles month to month — not on how many stocks you had. Here is the standard deviation of the slopes and is the number of months.
Notice what pass 2 never does: it never looks inside a month. Whatever correlation existed among stocks in March 2016 has already been compressed into a single number, and its damage surfaces honestly as month-to-month volatility of that number.
The explorer below is pass 1 in miniature. Drag the points and watch the fitted line and its residuals — every month of your sample produces one of these, and only the slope survives to pass 2.
Fit the regression once per period, then t-test the sequence of slopes. Your effective sample size is the number of periods, not the number of stock-months.
Worked example 1: five months, done by hand
Start with a single month. Four stocks, is book-to-market, is that month's return in percent.
| Stock | ||
|---|---|---|
| A | 0.5 | 1.0 |
| B | 1.0 | 2.0 |
| C | 1.5 | 2.0 |
| D | 2.0 | 5.0 |
Step 1 — centre both columns. The means are and . The deviations are ; the deviations are .
Step 2 — the two sums. Sum of squared deviations: . Sum of cross-products: .
Step 3 — the slope. , and the intercept is . That month, a stock one full unit higher in book-to-market earned 2.4 percentage points more. That is one observation about the premium, not four.
Step 4 — repeat and test. Say five months give slopes . Their sum is , so . The deviations are , whose squares sum to ; dividing by gives and . Then
An average premium of 1.0 with a t of 1.11 is not distinguishable from zero, and it should not be: five slopes that swing from to cannot pin down an average of 1.0. The method is being honest with you.
Worked example 2: twenty years, and what pooling would have claimed
Now the realistic version. months, mean slope percent per month, standard deviation of the slopes percent.
Annualised, the premium is percent per year per unit of the characteristic. A 95% interval runs , i.e. 0.124 to 0.516 percent monthly, or roughly 1.5 to 6.2 percent a year. Wide, and genuinely so.
Now the pooled alternative. A single regression on all rows treats every row as independent. Under equicorrelated residuals — every stock in a month sharing one shock with correlation — the variance of a within-month average is inflated by . With and a modest :
In plain English: the pooled standard error is about 14 times smaller than the truth, so the pooled t-statistic would print near . The effective sample is observations, not half a million. A t of 45 on a 3.8 percent annual premium is not a discovery; it is a diagnostic that your standard errors are broken.
What this means in practice
- It is the default test for a new signal. Nearly every "we found an anomaly" table in asset pricing is a column of Fama-MacBeth t-statistics. If you want a research claim taken seriously, this is the format it is expected in.
- The slope series is a portfolio return. is, up to scaling, the monthly return on a zero-cost book long high- and short low-. That makes pass 2 identical to a Sharpe-ratio test: . In example 2, monthly, an annualised Sharpe of , and — the same t-statistic, arrived at from the trading side.
- Watch the weighting. An equal-weighted cross-sectional regression hands enormous influence to microcaps. Use weighted least squares, or trim the universe, or you are measuring a premium you cannot trade.
- Many characteristics at once. Add columns to pass 1 and you get one slope series per characteristic, each with its own second-pass t-test — this is how you check whether a new signal survives controls for size and momentum.
A quick sanity check: . Twenty years and a t of 3.2 means a Sharpe near 0.7 — if someone shows you a t of 12 from ten years, the implied Sharpe is about 3.8, and you should ask what went wrong.
Two confusions, both common. First, Fama-MacBeth fixes cross-sectional correlation, not time-series correlation. The second pass assumes the monthly slopes are independent of each other. If the premium is persistent, or your signal overlaps across months, that assumption fails and the standard error is still too small — apply Newey-West to the slope series. Second, it is not the same thing as a time-series factor regression. Regressing one portfolio's returns on market, size and value over time asks "is this portfolio's alpha zero?"; Fama-MacBeth asks "does this characteristic get paid across stocks?" People quote one result and describe it as the other. A third, quieter trap: when is an estimated beta rather than an observed characteristic, measurement error drags the slope toward zero — which is exactly why Fama and MacBeth ran their original test on portfolios instead of single stocks.
Related concepts
Practice in interviews
Further reading
- Fama & MacBeth (1973), Risk, Return, and Equilibrium: Empirical Tests
- Cochrane, Asset Pricing (ch. 12)
- Petersen (2009), Estimating Standard Errors in Finance Panel Data Sets