9

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.
Allocationi = (wp,i − wb,i) × (Rb,i − Rb)
Selectioni = wb,i × (Rp,i − Rb,i)
Interactioni = (wp,i − wb,i) × (Rp,i − Rb,i)

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.

In plain termsPicture a chef competing against a set menu. Allocation is deciding to serve more desserts than the menu does. Selection is making a better dessert than the standard recipe.

Run the attribution

Edit weights and returns (in %). Or load a scenario.

SectorBenchmark
weight
Portfolio
weight
Benchmark
return
Portfolio
return
Total

Model
Interaction
SectorAllocationSelectionInteractionTotal

    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.

    BHB allocationi = (wp,i − wb,i) × Rb,i
    BF allocationi = (wp,i − wb,i) × (Rb,i − Rb)

    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.

    SectorWeight betBHB allocationBF 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.

    Σ BHB − Σ BF = Rb × Σ (wp,i − wb,i) = Rb × 0 = 0

    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-BeebowerBrinson-Fachler
    Allocation measured againstZero: did the sector rise?The total benchmark return: did the sector beat the benchmark?
    Sector-level messageCan reward overweighting a sector that rose but laggedRewards overweighting sectors that beat the benchmark and underweighting those that lagged
    In a broad sell-offNearly every underweight looks good, because nearly every sector fellAn underweight only looks good if that sector fell more than the benchmark
    Total allocation effectSameSame
    Selection and interactionSame formulasSame formulas
    In practiceThe original formulation; still seen in older reports and textbooksThe 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.

    For practitionersFolding interaction into selection assumes the allocation decision came first (top-down). A bottom-up stock picker might argue the reverse, folding interaction into allocation instead. Real attribution systems also have to choose a return basis (buy-and-hold from start-of-day weights vs transaction-based), classify cash and derivatives, handle securities missing from the benchmark (selection against the sector benchmark return), and reconcile to the official TWR. Any gap shows up as a residual, usually from intraday trading, fees and accruals not in the holdings data, or pricing and FX source differences between the portfolio and benchmark.

    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.