Guide

Portfolio performance attribution explained

Harbor Capital's US large-cap factor sleeve returned 8.4% in Q1 versus 7.0% for its Russell 1000 benchmark — a headline 142 basis points of outperformance. The PM credited “stock selection.” A standard Brinson-Fachler attribution told a different story: 89 bps came from sector allocation (overweight semiconductors before the AI rally), 41 bps from selection within sectors, and 12 bps from the interaction term where both bets aligned. Without attribution, the desk would have doubled down on security-level models while the real edge was macro tilts. Performance attribution answers a precise question: given a portfolio and a benchmark, which decisions — weights, picks, timing, currency — generated active return? It connects portfolio return to tracking error, Jensen's alpha, and allocator accountability. This guide covers the Brinson-Fachler framework, allocation/selection/interaction math, single- versus multi-period linking, security-level extensions, the Harbor Q1 review, a method decision table, pitfalls, and a practitioner checklist alongside our information ratio guide and factor investing overview.

What attribution measures (and what it does not)

Total portfolio return Rp decomposes against benchmark return Rb. Active return (or excess return in the long-only context) is:

Ractive = Rp − Rb

Attribution explains why Ractive happened by assigning slices to decision categories. It does not judge whether those decisions were skill or luck — that requires out-of-sample persistence, statistical tests, and economic intuition. It also does not replace risk analytics: a quarter of lucky sector bets can dominate while tail risk builds quietly.

Common use cases:

  • Allocator reviews: separate PM skill from benchmark drift.
  • Risk budgeting: see whether active risk sits in allocation or stock bets.
  • Fee justification: active managers should earn alpha in dimensions they claim (e.g., stock picking, not accidental beta).
  • Process feedback: if selection is persistently negative, tighten research or reduce name count.

Brinson-Fachler sector attribution

The classic Brinson-Hood-Beebower (1986) and Brinson-Fachler (1985) models attribute active return across N sectors (or asset classes). Define:

  • wp,i — portfolio weight in sector i
  • wb,i — benchmark weight in sector i
  • rp,i — portfolio return in sector i
  • rb,i — benchmark return in sector i

Brinson-Fachler decomposes active return into three effects per sector:

Allocation effect

Ai = (wp,i − wb,i) × rb,i

Reward for overweighting sectors that beat the benchmark return at the benchmark's own composition. Pure weight decision, holding benchmark sector returns fixed.

Selection effect

Si = wb,i × (rp,i − rb,i)

Reward for beating the benchmark within sector i, weighted by benchmark sector exposure. Captures stock-picking skill at neutral weights.

Interaction effect

Ii = (wp,i − wb,i) × (rp,i − rb,i)

Captures the joint benefit (or cost) of being overweight and outperforming inside the same sector. Some shops fold interaction into allocation or selection; consistency matters more than the label as long as the sum reconciles.

Summing Ai + Si + Ii across sectors equals active return (before currency and transaction-cost adjustments). Verify reconciliation every report — rounding and data gaps are the first debug step.

Worked mini-example

Two-sector toy portfolio for one quarter:

Sector wp wb rp rb
Technology 35% 28% +12% +10%
Healthcare 65% 72% +2% +3%

Portfolio return: 0.35×12% + 0.65×2% = 5.5%. Benchmark: 0.28×10% + 0.72×3% = 4.96%. Active return: 54 bps.

Technology allocation: (35%−28%)×10% = 70 bps. Technology selection: 28%×(12%−10%) = 56 bps. Technology interaction: 7%×2% = 14 bps. Healthcare effects are negative (underweight a sector that outperformed; pick stocks that lagged). The arithmetic explains the 54 bps total without hand-waving.

Security-level and factor attribution

Sector buckets hide concentration. Security-level attribution assigns each holding's contribution:

Contributionj = wp,j × rj − wb,j × rj

(Variants exist for benchmark-universe names not held.) Roll security contributions into sectors to reconcile with Brinson-Fachler. For factor portfolios, factor attribution regresses active return on style factors (value, momentum, size, quality) or uses holdings-based factor mimicking portfolios. That answers whether outperformance was intentional factor tilts or residual alpha.

Currency attribution

Global mandates add a currency layer: local return versus base-currency return, hedging P&L, and forward-roll costs. Separate currency from local stock decisions before blaming the equity desk.

Transaction costs and cash

