Performance Attribution and Investment Alpha › Brinson Attribution

Michael BrenndoerferDecember 17, 202513 min read
Quantitative FinanceAll chapters
Part 9 of 15Portfolio Theory and Investment Analysis
Chapter 50Performance Attribution and Investment Alpha › Brinson Attribution
Reading section 2 of 10 · Brinson Attribution · 13 minSection 2 of 10 · 13 min

Book contents

Section 2 of 10 · 13 min read

Performance Attribution and Investment Alpha › Brinson AttributionOne section · Sections in this chapter2 / 10 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

Brinson attribution, developed by Gary Brinson, Randolph Hood, and Gilbert Beebower in their seminal 1986 paper, provides a framework for understanding how active portfolio management decisions contribute to performance relative to a benchmark. The approach decomposes the difference between portfolio and benchmark returns into distinct components attributable to asset allocation decisions versus security selection decisions.

The Framework

To understand how a portfolio outperforms or underperforms its benchmark, we must first establish the mathematical foundation for calculating returns. The key insight is that total portfolio return is simply the weighted average of returns across all holdings, where the weights represent how much capital is allocated to each sector or asset class.

Consider a portfolio and benchmark, each divided into nn asset classes or sectors. The total portfolio return is computed by summing the contribution from each sector, where each contribution equals the weight allocated to that sector multiplied by the return earned within that sector:

RP=∑i=1nwiP⋅riPR^P = \sum_{i=1}^{n} w_i^P \cdot r_i^P

This formula captures a fundamental truth about portfolio construction: your total return depends both on where you put your money and how well each investment performed. A portfolio heavily weighted toward technology will see its total return dominated by technology's performance, regardless of how other sectors fared.

The same logic applies to the benchmark. The total benchmark return aggregates the contributions from each sector using the benchmark's own weights and returns:

RB=∑i=1nwiB⋅riBR^B = \sum_{i=1}^{n} w_i^B \cdot r_i^B

where:

  • RP,RBR^P, R^B: total portfolio and benchmark returns
  • wiP,wiBw_i^P, w_i^B: portfolio and benchmark weights in sector ii
  • riP,riBr_i^P, r_i^B: portfolio and benchmark returns in sector ii
  • nn: number of asset classes or sectors

The active return, or value added, represents the difference between what the portfolio earned and what it would have earned by simply matching the benchmark:

RA=RP−RBR^A = R^P - R^B

where:

  • RAR^A: active return
  • RPR^P: total portfolio return
  • RBR^B: total benchmark return

This active return is the central quantity we seek to explain. A positive active return indicates outperformance, while a negative value indicates underperformance. The power of Brinson attribution lies in its ability to decompose this single number into three distinct effects, each tied to a specific type of investment decision. By separating these effects, we can determine whether outperformance originated from choosing the right sectors to overweight, from picking winning securities within sectors, or from some combination of both.

Brinson attribution decomposes this active return into three effects that explain where the outperformance or underperformance originated.

Allocation Effect

The allocation effect measures the value added from over- or underweighting sectors relative to the benchmark, assuming the manager earned the benchmark return within each sector. It captures the decision of where to invest, isolating the pure impact of sector weight differences.

To understand why this formula takes its particular form, consider what happens when a manager overweights a sector. If that sector subsequently outperforms the overall benchmark, the manager benefits from having more capital exposed to those favorable returns. Conversely, if the overweighted sector underperforms, the allocation decision detracts from performance.

The formula for the allocation effect in a single sector captures this intuition precisely:

Allocation Effecti=(wiP−wiB)⋅(riB−RB)\text{Allocation Effect}_i = (w_i^P - w_i^B) \cdot (r_i^B - R^B)

where:

  • wiP,wiBw_i^P, w_i^B: portfolio and benchmark weights in sector ii
  • riBr_i^B: benchmark return in sector ii
  • RBR^B: total benchmark return

Let us examine why each term appears in this formula. The first factor, (wiP−wiB)(w_i^P - w_i^B), represents the active weight decision. A positive value indicates the manager overweighted the sector relative to the benchmark, while a negative value indicates an underweight. The second factor, (riB−RB)(r_i^B - R^B), represents the sector's relative performance versus the total benchmark. Using the benchmark return within the sector, rather than the portfolio's return, isolates the allocation decision from any security selection effects.

