# 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)
return(-obj)
}


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.

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

Mike

1. tstudent2012 says:

Why exposure is 83.85? And same number for all three models?

1. Systematic Edge says:

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.

2. steve says:

just curious, what if the optimizing function was
min w’ p w instead of max 1- w’ p w?

3. David Smith says:

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. Systematic Edge says:

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.

Mike

4. Tristan says:

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!