# brinsonAttribution

## Description

Create a `brinsonAttribution`

object for performance
attribution using the Brinson model.

Use this workflow to develop and analyze a Brinson model for performance attribution:

Prepare data for the

`AssetTable`

input.Use

`brinsonAttribution`

to create a`brinsonAttribution`

object.Use the following functions with the

`brinsonAttribution`

object:

For more detailed information on this workflow, see Analyze Performance Attribution Using Brinson Model.

## Creation

### Description

creates a `brinsonAttrubtionObj`

= brinsonAttribution(`AssetTable`

)`brinsonAttribution`

object and sets the properties. Use the
`brinsonAttribution`

object with the `categoryAttribution`

, `categoryReturns`

, `categoryWeights`

, `totalAttribution`

, and `summary`

functions.

### Input Arguments

`AssetTable`

— Information about individual asset returns in the portfolio and
benchmark

table

Information about individual asset returns in the portfolio and
benchmark, specified as a table with the number of rows equal to
`NumAssets`

-times-`NumPeriods`

rows. The column variables are in the following order from left to right:

`Period`

— Column vector of positive whole numbers containing the time`Period`

numbers. For each one of the`NumAssets`

asset names, the`Period`

numbers range from 1 to`NumPeriods`

with increments of 1, so that there are a total of`NumAssets`

-times-`NumPeriods`

rows. Row 1 is for the first period, row 2 is for the second period, and is repeated for each asset. If the`Period`

column is missing from`AssetTable`

, all`Period`

numbers are internally set to`1`

and all asset returns in`AssetTable`

are assumed to be for the same single period.`Name`

— String column vector containing the individual asset names for the associated returns. There is a total of`NumAssets`

unique names, and the names are repeated for each`Period`

.`Return`

— Numeric column vector containing the asset returns in decimals.`Category`

— Categorical vector containing the asset categories (sectors) for the associated asset returns. There is a total of`NumCategories`

unique categories.`Portfolio Weight`

— Numeric vector containing the asset portfolio weights in decimals. The weights are internally normalized so that they sum to`1`

for each`Period`

.**Note**The values for

`Portfolio Weight`

must sum to`1`

for the Brinson model. If the weights do not sum to`1`

, the`Portfolio Weight`

values are internally normalized so that they sum to`1`

and`brinsonAttribution`

displays a warning. If there is a cash position, you must account for it as an asset with its own weight so that the weights sum to`1`

.`Benchmark Weight`

— Numeric vector containing the asset benchmark weights in decimals. The weights are internally normalized so that they sum to`1`

for each`Period`

.**Note**The values for the

`Benchmark Weight`

must sum to`1`

for the Brinson model. If the weights do not sum to`1`

, the`Benchmark Weight`

values are internally normalized so that they sum to`1`

and`brinsonAttribution`

displays a warning. If there is a cash position, you must account for it as an asset with its own weight so that the weights sum to`1`

.

**Note**

`AssetTable`

must be a table. Instead of specific
dates and times, the `Period`

column of
`AssetTable`

must have period numbers that
start with `1`

and have increments of one. The
multiperiod Brinson model assumes that all returns are for time
periods of equal intervals (for example, monthly, quarterly, and so
on).

**Data Types: **`table`

## Properties

`NumAssets`

— Total number of assets

numeric

Total number of assets, specified by
`AssetTable`

.

**Data Types: **`double`

`NumPortfolioAssets`

— Number of assets in portfolio

numeric

Number of assets in the portfolio, specified by
`AssetTable`

.

**Data Types: **`double`

`NumBenchmarkAssets`

— Number of assets in the benchmark

numeric

Number of assets in the benchmark, specified by
`AssetTable`

.

**Data Types: **`double`

`NumPeriods`

— Number of time periods

numeric

Number of time periods, specified by
`AssetTable`

.

**Data Types: **`double`

`NumCategories`

— Number of asset categories

numeric

Number of asset categories, specified by the
`AssetTable`

.

**Data Types: **`double`

`AssetName`

— Individual asset names

vector

Individual asset names, returned as a
`NumAssets`

-by-`1`

vector.

**Data Types: **`string`

`AssetReturn`

— Asset returns

matrix

Asset returns, returned as a
`NumAssets`

-by-`NumPeriods`

matrix in
decimals.

**Data Types: **`double`

`AssetCategory`

— Asset categories

matrix

Asset categories (sectors), returned as a
`NumAssets`

-by-`NumPeriods`

matrix.

**Data Types: **`string`