The total allocation effect across all sectors is simply the sum of individual sector contributions:

Allocation Effect=∑i=1n(wiP−wiB)⋅(riB−RB)\text{Allocation Effect} = \sum_{i=1}^{n} (w_i^P - w_i^B) \cdot (r_i^B - R^B)

where:

  • nn: number of asset classes or sectors
  • wiP,wiBw_i^P, w_i^B: portfolio and benchmark weights in sector ii
  • riBr_i^B: benchmark return in sector ii
  • RBR^B: total benchmark return

The intuition is straightforward: if you overweight a sector that outperforms the overall benchmark, you add value through allocation. The term (riB−RB)(r_i^B - R^B) represents the sector's relative performance versus the total benchmark, so simply overweighting a sector isn't credited unless that sector outperformed. This design prevents a manager from receiving credit for overweighting a sector that merely matched the benchmark return.

Selection Effect

The selection effect measures the value added from selecting securities within each sector that outperform (or underperform) the sector benchmark, weighted by the benchmark allocation. It captures the skill of choosing which securities to hold within each sector, separate from the decision of how much to allocate to that sector.

Consider a manager who holds the benchmark weight in technology stocks but chooses specific tech companies that outperform the technology sector as a whole. This stock-picking skill within the sector generates positive selection effect. The formula isolates this contribution by using the benchmark weight rather than the portfolio weight:

Selection Effecti=wiB⋅(riP−riB)\text{Selection Effect}_i = w_i^B \cdot (r_i^P - r_i^B)

where:

  • wiBw_i^B: benchmark weight in sector ii
  • riPr_i^P: portfolio return in sector ii
  • riBr_i^B: benchmark return in sector ii

The first factor, wiBw_i^B, uses the benchmark weight to isolate pure security selection from allocation decisions. By weighting the selection skill at the benchmark allocation, we measure what the manager's stock picks would have contributed if the portfolio had maintained benchmark sector weights. The second factor, (riP−riB)(r_i^P - r_i^B), captures the return difference between the manager's security selection within the sector and the sector benchmark itself.

The total selection effect is:

Selection Effect=∑i=1nwiB⋅(riP−riB)\text{Selection Effect} = \sum_{i=1}^{n} w_i^B \cdot (r_i^P - r_i^B)

where:

  • nn: number of asset classes or sectors
  • wiBw_i^B: benchmark weight in sector ii
  • riPr_i^P: portfolio return in sector ii
  • riBr_i^B: benchmark return in sector ii

If your stock picks within technology outperform the technology sector benchmark, you earn positive selection effect proportional to the benchmark's technology weight. This weighting makes outperformance in larger benchmark sectors contribute more to the total selection effect, in line with each sector exposure.

Interaction Effect

The interaction effect captures the combined impact of allocation and selection decisions. It arises when you both overweight a sector and outperform within that sector (or underweight and underperform). This effect represents the additional value created, or destroyed, when allocation and selection decisions reinforce each other.

Think of the interaction effect as measuring synergy between two decisions. When a manager overweights a sector where they also demonstrate superior stock selection, the benefit is magnified beyond what either decision alone would produce. The overweight amplifies the impact of good security selection. Conversely, overweighting a sector where security selection is poor compounds the negative impact.

The formula captures this multiplicative relationship:

Interaction Effecti=(wiP−wiB)⋅(riP−riB)\text{Interaction Effect}_i = (w_i^P - w_i^B) \cdot (r_i^P - r_i^B)

where:

  • wiP,wiBw_i^P, w_i^B: portfolio and benchmark weights in sector ii
  • riP,riBr_i^P, r_i^B: portfolio and benchmark returns in sector ii

