Main Content

brinsonAttribution

Create brinsonAttribution object to analyze performance attribution

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

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

categoryAttributionCompute performance attribution for portfolio of each category
categoryReturnsCompute aggregate and periodic category returns
categoryWeightsCompute average and periodic category weights
totalAttributionCompute total performance attribution by Brinson model
summarySummarize performance attribution by Brinson model

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.

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

More About

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