`PortfolioAssetWeight`

— Asset portfolio weights

numeric

Asset portfolio weights, returned as a
`NumAssets`

-by-`NumPeriods`

matrix in
decimals.

**Data Types: **`double`

`BenchmarkAssetWeight`

— Asset benchmark weights

numeric

Asset benchmark weights, returned as a
`NumAssets`

-by-`NumPeriods`

matrix in
decimals.

**Data Types: **`double`

`PortflioCategoryReturn`

— Portfolio category returns

numeric

Portfolio category returns, returned as a
`NumCategories`

-by-`NumPeriods`

matrix
in decimals.

**Data Types: **`double`

`BenchmarkCategoryReturn`

— Benchmark category returns

numeric

Benchmark category returns, returned as a
`NumCategories`

-by-`NumPeriods`

matrix
in decimals.

**Data Types: **`double`

`PortfolioCategoryWeight`

— Portfolio category weights

numeric

Portfolio category weights, returned as a
`NumCategories`

-by-`NumPeriods`

matrix
in decimals.

**Data Types: **`double`

`BenchmarkCategoryWeight`

— Benchmark category weights

numeric

Benchmark category weights, returned as a
`NumCategories`

-by-`NumPeriods`

matrix
in decimals.

**Data Types: **`double`

`PortfolioReturn`

— Total portfolio return

numeric

Total portfolio return, returned as a scalar decimal.

**Data Types: **`double`

`BenchmarkReturn`

— Total benchmark return

numeric

Total benchmark return, returned as a scalar decimal.

**Data Types: **`double`

`ActiveReturn`

— Total active return

numeric

Total active return, returned as a scalar decimal.

**Data Types: **`double`

## Object Functions

`categoryAttribution` | Compute performance attribution for portfolio of each category |

`categoryReturns` | Compute aggregate and periodic category returns |

`categoryWeights` | Compute average and periodic category weights |

`totalAttribution` | Compute total performance attribution by Brinson model |

`summary` | Summarize performance attribution by Brinson model |

`categoryReturnsChart` | Create horizontal bar chart of category returns |

`categoryWeightsChart` | Create a horizontal bar chart for category weights |

`attributionsChart` | Create horizontal bar chart of performance attribution |

## Examples

### Create `brinsonAttribution`

Object

This example shows how to create a `brinsonAttribution`

object that you can then use with the `categoryAttribution`

, `categoryReturns`

, `categoryWeights`

, `totalAttribution`

, and `summary`

functions. Also, you can generate plots for the results, using `categoryReturnsChart`

, `categoryWeightsChart`

, and `attributionsChart`

.

**Prepare Data**

Create a table for the monthly prices for four assets.

GM =[17.82;22.68;19.37;20.28]; HD = [39.79;39.12;40.67;40.96]; KO = [38.98;39.44;40.00;40.20]; PG = [56.38;57.08;57.76;55.54]; MonthlyPrices = table(GM,HD,KO,PG);

Use `tick2ret`

to define the monthly returns.

MonthlyReturns = tick2ret(MonthlyPrices.Variables)'; [NumAssets,NumPeriods] = size(MonthlyReturns);

Define the periods.

Period = ones(NumAssets*NumPeriods,1); for k = 1:NumPeriods Period(k*NumAssets+1:end,1) = Period(k*NumAssets,1) + 1; end

Define the categories (sectors) for the four assets.

Name = repmat(string(MonthlyPrices.Properties.VariableNames(:)),NumPeriods,1); Categories = repmat(categorical([ ... "Consumer Discretionary"; ... "Consumer Discretionary"; ... "Consumer Staples"; ... "Consumer Staples"]),NumPeriods,1);

Define benchmark and portfolio weights.

BenchmarkWeight = repmat(1./NumAssets.*ones(NumAssets, 1),NumPeriods,1); PortfolioWeight = repmat([1;0;1;1]./3,NumPeriods,1);

**Create AssetTable Input**

Create `AssetTable`

as the input for the `brinsonAttribution`

object.

AssetTable = table(Period, Name, ... MonthlyReturns(:), Categories, PortfolioWeight, BenchmarkWeight, ... VariableNames=["Period","Name","Return","Category","PortfolioWeight","BenchmarkWeight"])