The first factor, (wiP−wiB)(w_i^P - w_i^B), represents the active weight decision, just as in the allocation effect. The second factor, (riP−riB)(r_i^P - r_i^B), represents the security selection outperformance, just as in the selection effect. When both factors are positive, indicating overweighting combined with outperformance, the interaction effect is positive. When both are negative, indicating underweighting combined with underperformance, the interaction effect is also positive because the manager avoided a sector where their selection was poor. The interaction effect is negative when the signs differ, such as overweighting a sector with poor security selection.

The total interaction effect is:

Interaction Effect=∑i=1n(wiP−wiB)⋅(riP−riB)\text{Interaction Effect} = \sum_{i=1}^{n} (w_i^P - w_i^B) \cdot (r_i^P - r_i^B)

where:

  • nn: number of asset classes or sectors
  • wiP,wiBw_i^P, w_i^B: portfolio and benchmark weights in sector ii
  • riP,riBr_i^P, r_i^B: portfolio and benchmark returns in sector ii

The interaction effect is sometimes controversial in practice. Some practitioners combine it with the selection effect, arguing that overweighting a sector where you have superior selection skill is itself a form of selection. This perspective holds that a skilled manager should lean into their areas of strength, and the interaction effect rewards exactly this behavior. Others keep it separate to maintain cleaner interpretations, allowing stakeholders to evaluate allocation and selection decisions independently.

Brinson Decomposition Identity

In Brinson attribution, the three effects sum exactly to the active return, with no residual or unexplained component:

RA=Allocation Effect+Selection Effect+Interaction EffectR^A = \text{Allocation Effect} + \text{Selection Effect} + \text{Interaction Effect}

where:

  • RAR^A: active return
  • Allocation Effect\text{Allocation Effect}: value added from asset allocation
  • Selection Effect\text{Selection Effect}: value added from security selection
  • Interaction Effect\text{Interaction Effect}: value added from the interaction of allocation and selection

This exact decomposition is a mathematical necessity that follows from how the effects are defined. The decomposition gives a complete accounting of active return sources, so no value added goes unexplained.

We can verify this identity by summing the total effects. Note that ∑(wiP−wiB)=0\sum (w_i^P - w_i^B) = 0 because both sets of weights sum to 1, causing the RBR^B term in the allocation effect to vanish:

Sum of Effects=∑(wiP−wiB)(riB−RB)+∑wiB(riP−riB)+∑(wiP−wiB)(riP−riB)=∑(wiP−wiB)riB−RB∑(wiP−wiB)⏟0+∑[wiB+(wiP−wiB)]⏟wiP(riP−riB)(regroup terms)=∑(wiP−wiB)riB+∑wiP(riP−riB)(simplify weights)=(∑wiPriB−∑wiBriB)+(∑wiPriP−∑wiPriB)(expand sums)=∑wiPriP−∑wiBriB(cancel ∑wiPriB terms)=RP−RB(definition of returns)\begin{aligned} \text{Sum of Effects} &= \sum (w_i^P - w_i^B)(r_i^B - R^B) + \sum w_i^B(r_i^P - r_i^B) + \sum (w_i^P - w_i^B)(r_i^P - r_i^B) \\ &= \sum (w_i^P - w_i^B)r_i^B - R^B \underbrace{\sum (w_i^P - w_i^B)}_{0} + \sum \underbrace{[w_i^B + (w_i^P - w_i^B)]}_{w_i^P} (r_i^P - r_i^B) && \text{(regroup terms)} \\ &= \sum (w_i^P - w_i^B)r_i^B + \sum w_i^P (r_i^P - r_i^B) && \text{(simplify weights)} \\ &= (\sum w_i^P r_i^B - \sum w_i^B r_i^B) + (\sum w_i^P r_i^P - \sum w_i^P r_i^B) && \text{(expand sums)} \\ &= \sum w_i^P r_i^P - \sum w_i^B r_i^B && \text{(cancel } \sum w_i^P r_i^B \text{ terms)} \\ &= R^P - R^B && \text{(definition of returns)} \end{aligned}

This algebraic proof demonstrates that the Brinson decomposition provides an exhaustive and mutually consistent explanation of active returns. Every basis point of outperformance or underperformance can be traced to one of the three effects, making the framework both mathematically rigorous and practically interpretable.

Worked Example

