Performance Attribution and Investment Alpha › Brinson Attribution
Quantitative FinanceAll chapters 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 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:
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:
where:
- : total portfolio and benchmark returns
- : portfolio and benchmark weights in sector
- : portfolio and benchmark returns in sector
- : 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:
where:
- : active return
- : total portfolio return
- : 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:
where:
- : portfolio and benchmark weights in sector
- : benchmark return in sector
- : total benchmark return
Let us examine why each term appears in this formula. The first factor, , 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, , 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:
where:
- : number of asset classes or sectors
- : portfolio and benchmark weights in sector
- : benchmark return in sector
- : total benchmark return
The intuition is straightforward: if you overweight a sector that outperforms the overall benchmark, you add value through allocation. The term 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:
where:
- : benchmark weight in sector
- : portfolio return in sector
- : benchmark return in sector
The first factor, , 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, , captures the return difference between the manager's security selection within the sector and the sector benchmark itself.
The total selection effect is:
where:
- : number of asset classes or sectors
- : benchmark weight in sector
- : portfolio return in sector
- : benchmark return in sector
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:
where:
- : portfolio and benchmark weights in sector
- : portfolio and benchmark returns in sector
The first factor, , represents the active weight decision, just as in the allocation effect. The second factor, , 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:
where:
- : number of asset classes or sectors
- : portfolio and benchmark weights in sector
- : portfolio and benchmark returns in sector
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:
where:
- : active return
- : value added from asset allocation
- : value added from security selection
- : 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 because both sets of weights sum to 1, causing the term in the allocation effect to vanish:
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.
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])# 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_diffimport 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,
}
)Brinson Attribution Analysis ============================================================ Total Portfolio Return: 10.40% Total Benchmark Return: 7.10% Active Return: 3.30%
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%
# 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_interactionAggregate 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