`AssetTable=`*12×6 table*
Period Name Return Category PortfolioWeight BenchmarkWeight
______ ____ _________ ______________________ _______________ _______________
1 "GM" 0.27273 Consumer Discretionary 0.33333 0.25
1 "HD" -0.016838 Consumer Discretionary 0 0.25
1 "KO" 0.011801 Consumer Staples 0.33333 0.25
1 "PG" 0.012416 Consumer Staples 0.33333 0.25
2 "GM" -0.14594 Consumer Discretionary 0.33333 0.25
2 "HD" 0.039622 Consumer Discretionary 0 0.25
2 "KO" 0.014199 Consumer Staples 0.33333 0.25
2 "PG" 0.011913 Consumer Staples 0.33333 0.25
3 "GM" 0.04698 Consumer Discretionary 0.33333 0.25
3 "HD" 0.0071306 Consumer Discretionary 0 0.25
3 "KO" 0.005 Consumer Staples 0.33333 0.25
3 "PG" -0.038435 Consumer Staples 0.33333 0.25

**Create brinsonAttribution Object**

Use `brinsonAttribution`

to create the `brinsonAttribution`

object.

BrinsonPAobj = brinsonAttribution(AssetTable)

BrinsonPAobj = brinsonAttribution with properties: NumAssets: 4 NumPortfolioAssets: 3 NumBenchmarkAssets: 4 NumPeriods: 3 NumCategories: 2 AssetName: [4x1 string] AssetReturn: [4x3 double] AssetCategory: [4x3 categorical] PortfolioAssetWeight: [4x3 double] BenchmarkAssetWeight: [4x3 double] PortfolioCategoryReturn: [2x3 double] BenchmarkCategoryReturn: [2x3 double] PortfolioCategoryWeight: [2x3 double] BenchmarkCategoryWeight: [2x3 double] PortfolioReturn: 0.0598 BenchmarkReturn: 0.0540 ActiveReturn: 0.0059

You use `brinsonAttribution`

object with the `categoryAttribution`

, `categoryReturns`

, `categoryWeights`

, `totalAttribution`

, and `summary`

functions for the anlaysis. Also, you can generate plots for the results, using `categoryReturnsChart`

, `categoryWeightsChart`

, and `attributionsChart`

.

## More About

### Brinson Model

Performance attribution supports methods for single periods over relatively short time spans (monthly) and multiple periods compounded over longer time spans (quarterly or a yearly).

The Brinson single-period sector-based (category-based) performance attribution is represented as:

$$\begin{array}{l}{r}_{P,t}={\displaystyle \sum _{j=1}^{N}{w}_{Pj,t}{r}_{Pj,t}}\\ {r}_{B,t}={\displaystyle \sum _{j=1}^{N}{w}_{Bj,t}{r}_{Bj,t}}\\ {r}_{\upsilon ,t}={r}_{P,t}-{r}_{B,t}={\displaystyle \sum _{j=1}^{N}{w}_{Pj,t}{r}_{Pj,t}-}{\displaystyle \sum _{j=1}^{N}{w}_{Bj,t}{r}_{Bj,t}}\\ ={\displaystyle \sum _{j=1}^{N}({w}_{Pj,t}-{w}_{Bj,t})({r}_{Bj,t}-{r}_{B,t})+}{\displaystyle \sum _{j=1}^{N}({w}_{Pj,t}-{w}_{Bj,t})({r}_{Pj,t}-{r}_{Bj,t})}+{\displaystyle \sum _{j=1}^{N}{w}_{Bj,t}({r}_{Pj,t}-{r}_{Bj,t})}\\ ={\displaystyle \sum _{j=1}^{N}({S}_{j,t}+{U}_{j,t}+{I}_{j,t})}\end{array}$$

where

*r*_{P,t}
— Portfolio return for period *t*

*r*_{b,t}
— Benchmark return for period *t*

*r*_{υ,t}
— Value-added return for period *t*

*N* — Number of sectors

*w*_{Pj,t}
— Portfolio weight for sector *j* and period
*t*

*r*_{Pj,t}
— Portfolio return for sector *j* and period
*t*

*w*_{Bj,t}
— Benchmark weight for sector *j* and period
*t*

*r*_{Bj,t}
— Benchmark return for sector *j* and period
*t*

*S*_{j,t}
— Sector allocation effect for sector *j* and period
*t*

*U*_{j,t}
— Allocation and sector interaction effect for sector *j* and
period *t*

*I*_{j,t}
— Issue sector effect for sector *j* and period
*t*

Multiperiod performance attribution, uses two main styles of performance attribution: arithmetic and geometric. In the arithmetic performance attribution, which is the method that the Brinson model uses, the relative performance between the portfolio and benchmark is measured by subtracting the benchmark return from the portfolio return. In the geometric performance attribution, the relative performance between the portfolio and benchmark is measured by a ratio based on the portfolio and benchmark returns.