Let's implement Brinson attribution for a simple three-sector portfolio.

In[2]:
Code
import numpy as np

# Portfolio and benchmark data for three sectors
sectors = ["Technology", "Healthcare", "Financials"]

# Portfolio weights and returns
portfolio_weights = np.array([0.45, 0.30, 0.25])
portfolio_returns = np.array([0.15, 0.08, 0.05])

# Benchmark weights and returns
benchmark_weights = np.array([0.30, 0.35, 0.35])
benchmark_returns = np.array([0.12, 0.06, 0.04])
In[3]:
Code
# Calculate total portfolio and benchmark returns
total_portfolio_return = np.sum(portfolio_weights * portfolio_returns)
total_benchmark_return = np.sum(benchmark_weights * benchmark_returns)
active_return = total_portfolio_return - total_benchmark_return

# Calculate attribution effects for each sector
weight_diff = portfolio_weights - benchmark_weights
return_diff = portfolio_returns - benchmark_returns
sector_excess = benchmark_returns - total_benchmark_return

allocation_effect = weight_diff * sector_excess
selection_effect = benchmark_weights * return_diff
interaction_effect = weight_diff * return_diff
In[4]:
Code
import pandas as pd

# Create attribution summary table
attribution_df = pd.DataFrame(
    {
        "Sector": sectors,
        "Port Weight": portfolio_weights,
        "Bench Weight": benchmark_weights,
        "Weight Diff": weight_diff,
        "Port Return": portfolio_returns,
        "Bench Return": benchmark_returns,
        "Allocation": allocation_effect,
        "Selection": selection_effect,
        "Interaction": interaction_effect,
    }
)
Out[5]:
Console
Brinson Attribution Analysis
============================================================

Total Portfolio Return: 10.40%
Total Benchmark Return: 7.10%
Active Return: 3.30%
Out[6]:
Console

Sector-Level Attribution:
------------------------------------------------------------

Technology:
  Weight Diff: +15.0%
  Allocation Effect: +0.74%
  Selection Effect: +0.90%
  Interaction Effect: +0.45%

Healthcare:
  Weight Diff: -5.0%
  Allocation Effect: +0.05%
  Selection Effect: +0.70%
  Interaction Effect: -0.10%

Financials:
  Weight Diff: -10.0%
  Allocation Effect: +0.31%
  Selection Effect: +0.35%
  Interaction Effect: -0.10%
In[7]:
Code
# Aggregate attribution effects
total_allocation = np.sum(allocation_effect)
total_selection = np.sum(selection_effect)
total_interaction = np.sum(interaction_effect)
sum_of_effects = total_allocation + total_selection + total_interaction
Out[8]:
Console

Aggregate Attribution Summary:
----------------------------------------
Total Allocation Effect:  +1.10%
Total Selection Effect:   +1.95%
Total Interaction Effect: +0.25%
Sum of Effects:           +3.30%
Active Return (check):    +3.30%

The attribution reveals that most of the portfolio's {python} f"{active_return:.2%}" outperformance came from selection effect ({python} f"{total_selection:.2%}"), indicating strong security selection across sectors. The positive allocation effect ({python} f"{total_allocation:.2%}") shows that overweighting technology (which outperformed) added value. The interaction effect ({python} f"{total_interaction:.2%}") reflects the benefit of combining good allocation with good selection, particularly in the technology sector where the portfolio both overweighted the sector and outperformed within it.

Visualization of Attribution Effects

Out[9]:
Visualization
Grouped bar chart comparing allocation, selection, and interaction effects for Technology, Healthcare, and Financials, with Technology positive across all three effects.
Decomposition of active return into allocation, selection, and interaction effects by sector. Technology generates the largest value added through all three effects, while Healthcare and Financials have small negative interaction effects.
Out[10]:
Visualization
Waterfall chart starting at a 7.10 percent benchmark return and adding allocation, selection, and interaction effects to reach a 10.40 percent portfolio return.
Waterfall chart showing how a 7.10% benchmark return plus 1.10% allocation, 1.95% selection, and 0.25% interaction effects accumulates to the 10.40% portfolio return.