Attribution versus benchmark

Brinson BHB and BF attribution of excess TWR, with Menchero, Carino and Frongello linking, plus benchmark vs benchmark

Attribution answers “why did we beat or lag the benchmark?” It splits excess TWR into allocation (weights vs the policy mix), selection (security choice inside each segment) and, in the three-factor model, interaction.

You need a transaction-based book and a custom benchmark in the same base currency. Segments are the pairs (asset class, currency group) that the benchmark defines. Missing a segment on one side for a day is filled with that day’s overall benchmark return, so a name that exists only in the portfolio does not create a spurious allocation spike.

This is not contribution. Contribution explains portfolio TWR. Attribution explains TWR_portfolio − TWR_benchmark.

Excess return

Excess = TWR_A − TWR_B

TWR on each side can be TR (total return) or CP (capital return), the same switch as on the TWR page.

Models

Daily weights and returns by segment feed a Brinson decomposition, then the daily effects are linked over the horizon.

BHB (Brinson-Hood-Beebower) keeps three effects per segment:

  • Allocation: overweight or underweight versus the segment’s benchmark return relative to the overall benchmark return that day. Did the manager put more weight in the segments that paid?
  • Selection: benchmark weight × (portfolio segment return − benchmark segment return). Did names inside the segment beat the benchmark’s names?
  • Interaction: the cross term (weight gap × return gap). Overweighting a segment you also outperformed (or the reverse).

The three effects sum to that day’s excess. Over the period, after linking, they sum to period excess.

BF (Brinson-Fachler) uses the same allocation idea versus overall benchmark return, and folds interaction into selection (portfolio weight × return gap). Two columns instead of three; often clearer in a client pack.

UseModel
Want to see interaction on its ownBHB
Presentation: allocation vs “stock picking” onlyBF

In both models, a residual line can appear: official portfolio TWR minus the TWR implied by the daily Brinson weights. It is the gap between the performance engine and the segment tape (timing of cash, suppressed micro-segments, rounding). On benchmark vs benchmark that residual is essentially zero.

Linking over many days

The same problem as contribution: arithmetic daily excesses do not equal compound excess. TrackRecords supports:

MethodRole
Menchero (default)Optimal linking (2000). Time-symmetric. Separate coefficients for excess, side A and side B so allocation + selection [+ interaction] = excess, and each side’s linked contributions equal that side’s TWR.
CarinoLogarithmic smoothing (1999). Exact additivity of excess; order of days does not matter.
FrongelloSequential chain (2002). Later effects ride on earlier compound returns. Small rounding drift can remain; still the usual GIPS-style story.

Menchero and Carino typically match excess to well under 0.001 percentage points. Frongello can show a slightly wider residual after a long chain.

What you see

Per segment: portfolio weight, benchmark weight, weight gap, both returns, allocation, selection, interaction (BHB), excess. Totals at the top: TWR A, TWR B, excess, sum of effects. Sort and export to Excel.

Benchmark versus benchmark

The same Brinson engine can compare two custom benchmarks (A vs B) without a portfolio: strategic mix vs a published index, old policy vs new policy, or “what if we swapped the credit sleeve”.

You get the same models (BHB/BF) and the same linking methods. Tickers of each benchmark stay attached to their segments so you can see which index inside a class drove selection.

Related: Custom benchmarks, Contribution, TWR and MWR.