The optimized linking algorithm by Menchero [3] extends the single-period
arithmetic performance attribution to multiple periods by introducing the optimized
linking coefficient * β_{t}* for each period
before adding the single-period attributions. This step overcomes the fact that each
single-period attribution does not simply add over multiple periods, because the
optimized linking coefficient

*reconciles the difference that arises between simple arithmetic addition and geometric compounding. As a result, the single-period Brinson model can be extended to multiple periods by using the following optimized linking algorithm:*

*β*_{t}$$\begin{array}{l}{r}_{\upsilon}={r}_{p}-{r}_{B}={\displaystyle \sum _{t=1}^{T}{\beta}_{t}({r}_{P,t}-{r}_{B,t})=}{\displaystyle \sum _{j=1}^{N}\left({\displaystyle \sum _{t=1}^{T}{\beta}_{t}{S}_{j,t}+{\displaystyle \sum _{t=1}^{T}{\beta}_{t}{U}_{j,t}+{\displaystyle \sum _{t=1}^{T}{\beta}_{t}{I}_{j,t}}}}\right)={\displaystyle \sum _{j=1}^{N}({S}_{j}+{U}_{j}+{I}_{j})}}\\ {\beta}_{t}=A+C({r}_{p,t}-{r}_{B,t})\\ A=\frac{\frac{({r}_{p}-{r}_{B})}{T}}{{(1+{r}_{p})}^{\frac{1}{T}}-{(1+{r}_{B})}^{\frac{1}{T}}}\\ C=\frac{{r}_{p}-{r}_{B}-A{\displaystyle {\sum}_{t=1}^{T}({r}_{P,t}-{r}_{B,t})}}{{\displaystyle {\sum}_{t=1}^{T}{({r}_{P,t}-{r}_{B,t})}^{2}}}\end{array}$$

where

*r*_{p} — Portfolio return
over multiple periods

*r*_{B} — Benchmark return
over multiple periods

*r*_{υ} — Value-added
return over multiple periods

*r*_{P,t} — Portfolio
return for period *t*

*r*_{B,t} — Benchmark
return for period *t*

β_{t} — Optimized linking coefficient for
period *t*

*T* — Number of periods

*N* — Number of sectors

*S*_{j,t} — Sector
allocation effect for sector *j* and period
*t*

*U*_{j,t} — Allocation and
selection interaction effect for sector *j* and period
*t*

*I*_{j,t} — Issue
selection effect for sector *j* and period
*t*

*S*_{j,t}
— Sector allocation effect for sector *j* over multiple
periods

*U*_{j,t}
— Allocation and sector interaction effect for sector *j* over
multiple periods

*I*_{j,t}
— Issue sector effect for sector *j* over multiple periods

In Menchero's optimized linking algorithm shown above, the optimized linking
coefficient * β_{t}* is computed for each
period using

*,*

*r*_{P}*,*

*r*_{B}*,*

*r*_{P,t}*, and*

*r*_{B,t}*. This algorithm allows extending the Brinson model to multiple periods while achieving the resulting desirable properties that are similar to the geometric multiperiod performance attribution.*

*T*## References

[1] Brinson, G. P. and Fachler, N.
“Measuring Non-US Equity Portfolio Performance.” *Journal of Portfolio
Management.* Spring 1985: 73–76.

[2] Brinson, G. P., Hood, L. R.,
and Beebower, G. L. “Determinants of Portfolio Performance.” *Financial
Analysts Journal.* Vol. 42, No. 4, 1986: 39–44.

[3] Menchero, J. “Multiperiod
Arithmetic Attribution.” *Financial Analysts Journal.* Vol. 60, No.
4, 2004: 76–91.

[4] Tuttle, D. L., Pinto, J. E.,
and McLeavey, D. W. *Managing Investment Portfolios: A Dynamic
Process.* Third Edition. CFA Institute, 2007.

## Version History

**Introduced in R2022b**

### R2023a: Charting functions added for `brinsonAttribution`

object

Using a `brinsonAttribution`

object, you can use the following
charting functions: `categoryReturnsChart`

, `categoryWeightsChart`

, and `attributesChart`

.

## Open Example

You have a modified version of this example. Do you want to open this example with your edits?

## MATLAB Command

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

## How to Get Best Site Performance

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

### Americas

- América Latina (Español)
- Canada (English)
- United States (English)

### Europe

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)