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 abrinsonAttribution
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 brinsonAttributionObj
= 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 timePeriod
numbers. For each one of theNumAssets
asset names, thePeriod
numbers range from 1 toNumPeriods
with increments of 1, so that there are a total ofNumAssets
-times-NumPeriods
rows. Row 1 is for the first period, row 2 is for the second period, and is repeated for each asset. If thePeriod
column is missing fromAssetTable
, allPeriod
numbers are internally set to1
and all asset returns inAssetTable
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 ofNumAssets
unique names, and the names are repeated for eachPeriod
.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 ofNumCategories
unique categories.Portfolio Weight
— Numeric vector containing the asset portfolio weights in decimals. The weights are internally normalized so that they sum to1
for eachPeriod
.Note
The values for
Portfolio Weight
must sum to1
for the Brinson model. If the weights do not sum to1
, thePortfolio Weight
values are internally normalized so that they sum to1
andbrinsonAttribution
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 to1
.Benchmark Weight
— Numeric vector containing the asset benchmark weights in decimals. The weights are internally normalized so that they sum to1
for eachPeriod
.Note
The values for the
Benchmark Weight
must sum to1
for the Brinson model. If the weights do not sum to1
, theBenchmark Weight
values are internally normalized so that they sum to1
andbrinsonAttribution
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 to1
.
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).
Each individual asset must belong to one and
only one category. You can apply Brinson attribution to any
portfolio containing assets with measured returns if each of the
individual asset belongs to one and only one category. Therefore,
you can include a bond or cash holding in the portfolio after
assigning it to its own category (for example,
"Bond"
or "Cash"
) and you
enter its measured returns and weights. If the portfolio's benchmark
does not have the bond or cash holding, then the benchmark weight
for that asset is 0
. As for an ETF, you can
decompose the ETF into its individual holdings (for example, about
100 stocks in QQQ) and then enter these stocks into the portfolio
with the associated measured returns, weights (relative to the
overall portfolio, not within the ETF) and associate each stock in
the ETF with a category.
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:
where
rP,t — Portfolio return for period t
rb,t — Benchmark return for period t
rυ,t — Value-added return for period t
N — Number of sectors
wPj,t — Portfolio weight for sector j and period t
rPj,t — Portfolio return for sector j and period t
wBj,t — Benchmark weight for sector j and period t
rBj,t — Benchmark return for sector j and period t
Sj,t — Sector allocation effect for sector j and period t
Uj,t — Allocation and sector interaction effect for sector j and period t
Ij,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 βt 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:
where
rp — Portfolio return over multiple periods
rB — Benchmark return over multiple periods
rυ — Value-added return over multiple periods
rP,t — Portfolio return for period t
rB,t — Benchmark return for period t
βt — Optimized linking coefficient for period t
T — Number of periods
N — Number of sectors
Sj,t — Sector allocation effect for sector j and period t
Uj,t — Allocation and selection interaction effect for sector j and period t
Ij,t — Issue selection effect for sector j and period t
Sj,t — Sector allocation effect for sector j over multiple periods
Uj,t — Allocation and sector interaction effect for sector j over multiple periods
Ij,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 rP, rB, rP,t, rB,t, and 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.
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 R2022bR2023a: Charting functions added for brinsonAttribution
object
Using a brinsonAttribution
object, you can use the following
charting functions: categoryReturnsChart
, categoryWeightsChart
, and attributesChart
.
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)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)