Up until the proliferation of the mean-variance analysis due to Markowitz, the typical advice offered by an investment advisor would entail some combination of the following ideas:

- Young investors should allocate a disproportionately large amount of their investable capital to risky securities within risky asset classes.

- Older investors should allocate a disproportionate amount of capital to less volatile securities within less risky asset classes.

While intuitively compelling and perhaps sensible as a first approximation, linking an individual’s asset allocation decision exclusively to his human capital in such a broad fashion is suboptimal. According to the **Two-fund separation theory**, a key result in Modern Portfolio Theory, the investment allocation problem can be decomposed into two elements :

**(1.) Finding the optimal portfolio of risky assets.**

- This amounts to finding a vector of weights associated with risky assets that maximise the risk adjusted return of the resulting portfolio. An important consideration here is the selection and use of an appropriate risk-adjusted performance measure.

*(2.) Finding the best combination of the risk free asset and the optimal risky portfolio.*

- Once the optimal risky portfolio has been determined, it can be combined with the risk free asset; with respective weights in each of these ‘funds’ subject to individual risk preferences, the total portfolio can be constructed.

**The most important implications of Modern Portfolio Theory can be summarised as follows.**

- Investors should control total portfolio risk by varying the amount of capital invested in the risk free asset and the optimal risky portfolio as opposed to changing the composition of the risky portfolio itself. The weight given to the either ‘fund’ depends on the individual’s risk aversion.

- The portfolio of risky assets should contain a large number of assets that are less than perfectly positively correlated (i.e. a well diversified portfolio)

It should be noted that most of the relevant results are derived under the assumptions that **either** [a] all returns are normally distributed **or** [b] investors care only about mean returns and variance of returns. Further assumptions require that all assets be tradable and no transaction costs are incurred when trades occur.

Before the **Two fund theorem** can be implemented, a theoretical framework for understanding the tradeoff between risk and return will be briefly sketched.

j

**[Utility Functions and Indifference curves]**

l

The standard utility function of choice is the power utility function, also known as constant relative risk aversion or the CRRA utility function.

Gamma, or the coefficient of risk aversion governs the curvature of the utility function and how resistant individuals are to taking risks. It can be shown that the utility an investor derives from a pattern of returns amounts to

with **A** representing the risk aversion parameter. If assets can be thought of as providing a benefit (returns) at a cost (risk), then a simple way to visualise the tradeoff can be attained using Indifference curves. To illustrate these and other issues of this post, the following two helper functions,*utility.contours* and *contours.plot* were written.

############################################################################# # # Contour Plotting # ############################################################################# contours.plot <- function(type,expected.ret,risky.var,num.assets,risk.free,risk.aversion,total.risk){ opt.risky.alloc <- (expected.ret-risk.free)/(risk.aversion* risky.var) opt.riskfree.alloc <- (1-opt.risky.alloc) opt.port.ret <- risk.free+opt.risky.alloc*(expected.ret-risk.free) opt.port.risk <- (opt.risky.alloc^2)*risky.var opt.utility <- opt.port.ret-(0.5*risk.aversion*opt.port.risk) contours <- vector('list',num.assets) for(i in 1:num.assets){ contours[[i]]$optimal.utility <- opt.utility[i] contours[[i]]$returns <- opt.utility[i]+(0.5*risk.aversion*total.risk) contours[[i]]$risk <- sqrt(total.risk) } s.contours <- vector('list',5) u.contours <- vector('list',5) for(i in 1:5){ s.contours[[i]]$optimal.utility <- opt.utility[1] s.contours[[i]]$returns <- opt.utility[1]+(0.5*i*total.risk) s.contours[[i]]$risk <- sqrt(total.risk) u.contours[[i]]$optimal.utility <- i u.contours[[i]]$returns <- opt.utility[1]+i/5+(0.5*risk.aversion*total.risk) u.contours[[i]]$risk <- sqrt(total.risk) } col.indiff <- colorRampPalette(brewer.pal(9,"Blues"))(100) ind <- 100 if(type=='Sample'){ windows() par(mfrow=c(2,1),mar=c(1.5,4,3,1.5)) plot(main='Indifference Curves',cex.main=0.85,cex.lab=0.75,cex.axis=0.75,ylab='Expected Return',xlab='Risk',x=s.contours[[1]]$risk,y=s.contours[[1]]$returns,type='line',col=col.indiff[ind],lty=2,lwd=2) for(i in 2:5){ lines(main='Indifference Curves',cex.main=0.85,cex.lab=0.75,cex.axis=0.75,ylab='Expected Return',xlab='Risk',x=s.contours[[i]]$risk,y=s.contours[[i]]$returns,type='line',col=col.indiff[ind-i*5],lty=2,lwd=2) } legend(title='Utility constant',y.intersp=0.8,adj=0,'bottomright',horiz=F,fill=c(col.indiff[ind],col.indiff[ind-2*5],col.indiff[ind-3*5],col.indiff[ind-4*5],col.indiff[ind-5*5]),legend=c(paste('Risk Aversion: ',1:5)),ncol=1,bg='white',bty='n',border='black',cex=0.70) par(mar=c(4,4,1,1.5)) plot(cex.main=0.85,cex.lab=0.75,cex.axis=0.75,ylab='Expected Return',xlab='Risk',x=u.contours[[1]]$risk,y=u.contours[[1]]$returns,type='line',col=col.indiff[ind],lty=2,lwd=2) for(i in 2:5){ lines(main='Indifference Curves',cex.main=0.85,cex.lab=0.75,cex.axis=0.75,ylab='Expected Return',xlab='Risk',x=u.contours[[i]]$risk,y=u.contours[[i]]$returns,type='line',col=col.indiff[ind-i*5],lty=2,lwd=2) } legend(title='Risk aversion constant',y.intersp=0.8,adj=0,'bottomright',horiz=F,fill=c(col.indiff[ind],col.indiff[ind-2*5],col.indiff[ind-3*5],col.indiff[ind-4*5],col.indiff[ind-5*5]),legend=c(paste('Utility: ',1:5)),ncol=1,bg='white',bty='n',border='black',cex=0.70) } else if(type=='Optimal'){ lines(cex.main=0.85,cex.lab=0.75,cex.axis=0.75,ylab='Expected Return',xlab='Risk',x=contours[[1]]$risk,y=contours[[1]]$returns,type='line',col='dark orange',lty=2,lwd=2) points(x=sqrt(opt.port.risk),opt.port.ret,pch=8,col='black') for(i in 1:5){ lines(x=u.contours[[i]]$risk,y=u.contours[[i]]$returns,type='line',col=col.indiff[ind-i*5],lty=2,lwd=2) } } }

