Create `brinsonAttribution` object to analyze performance attribution

Since R2022b

## 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:

1. Prepare data for the `AssetTable` input.

2. Use `brinsonAttribution` to create a `brinsonAttribution` object.

3. Use the following functions with the `brinsonAttribution` object:

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

## Creation

### Syntax

``brinsonAttrubtionObj = brinsonAttribution(AssetTable)``

### Description

example

````brinsonAttrubtionObj = brinsonAttribution(AssetTable)` creates a `brinsonAttribution` object and sets the properties. Use the `brinsonAttribution` object with the `categoryAttribution`, `categoryReturns`, `categoryWeights`, `totalAttribution`, and `summary` functions.```

### Input Arguments

expand all

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

expand all

Total number of assets, specified by `AssetTable`.

Data Types: `double`

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

Data Types: `double`

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

Data Types: `double`

Number of time periods, specified by `AssetTable`.

Data Types: `double`

Number of asset categories, specified by the `AssetTable`.

Data Types: `double`

Individual asset names, returned as a `NumAssets`-by-`1` vector.

Data Types: `string`

Asset returns, returned as a `NumAssets`-by-`NumPeriods` matrix in decimals.

Data Types: `double`

Asset categories (sectors), returned as a `NumAssets`-by-`NumPeriods` matrix.

Data Types: `string`

Asset portfolio weights, returned as a `NumAssets`-by-`NumPeriods` matrix in decimals.

Data Types: `double`

Asset benchmark weights, returned as a `NumAssets`-by-`NumPeriods` matrix in decimals.

Data Types: `double`

Portfolio category returns, returned as a `NumCategories`-by-`NumPeriods` matrix in decimals.

Data Types: `double`

Benchmark category returns, returned as a `NumCategories`-by-`NumPeriods` matrix in decimals.

Data Types: `double`

Portfolio category weights, returned as a `NumCategories`-by-`NumPeriods` matrix in decimals.

Data Types: `double`

Benchmark category weights, returned as a `NumCategories`-by-`NumPeriods` matrix in decimals.

Data Types: `double`

Total portfolio return, returned as a scalar decimal.

Data Types: `double`

Total benchmark return, returned as a scalar decimal.

Data Types: `double`

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

collapse all

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`.

expand all

## 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

expand all