Max Decorrelation Portfolio

Its been almost almost two months since I posted. Finishing the school year off with exams and moving twice forced me to put the blog on hold. I hope to post more in the future!

Today I humbly attempt to formulate in R the maximum decorrelation algorithm in constructing portfolios. This method was formulated by Peter Christoffersen et al.  (a fellow Canadian at Rotman School of Management) and presented by EDHEC in a paper called: “Scientific Beta Maximum Decorrelation Indices“. For those interested in asset allocation and risk management, EDHEC has a treasure trove of papers and research.

In traditional mean variance optimization, we are minimizing the portfolio risk given estimations of the covariance matrix. More specifically, we need to estimate both volatility and correlation which are used to construct the covariance. The objective function to minimize is:


The problem with portfolio optimization models is that we are making forecasts about future covariance structures. As it is unlikely they will hold in the future, what may be optimal today may not be optimal in the next period. This is what most practitioners term as “estimation error”.  Over the years, there has been different ways to overcome this. Methods ranging from covariance shrinkage to re-sampled efficient frontiers are most widely known. Some have instead scrapped the entire optimization process and focused on simple heuristics algorithms in estimating optimal portfolio weights.

The Maximum Decorrelation portfolio attempts to reduce the number of inputs and use solely the correlation matrix as its main input assumption. Instead of focusing on volatility, the strategy assumes that individual asset volatility are identical. The object function to maximize is therefore:


The idea is that there is less stuff to estimate which should mean estimation error should be lower.

In R, the objective function becomes:

max.decorr<-function(weight, correl){
    weight <- weight / sum(weight)
    obj<-1- (t(weight) %*% correl %*% weight)

I am using R’s optim function. This is my first time formulating the objective function from scratch. While I am 90% sure I am correct, I am but a student and am all ears if there are any mistakes and errors (or more efficient way of implementing it). Please leave comments below : ).

I took the algorithm for a test drive and below are the results for the standard 10 asset class.

equity SideBySide WeightTransition MonthlyTable inTimePie

For benchmark purposes, I have used minimum variance and equal weight portfolios. The Max Decor strategy earned higher returns but with higher volatility, hence the lower sharpe compared to Min Var.

Code can be found here: Dropbox


Thanks for reading,



    1. Treat it as 100%. The exposure calculation takes in to account the priming days which is 250 days. These priming days are the rolling lookbacks used to estimate the input assumptions.

      Note this backtest was for illustrative/comparative purposes only. For a more accurate backtest, one will need customize and properly account for the specific lag.

  1. Thank you for the nice analysis. Just to clarify, do “rolling lookbacks” mean that your allocations adjust over time? If so, do the allocations adjust continuously or periodically? Also, how do you select the lookback time? Thanks!

    1. Hi David,

      I am assuming you are referring to the lookback that goes into the optimizer. The number I used was arbitrarily set to be 250 days I think. You can set it to anything you want but I urge you to have at least a year to properly estimate the parameters as shorter term intervals may not be representative.

      And yes the allocations vary over time as you can see from the allocations over time chart.


  2. Hi Mike, thank you for the interesting analysis and R code. I’d like to see the evolution of diversification benefits over time (i.e. obj<-1- (t(weight) %*% correl %*% weight)) but I'm not very familiar with R function. How can I get that from your function? Thanks again!

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s