Attribution: where did the active return come from?
A portfolio beat its benchmark by 3.65%. Attribution splits that number into the decisions that produced it. The Brinson model looks at two decisions in every sector, plus a leftover.
- Allocation
- Did you put more money in sectors that did well, and less in sectors that did badly?
- Selection
- Within each sector, did your holdings beat that sector's benchmark return?
- Interaction
- The combined effect of both: overweighting a sector where you also picked well amplifies the win.
w = weight, R = return; p = portfolio, b = benchmark, i = sector. Rb without a sector is the total benchmark return. These are the Brinson-Fachler formulas; the older Brinson-Hood-Beebower version is compared below.
Run the attribution
Edit weights and returns (in %). Or load a scenario.
| Sector | Benchmark weight | Portfolio weight | Benchmark return | Portfolio return |
|---|---|---|---|---|
| Total |
| Sector | Allocation | Selection | Interaction | Total |
|---|
Brinson-Fachler vs Brinson-Hood-Beebower
There are two classic versions of the Brinson model. They use identical selection and interaction formulas and differ in exactly one place: what an allocation bet is measured against.
Brinson-Hood-Beebower (BHB, 1986) asks: did the sector go up? Overweight any sector that rose and you get credit. Brinson-Fachler (BF, 1985) asks a sharper question: did the sector beat the benchmark as a whole? Every overweight has to be paid for with an underweight somewhere else, so what matters isn't whether a sector rose, but whether it rose more than that money would have earned in the rest of the benchmark.
A two-sector example
A benchmark holds 50% in sector A (up 3%) and 50% in sector B (up 7%), so it returns 5%. You move 10 points from B into A, holding 60% A and 40% B. That was plainly a bad call: you moved money out of the better sector into the worse one.
| Sector | Weight bet | BHB allocation | BF allocation |
|---|---|---|---|
| A (+3%) | +10 pts | +10% × 3% = +0.30% | +10% × (3% − 5%) = −0.20% |
| B (+7%) | −10 pts | −10% × 7% = −0.70% | −10% × (7% − 5%) = −0.20% |
| Total | −0.40% | −0.40% |
Same total, different story. BHB tells the client that overweighting A added value, which is backwards: A was the weaker sector, and the gain only appears because A happened to rise. BF blames both sides of the trade, which is how the decision was actually made.
Why the totals always agree
Subtract one allocation formula from the other and the only difference is (wp,i − wb,i) × Rb. Summed across sectors that's Rb × Σ(wp,i − wb,i). When both portfolios are fully invested, each set of weights adds up to 100%, so the differences add up to zero and the term vanishes. The two models always agree in total and only disagree sector by sector.
Same trade, two stories
A 50/50 benchmark with two sectors. Move weight between them and set each sector's return.
Brinson-Hood-Beebower
Brinson-Fachler
Side by side
| Brinson-Hood-Beebower | Brinson-Fachler | |
|---|---|---|
| Allocation measured against | Zero: did the sector rise? | The total benchmark return: did the sector beat the benchmark? |
| Sector-level message | Can reward overweighting a sector that rose but lagged | Rewards overweighting sectors that beat the benchmark and underweighting those that lagged |
| In a broad sell-off | Nearly every underweight looks good, because nearly every sector fell | An underweight only looks good if that sector fell more than the benchmark |
| Total allocation effect | Same | Same |
| Selection and interaction | Same formulas | Same formulas |
| In practice | The original formulation; still seen in older reports and textbooks | The usual choice for sector-level reporting, because the sector story is right |
What about interaction?
Interaction is the part both models find hardest to explain. It's (wp,i − wb,i) × (Rp,i − Rb,i): the weight bet times the stock-picking result. Underweight a sector where your stocks also did badly and interaction comes out positive (a negative times a negative), which clients find baffling. Since nobody makes an "interaction decision", many firms fold it into selection by using portfolio weights in the selection formula: selection = wp,i × (Rp,i − Rb,i). Try the "Fold into selection" switch in the lab above to see it.
All numbers are illustrative. The models are simplified for teaching: annual coupons, Black-Scholes options, simplified fee mechanics and no intra-period trading. Real systems add transaction-based returns, daily valuation, tax and corporate action processing, and reconciliation to the official TWR.