############################################################################## # # Utility Contours # ############################################################################# utility.contours <- function(type,risky.assets,risk.aversion,optimised.portfolio){ risk.free <- risky.assets[[4]] total.risk <- seq(0,2,by=0.01)^2 if(type=='Assets'){ expected.ret <- risky.assets[[5]] risky.var <- risky.assets[[3]]^2 num.assets <- length(risky.var) contours.plot(type='Optimal',expected.ret,risky.var,num.assets,risk.free,risk.aversion,total.risk) } else if(type=='Sharpe'){ expected.ret <- optimised.portfolio[[4]][1] risky.var <- (optimised.portfolio[[4]][2])^2 num.assets <- 1 contours.plot(type='Optimal',expected.ret,risky.var,num.assets,risk.free,risk.aversion,total.risk) } else if(type=='Indifference Sample'){ sim <- simulate.assets(1) expected.ret <- sim[[5]] risky.var <- sim[[3]]^2 risk.free.smpl <- sim[[4]] num.assets <- 1 risk.aversion.smpl <- 1 contours.plot(type='Sample',expected.ret,risky.var,num.assets,risk.free.smpl,risk.aversion.smpl,total.risk) } else if(type=='CRRA'){ consumption <- seq(0,3,by=0.01) gamma <- c(0.7,0.5,0.2) util <- matrix(nrow=length(consumption),ncol=length(gamma),c(rep(0,length(consumption)*length(gamma))),byrow=FALSE) marginal.util <- matrix(nrow=length(consumption),ncol=length(gamma),c(rep(0,length(consumption)*length(gamma))),byrow=FALSE) for(i in 1:length(gamma)){ util[,i] <- (consumption^(1-gamma[i]))/(1-gamma[i]) marginal.util[,i] <- consumption^(-gamma[i]) } colnames(util) <- paste('Gamma',1:length(gamma)) colnames(marginal.util) <- paste ('Gamma',1:length(gamma)) colours <- colorRampPalette(brewer.pal(9,"Blues"))(100) col.index <- 100 windows() par(mfrow=c(2,1),mar=c(2,2,3,2)) plot(cex.axis=0.75,lwd=2,x=consumption,util[,1],type='line',col=colours[col.index],main='Constant Relative Risk Aversion - Utility function',cex.main=0.85,cex.lab=0.75,ylab='') for(i in 2:length(gamma)){ lines(lwd=3,x=consumption,util[,i],col=colours[col.index-(i*10)]) } par(mar=c(3,2,1,2)) plot(cex.axis=0.75,ylim=c(-3,3),lwd=2,x=consumption,marginal.util[,1],type='line',col=colours[col.index],main='Constant Relative Risk Aversion - Marginal Utility function',cex.main=0.85,cex.lab=0.75,ylab='') for(i in 2:length(gamma)){ lines(lwd=2,x=consumption,marginal.util[,i],col=colours[col.index-(i*10)]) } legend(horiz=TRUE,title='Gamma',"bottom",fill=c(colours[col.index],colours[col.index-20],colours[col.index-30]),legend=gamma[1:3],bg='white',bty='n',border='white',cex=0.75) } }

To Implement these functions :

############################################################## # # Implementations # ############################################################## #Utility Contours utility.contours(type='CRRA',risky.assets=NULL,risk.aversion=NULL,optimised.portfolio=NULL) utility.contours(type='Indifference Sample',risky.assets=NULL,risk.aversion=0.5,optimised.portfolio=NULL)

The plots above illustrate the CRRA utility function as well as its first derivative (or marginal utility function). The greater the risk aversion coefficient ,gamma, the greater the curvature of the utility function, the more risk averse an individual, the larger the amount of money (the certainty equivalent) required to make that individual indifferent between receiving a particular money amount with perfect certainty and obtaining that amount as an expectation of a gamble. The slope of the utility curve,as depicted in the bottom plot as the first derivative of the preceding function , suggests that the additional utility derived from an extra unit of wealth declines as the amount or level of wealth increases. While utility derived increases with wealth, the rate at which an additional unit of wealth promotes greater utility decreases over rising wealth.

The first plot depicts the effect on indifference curves of varying the risk aversion parameter while holding utility constant. The converse is true for the second plot, in which the risk aversion parameter is held constant across varying degrees of utility while indifference curves are charted. True to its name, an indifference curve connects all combinations of (in this case) risk and return which yield the same utility. With respect to the first plot, the greater the risk aversion of an individual, the greater the expected return required for a given level of risk before the specified level of utility can be reached. With respect to the second plot, northwesterly movements of the contour signify combinations of risk and return that yield greater utility. Intuitively, when risk aversion and risk are held constant, the asset that provides greater expected returns would command greater utility. An investor, who regards assets as bundles of risks and returns, would wish to hold a portfolio of assets that are located on the highest possible indifference curve for a given aversion to risk.