Gross attribution excludes costs; net attribution subtracts commissions, spread, and market impact from turnover. Idle cash drag appears as a residual unless modeled explicitly.

Multi-period linking

Single-period attribution sums cleanly. Over quarters, naive addition of effects breaks compounding. Linking algorithms scale period effects so they sum to multi-period active return. Common methods:

  • Carino (1999): industry standard; uses a constant-scaling factor derived from total and active returns.
  • Menchero (2000): geometric linking with an optimization step for smoothness.
  • Frongello (2002): two-pass approach popular with some US pension consultants.

Pick one method, document it in the investment policy statement, and never switch mid-year without restating history. Allocators comparing managers need consistent linking as much as consistent benchmarks.

Harbor Capital Q1 review (worked example)

Setup: $380M sleeve vs Russell 1000. Eleven GICS sectors, monthly rebalancing, 42 active names (top 35 contribute 78% of active risk per risk model).

Headline: +142 bps active. Annualized information ratio ~1.1 on trailing three years — respectable, but Q1 was an outlier driven by one macro bet.

Attribution highlights:

  • Allocation +89 bps: +112 bps from overweight Technology (semiconductors sub-industry), partially offset by underweight Energy and overweight Staples drag.
  • Selection +41 bps: positive in Industrials and Health Care; negative in Consumer Discretionary where a retail short book hurt.
  • Interaction +12 bps: Tech overweight coincided with beating the Tech benchmark slice — the classic “right sector, right names” reinforcement.

Actions: Risk committee capped single-sector active weight at ±4% versus benchmark (was +7% in Tech). Research budget shifted toward Discretionary recovery ideas. Execution still used VWAP slicing — attribution confirmed alpha was not being donated at the touch.

Method decision table

Question Approach Trade-off
Where did sector bets help? Brinson-Fachler sector attribution Coarse; misses industry/sub-industry nuance
Which stocks drove the quarter? Security-level contribution analysis Noisy; needs benchmark constituent data
Was it factor exposure or alpha? Factor regression / holdings-based factor attribution Model-dependent; factors collinear in crises
Global mandate P&L Currency attribution layer Hedge accounting can obscure economic exposure
Multi-year PM track record Carino or Menchero linked attribution Method choice affects reported effect sizes
After-cost allocator view Net attribution with TCA integration Requires clean execution data feeds

Common pitfalls

  • Benchmark mismatch: attributing against the wrong index (e.g., Russell 1000 vs S&P 500) mislabels allocation as selection.
  • Free float and corporate actions: stale benchmark weights after index rebalances distort allocation effects.
  • Survivorship in custom benchmarks: backfilled indices inflate selection scores; use point-in-time constituents.
  • Interaction double-counting: teams that hide interaction in selection without documenting it confuse year-over-year comparisons.
  • Short positions and derivatives: long-only Brinson math breaks on short books and futures overlays; use modified frameworks.
  • Gross vs net: gross attribution flatters levered portfolios; always show net of fees and costs for external reporting.
  • Single-quarter narratives: 142 bps from one sector is not “stock-picking skill” until it persists across cycles.
  • Ignoring risk: high active return with exploding tracking error may be unintended beta, not repeatable edge.

Practitioner checklist

  • Document benchmark, return basis (total vs price), and currency hedging policy.
  • Reconcile sector effects to active return every period before publishing.
  • Run security-level contributions and verify roll-up to sector totals.
  • Apply a documented multi-period linking method (Carino is the common default).
  • Separate gross alpha from net alpha after fees, commissions, and estimated impact.
  • Compare allocation vs selection persistence over 12–36 months, not one quarter.
  • Cross-check factor attribution when the strategy claims style neutrality.
  • Flag concentrations: any sector contributing >50% of quarterly active return.
  • Align attribution frequency with investment process (monthly for active equity, quarterly for many allocators).
  • Store inputs (weights, returns, FX) for audit replay — spreadsheets alone are not enough at scale.

Key takeaways

  • Brinson-Fachler attribution splits active return into allocation, selection, and interaction effects that sum to the total.
  • Allocation measures weight decisions; selection measures picking skill at benchmark weights.
  • Security-level and factor extensions explain concentration and style bets beneath sector buckets.
  • Multi-period linking (Carino, Menchero) is required for compounding accuracy across quarters.
  • Harbor-style reviews turn headline outperformance into actionable risk limits and research priorities.

Related reading