Path: blob/master/sandbox/riskbudgetpaper(superseded)/R_Allocation/EfficientFrontier_MakePlots.R
1433 views
# Paper: Portfolio Optimization with Conditional Value-at-Risk Budgets1# Boudt, Carl, Peterson (2010)2# This R script serves to make the exhibits regarding the four asset efficient frontier34setwd("c:/Documents and Settings/Administrator/Desktop/risk budget programs")56cAssets = 4; p = priskbudget = 0.95;7mincriterion = "mES" ; percriskcontribcriterion = "mES";89# Load programs1011source("R_Allocation/Risk_budget_functions.R");12library(zoo); library(fGarch); library("PerformanceAnalytics"); library("PortfolioAnalytics")13clean = TRUE1415# Load the data16firstyear = 1976 ; firstquarter = 1; lastyear = 2010; lastquarter = 2;17data = read.table( file= paste("data/","/data.txt",sep="") ,header=T)18date = as.Date(data[,1],format="%Y-%m-%d")1920monthlyR = zoo( data[,2:(1+cAssets)] , order.by = date )21if(clean){ monthlyR = clean.boudt2(monthlyR,alpha=0.05)[[1]] }2223mu = apply(monthlyR,2,'mean')24sigma = cov(monthlyR)25M3 = PerformanceAnalytics:::M3.MM(monthlyR)26M4 = PerformanceAnalytics:::M4.MM(monthlyR)2728# Summary stats individual assets29apply(monthlyR,2,'mean')*1230apply(monthlyR,2,'sd')31apply(monthlyR,2,'skewness')32apply(monthlyR,2,'kurtosis')33ES(monthlyR[,1],method="modified"); ES(monthlyR[,2],method="modified")34ES(monthlyR[,3],method="modified"); ES(monthlyR[,4],method="modified")3536#################################################################################37# Make Exhibit 3 Risk budget paper: Efficient frontier plot38#################################################################################3940# Layout 341source("R_interpretation/chart.StackedBar.R");4243mESfun = function( series ){ return( operMES( series , alpha = 0.05 , r = 2 ) ) }44assetmu = apply( monthlyR , 2 , 'mean' )45assetCVaR = apply( monthlyR , 2 , 'mESfun' )46minmu = min(assetmu); maxmu = max(assetmu); print(minmu*12); print(maxmu*12);4748# Load the data4950labelnames = c( "US bond" , "S&P 500" , "EAFE" , "GSCI" )5152clean = TRUE53if(clean){54# Portfolio weights55W_MCC = read.csv( file = "EffFrontierMinCVaRConc_weights_clean.csv" )[,2:(1+cAssets)]56W_minCVaR = read.csv( file = "EffFrontierMinCVaR_weights_clean.csv" )[,2:(1+cAssets)]57W_minVar = read.csv( file = "EffFrontierMinVar_weights_clean.csv" )[,2:(1+cAssets)]58# Percentage CVaR contributions59PercCVaR_MCC = read.csv( file = "EffFrontierMinCVaRConc_percrisk_clean.csv" )[,2:(1+cAssets)]60PercCVaR_minCVaR = read.csv( file = "EffFrontierMinCVaR_percrisk_clean.csv" )[,2:(1+cAssets)]61PercCVaR_minVar = read.csv( file = "EffFrontierMinVar_percrisk_clean.csv" )[,2:(1+cAssets)]62# Summary stats63EffFrontier_stats_MCC = read.csv(file = "EffFrontierMinCVaRConc_stats_clean.csv")[,2:5]64EffFrontier_stats_minVar = read.csv(file = "EffFrontierMinVar_stats_clean.csv")[,2:5]65EffFrontier_stats_minCVaR = read.csv(file = "EffFrontierMinCVar_stats_clean.csv")[,2:5]66}else{67# Portfolio weights68W_MCC = read.csv(file = "EffFrontierMinCVaRConc_weights.csv")[,2:(1+cAssets)]69W_minCVaR = read.csv(file = "EffFrontierMinCVaR_weights.csv")[,2:(1+cAssets)]70W_minVar = read.csv(file = "EffFrontierMinVar_weights.csv")[,2:(1+cAssets)]71# Percentage CVaR contributions72mPercrisk_MCC = read.csv( file = "EffFrontierMinCVaRConc_percrisk.csv" )[,2:(1+cAssets)]73mPercrisk_minCVaR = read.csv( file = "EffFrontierMinCVaR_percrisk.csv" )[,2:(1+cAssets)]74mPercrisk_minVar = read.csv(file = "EffFrontierMinVar_percrisk.csv")[,2:(1+cAssets)]75# Summary stats76EffFrontier_stats_MCC = read.csv(file = "EffFrontierMinCVaRConc_stats.csv")[,2:5]77EffFrontier_stats_minVar = read.csv(file = "EffFrontierMinVar_stats.csv")[,2:5]78EffFrontier_stats_minCVaR = read.csv(file = "EffFrontierMinCVar_stats.csv")[,2:5]79}8081vmu_MCC = EffFrontier_stats_MCC[,1] ; vmu_minCVaR = EffFrontier_stats_minCVaR[,1] ; vmu_minVar = EffFrontier_stats_minVar[,1] ;82vrisk_MCC = EffFrontier_stats_MCC[,2] ; vrisk_minCVaR = EffFrontier_stats_minCVaR[,2] ; vrisk_minVar = EffFrontier_stats_minVar[,2] ;83vmaxpercrisk_MCC = EffFrontier_stats_MCC[,3] ; vmaxpercrisk_minCVaR = EffFrontier_stats_minCVaR[,3] ;84vriskconc_MCC = EffFrontier_stats_MCC[,4] ; vriskconc_minCVaR = EffFrontier_stats_minCVaR[,4] ; vriskconc_minVar = EffFrontier_stats_minVar[,4] ;8586# The MCC and Min CVaR were obtained with DEoptim. The solutions are not always optimal. Correct for this:8788order_MCC = sort(vmu_MCC,index.return=T)$ix ; order_minCVaR = sort(vmu_minCVaR,index.return=T)$ix89vmu_MCC = vmu_MCC[order_MCC] ; vmu_minCVaR = vmu_minCVaR[order_minCVaR]90vrisk_MCC = vrisk_MCC[order_MCC] ; vrisk_minCVaR = vrisk_minCVaR[order_minCVaR]91vmaxpercrisk_MCC = vmaxpercrisk_MCC[order_MCC] ; vmaxpercrisk_minCVaR = vmaxpercrisk_MCC[order_minCVaR]92vriskconc_MCC = vriskconc_MCC[order_MCC] ; vriskconc_minCVaR = vriskconc_minCVaR[order_minCVaR]93W_MCC = W_MCC[order_MCC,] ; W_minCVaR = W_minCVaR[order_minCVaR,]94PercCVaR_MCC = PercCVaR_MCC[order_MCC,] ; PercCVaR_minCVaR = PercCVaR_minCVaR[order_minCVaR,]9596# eliminate duplicates in mu97# Determines which elements of a vector or data frame are duplicates of elements with smaller subscripts,98# and returns a logical vector indicating which elements (rows) are duplicates.99a_MCC = duplicated(vmu_MCC) ; a_minCVaR = duplicated(vmu_minCVaR)100vmu_MCC = vmu_MCC[!a_MCC] ; vmu_minCVaR = vmu_minCVaR[!a_minCVaR]101vrisk_MCC = vrisk_MCC[!a_MCC] ; vrisk_minCVaR = vrisk_minCVaR[!a_minCVaR]102vmaxpercrisk_MCC = vmaxpercrisk_MCC[!a_MCC] ; vmaxpercrisk_minCVaR = vmaxpercrisk_minCVaR[!a_minCVaR]103vriskconc_MCC = vriskconc_MCC[!a_MCC] ; vriskconc_minCVaR = vriskconc_minCVaR[!a_minCVaR]104W_MCC = W_MCC[!a_MCC,] ; W_minCVaR = W_minCVaR[!a_minCVaR,]105PercCVaR_MCC = PercCVaR_MCC[!a_MCC,] ; PercCVaR_minCVaR = PercCVaR_minCVaR[!a_minCVaR,]106107# eliminate (efficiency: lower mu, higher CVaR alloc108109sel_MCC = sel_minCVaR = c(); nmu_MCC = length(vmu_MCC); nmu_minCVaR = length(vmu_minCVaR);110for( i in 1:(nmu_MCC-1) ){111if( any(vriskconc_MCC[(i+1):nmu_MCC]<=vriskconc_MCC[i]) ){ }else{sel_MCC = c(sel_MCC, i) }112}113for( i in 1:(nmu_minCVaR-1) ){114if( any(vrisk_minCVaR[(i+1):nmu_minCVaR]<=vrisk_minCVaR[i]) ){ }else{sel_minCVaR = c(sel_minCVaR, i) }115}116vmu_MCC = vmu_MCC[sel_MCC] ; vmu_minCVaR = vmu_minCVaR[sel_minCVaR]117vrisk_MCC = vrisk_MCC[sel_MCC] ; vrisk_minCVaR = vrisk_minCVaR[sel_minCVaR]118vmaxpercrisk_MCC = vmaxpercrisk_MCC[sel_MCC] ; vmaxpercrisk_minCVaR = vmaxpercrisk_minCVaR[sel_minCVaR]119vriskconc_MCC = vriskconc_MCC[sel_MCC] ; vriskconc_minCVaR = vriskconc_minCVaR[sel_minCVaR]120W_MCC = W_MCC[sel_MCC,] ; W_minCVaR = W_minCVaR[sel_minCVaR,]121PercCVaR_MCC = PercCVaR_MCC[sel_MCC,] ; PercCVaR_minCVaR = PercCVaR_minCVaR[sel_minCVaR,]122123wEW <- rep(1/4,4)124muEW = mean(assetmu*12)125outES = ES(weights=wEW, portfolio_method="component", mu = mu, sigma = sigma, m3=M3, m4=M4,invert=FALSE)126riskEW = outES$MES; riskconcEW = max(outES$contribution)127128postscript('frontier_fourassets.eps')129130layout( matrix( c(1,2,3,1,2,3), ncol = 2 ) , height= c(5,5,1), width=c(1,1) )131ylim = c( min(assetmu) , max(assetmu) )132par( mar = c(4.5,5,2,2), las=1 ,cex=0.9 , cex.axis=0.9, cex.main=0.95)133plot( vrisk_MCC , vmu_MCC*12 , type="l", lty = 1, main = "" ,134ylab="Annualized mean return" , xlab="Monthly 95% Portfolio CVaR" ,135lwd=2, xlim = c(0.01,0.13) , ylim = (ylim*12+c(0,0.01)) , col="black" )136lines( vrisk_minCVaR , vmu_minCVaR*12, lty = 1, lwd=2, col="darkgray" )137lines( vrisk_minVar , vmu_minVar*12, lty = 3, lwd=2, col="black" )138139c = 1; text(y=assetmu[c]*12,x= assetCVaR[c]-0.005 , label=labelnames[c] , cex = 0.7, offset = 0.2, pos = 3); points(y=assetmu[c]*12,x= assetCVaR[c] )140for( c in 2:cAssets ){141text(y=assetmu[c]*12,x= assetCVaR[c] , label=labelnames[c] , cex = 0.7, offset = 0.2, pos = 3)142points(y=assetmu[c]*12,x= assetCVaR[c] )143};144# Plot also EW portfolio145text(y=muEW,x=riskEW, label="EW" , cex = 0.7, offset = 0.2, pos = 3)146points(y=muEW,x= riskEW , pch=22 )147text(y=vmu_MCC[1]*12,x=vrisk_MCC[1], label="MCC=ERC" , cex = 0.7, offset = 0.2, pos = 1)148points(y=vmu_MCC[1]*12,x=vrisk_MCC[1], pch=22 )149text(y=vmu_minCVaR[1]*12,x=vrisk_minCVaR[1]-0.0035, label="Min CVaR" , cex = 0.7, offset = 0.2, pos = 1)150points(y=vmu_minCVaR[1]*12,x=vrisk_minCVaR[1], pch=22 )151text(y=vmu_minVar[1]*12-0.001,x=vrisk_minVar[1]+0.0035, label="Min StdDev" , cex = 0.7, offset = 0.2, pos = 1)152points(y=vmu_minVar[1]*12,x=vrisk_minVar[1], pch=22 )153154par( mar = c(4.5,5,2,2), las=1 ,cex=0.9 , cex.axis=0.9, cex.main=0.95)155plot( vriskconc_MCC/vrisk_MCC , vmu_MCC*12 , type="l", lty = 1, main = "" ,156ylab="Annualized mean return" , xlab="Largest Perc. CVaR contribution" ,157lwd=2, xlim = c(0.2,1.1), ylim = c(ylim*12+c(0,0.01)) , col="black" )158lines( vriskconc_minCVaR/vrisk_minCVaR , vmu_minCVaR*12, lty = 1, lwd=2, col="darkgray" )159lines( vriskconc_minVar/vrisk_minVar , vmu_minVar*12 , lty = 3, lwd=2, col="black" )160161text(y=muEW,x=riskconcEW/riskEW, label="EW" , cex = 0.7, offset = 0.2, pos = 1)162points(y=muEW,x= riskconcEW/riskEW , pch=22 )163text(y=vmu_MCC[1]*12,x=vriskconc_MCC[1]/vrisk_MCC[1], label="MCC=ERC" , cex = 0.7, offset = 0.2, pos = 1)164points(y=vmu_MCC[1]*12,x=vriskconc_MCC[1]/vrisk_MCC[1], pch=22 )165text(y=vmu_minCVaR[1]*12,x=vriskconc_minCVaR[1]/vrisk_minCVaR[1], label="Min CVaR" , cex = 0.7, offset = 0.2, pos = 1)166points(y=vmu_minCVaR[1]*12,x=vriskconc_minCVaR[1]/vrisk_minCVaR[1], pch=22 )167text(y=vmu_minVar[1]*12,x=vriskconc_minVar[1]/vrisk_minVar[1], label="Min StdDev" , cex = 0.7, offset = 0.2, pos = 1)168points(y=vmu_minVar[1]*12,x=vriskconc_minVar[1]/vrisk_minVar[1], pch=22 )169170for( c in 1:cAssets ){171text(y=assetmu[c]*12,x= 1 , label=labelnames[c] , cex = 0.7, offset = 0.2, pos = 4)172points(y=assetmu[c]*12,x= 1 )173};174175par( mar = c(0,1,1,0) )176plot.new()177legend("center",legend=c("Mean-CVaR concentration", "Mean-CVaR","Mean-StdDev" ),178lty=c("solid","solid","dashed"), cex=0.8,ncol=3,lwd=c(4,4,2),col=c("black","darkgray","black"))179180dev.off()181182183# Make the weight/CVaR allocation plots184#---------------------------------------185186Wsel_MCC = PercCVaRsel_MCC = Wsel_minCVaR = PercCVaRsel_minCVaR = Wsel_minVar = PercCVaRsel_minVar = c();187vmusel_MCC = vrisksel_MCC = vriskconcsel_MCC = vmusel_minCVaR = vrisksel_minCVaR = vriskconcsel_minCVaR = vmusel_minVar = vrisksel_minVar = vriskconcsel_minVar = c();188lm = minmu = min( c(vmu_MCC,vmu_minCVaR) ) ; maxmu = max( c(vmu_MCC,vmu_minCVaR) );189ylim = c( min(assetmu) - 0.0003 , max(assetmu) + 0.0003 )190xlim = c( 0 , max(assetCVaR) + 0.01 )191192binning = T # for the weight plots, binned data such that no visual misinterpretation is possible193step = quantile( diff(vmu_MCC) , 0.1 )194if( binning ){195for( rm in seq( minmu+step , maxmu , step ) ){196selection = c(vmu_MCC >= lm & vmu_MCC < rm) ;197if( any(selection) ){198selection = c(1:length(selection))[selection]199selone = sort(vriskconc_MCC[ selection ],index.return=T)$ix[1]200selone = selection[selone]201vmusel_MCC = c( vmusel_MCC , mean(vmu_MCC[selone ] ));202Wsel_MCC = rbind( Wsel_MCC , apply( W_MCC[selone,] ,2,'mean' ))203PercCVaRsel_MCC = rbind( PercCVaRsel_MCC , apply( PercCVaR_MCC[selone,] ,2,'mean' ))204vrisksel_MCC = c( vrisksel_MCC , mean(vrisk_MCC[ selone ]) );205vriskconcsel_MCC = c( vriskconcsel_MCC , mean(vriskconc_MCC[ selone ]) )206}else{207vmusel_MCC = c( vmusel_MCC , NA );208Wsel_MCC = rbind( Wsel_MCC , rep(NA,cAssets) )209PercCVaRsel_MCC = rbind( PercCVaRsel_MCC , rep(NA,cAssets) )210vrisksel_MCC = c( vrisksel_MCC , NA );211vriskconcsel_MCC = c( vriskconcsel_MCC , NA )212}213selection = c(vmu_minCVaR >= lm & vmu_minCVaR < rm) ;214if( any(selection) ){215selection = c(1:length(selection))[selection]; selone = sort(vrisk_minCVaR[ selection ],index.return=T)$ix[1]216selone = selection[selone]217vmusel_minCVaR = c( vmusel_minCVaR , mean(vmu_minCVaR[selone ] ));218Wsel_minCVaR = rbind( Wsel_minCVaR , apply( W_minCVaR[selone,] ,2,'mean' ))219PercCVaRsel_minCVaR = rbind( PercCVaRsel_minCVaR , apply( PercCVaR_minCVaR[selone,] ,2,'mean' ))220vrisksel_minCVaR = c( vrisksel_minCVaR , mean(vrisk_minCVaR[ selone ]) );221vriskconcsel_minCVaR = c( vriskconcsel_minCVaR , mean(vriskconc_minCVaR[ selone ]) )222}else{223vmusel_minCVaR = c( vmusel_minCVaR , NA );224Wsel_minCVaR = rbind( Wsel_minCVaR , rep(NA,cAssets) )225PercCVaRsel_minCVaR = rbind( PercCVaRsel_minCVaR , rep(NA,cAssets) )226vrisksel_minCVaR = c( vrisksel_minCVaR , NA );227vriskconcsel_minCVaR = c( vriskconcsel_minCVaR , NA )228}229selection = c(vmu_minVar >= lm & vmu_minVar < rm) ;230if( any(selection) ){231selection = c(1:length(selection))[selection]; selone = sort(vrisk_minVar[ selection ],index.return=T)$ix[1]232selone = selection[selone]233vmusel_minVar = c( vmusel_minVar , mean(vmu_minVar[selone ] ));234Wsel_minVar = rbind( Wsel_minVar , apply( W_minVar[selone,] ,2,'mean' ))235PercCVaRsel_minVar = rbind( PercCVaRsel_minVar , apply( PercCVaR_minVar[selone,] ,2,'mean' ))236vrisksel_minVar = c( vrisksel_minVar , mean(vrisk_minVar[ selone ]) );237vriskconcsel_minVar = c( vriskconcsel_minVar , mean(vriskconc_minVar[ selone ]) )238}else{239vmusel_minVar = c( vmusel_minVar , NA );240Wsel_minVar = rbind( Wsel_minVar , rep(NA,cAssets) )241PercCVaRsel_minVar = rbind( PercCVaRsel_minVar , rep(NA,cAssets) )242vrisksel_minVar = c( vrisksel_minVar , NA );243vriskconcsel_minVar = c( vriskconcsel_minVar , NA )244}245lm = rm;246}247}else{248vmusel_MCC = vmu_MCC ; vmusel_minCVaR = vmu_minCVaR249Wsel_MCC = W_MCC ; Wsel_minCVaR = W_minCVaR ;250vrisksel_MCC = vrisk_MCC ; vrisksel_minCVaR = vrisk_minCVaR251vriskconcsel_MCC = vriskconc_MCC ; vriskconcsel_minCVar = vriskconc_minCVaR252PercCVaRsel_MCC = PercCVaR_MCC ; PercCVaRsel_minCVar = PercCVaR_minCVar ;253}254255library(zoo)256cAssets = ncol(monthlyR)257colorset = gray( seq(0,(cAssets-1),1)/cAssets ) ;258colnames( Wsel_MCC ) = colnames( Wsel_minCVaR ) = labelnames259rownames( Wsel_MCC ) = rownames( PercCVaRsel_MCC ) = round( interpNA(vmusel_MCC)*12,4);260rownames( Wsel_minCVaR ) = rownames( PercCVaRsel_minCVaR ) = round( interpNA(vmusel_minCVaR)*12,4) ;261262rownames( Wsel_minVar ) = rownames( PercCVaRsel_minVar ) = round( interpNA(vmusel_minVar)*12,4) ;263colnames( Wsel_minVar ) = labelnames264265266w.names = c( "US bond" , "S&P 500", "EAFE" , "GSCI" )267namelabels = c("Mean-StdDev" , "Mean-CVaR","Mean-CVaR concentration" )268l = 2 ; mar1 =c(2,l,2,1.1) ; mar3 = c(3,l+1,3,0.1)269270source("R_interpretation/chart.StackedBar.R");271272# Stacked weights plot:273postscript('stackedweightsriskcont_efficientfrontier_withNA.eps')274layout( matrix( c(1,2,3,4,5,6,7,4), ncol = 2 ) , height= c(1.5,1.5,1.5,0.7), width=1)275276par(mar=mar3 , cex.main=1)277chart.StackedBar2(Wsel_minVar ,col=colorset,space=0, main = namelabels[1], ylab="Weight allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )278chart.StackedBar2(Wsel_minCVaR,col=colorset,space=0, main = namelabels[2], ylab="Weight allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )279chart.StackedBar2(Wsel_MCC ,col=colorset,space=0, main = namelabels[3], ylab="Weight allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T, legend.loc = NULL,ylim=c(0,1),border = F )280281par(mar=mar1 , cex.main=1)282plot.new()283legend("center",legend=w.names,fill=colorset,ncol=4)284285par(mar=mar3 , cex.main=1)286chart.StackedBar2(PercCVaRsel_minVar,col=colorset,space=0, main = namelabels[1], ylab="CVaR allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )287chart.StackedBar2(PercCVaRsel_minCVaR,col=colorset,space=0, main = namelabels[2], ylab="CVaR allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )288chart.StackedBar2(PercCVaRsel_MCC,col=colorset,space=0, main = namelabels[3], ylab="CVaR allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )289290dev.off()291292293postscript('stackedweightsriskcont_efficientfrontier.eps')294layout( matrix( c(1,2,3,4,5,6,7,4), ncol = 2 ) , height= c(1.5,1.5,1.5,0.7), width=1)295296par(mar=mar3 , cex.main=1)297chart.StackedBar2(interpNA(Wsel_minVar) ,col=colorset,space=0, main = namelabels[1], ylab="Weight allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )298chart.StackedBar2(interpNA(Wsel_minCVaR),col=colorset,space=0, main = namelabels[2], ylab="Weight allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )299chart.StackedBar2(interpNA(Wsel_MCC) ,col=colorset,space=0, main = namelabels[3], ylab="Weight allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T, legend.loc = NULL,ylim=c(0,1),border = F )300301par(mar=mar1 , cex.main=1)302plot.new()303legend("center",legend=w.names,col=colorset,ncol=4,lwd=6)304305par(mar=mar3 , cex.main=1)306chart.StackedBar2(interpNA(PercCVaRsel_minVar),col=colorset,space=0, main = namelabels[1], ylab="CVaR allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )307chart.StackedBar2(interpNA(PercCVaRsel_minCVaR),col=colorset,space=0, main = namelabels[2], ylab="CVaR allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )308chart.StackedBar2(interpNA(PercCVaRsel_MCC),col=colorset,space=0, main = namelabels[3], ylab="CVaR allocation", las=1, l=3.9, r=0, cex.axis=1, cex.lab=1, cex.main=1, axisnames=T,legend.loc = NULL,ylim=c(0,1),border = F )309310dev.off()311312313314#----------------------------------------------------------------------------------------------------315# DISCUSSION RESULTS316317318# unconstrained:31912*vmu_minVar[1] ; vrisk_minVar[1] ; W_minVar[1,] ; PercCVaR_minVar[1,];32012*vmu_minCVaR[1]; vrisk_minCVaR[1]; W_minCVaR[1,]; PercCVaR_minCVaR[1,];32112*vmu_MCC[1] ; vrisk_MCC[1] ; W_MCC[1,] ; PercCVaR_MCC[1,];322323324cbind( vmu_minVar*12 , vriskconc_minVar/vrisk_minVar ) : 0.0816 is turning point325cbind( vmu_minCVaR*12 , vriskconc_minCVaR/vrisk_minCVaR ) : 0.0816 is turning point326327# Mean/CVaR concentration efficient portfolios328329# On Cleaned Data: Three segments330331# > assetmu332# Bond SP500 EAFE SPGSCI333# 0.07545960 0.10249338 0.08677129 0.05413622334# > assetCVaR335# Bond SP500 EAFE SPGSCI336# 0.02456233 0.09974267 0.10868066 0.12775266337338339# Unconstrained: Equal Risk Contribution Portfolio:340# > W_MCC[1,]341# 0.6431897 0.1337981 0.1044994 0.1185127342#> PercCVaR_MCC[1,]343# 0.2516 0.2517 0.2504 0.2463344# > vmu_MCC[1]*12345# [1] 0.07773165346#> vrisk_MCC[1]347#[1] 0.03467514348#> vriskconc_MCC[1]349#[1] 0.0087350# Segment 1: increasing allocation to bonds and decreasing allocation to commodities351# Portfolio risk concentration increases, portfolio risk decreases352# > W_MCC[25:27,]353# 0.7052788 0.1584357 0.1321813 0.0041042550354# 0.7085301 0.1597522 0.1313759 0.0003417814355# 0.7025028 0.1628656 0.1344935 0.0001380022356#> vmu_MCC[26]*12357#[1] 0.0812571358#> vrisk_MCC[26]359#[1] 0.03352778360#> vriskconc_MCC[26]361#[1] 0.0112362# Segment 2: increasing allocation to both US equity and EAFE363# Portfolio risk concentration and risk increase together364# > W_MCC[138:140,]365# 0.0078323664 0.5106416 0.4814090 1.169711e-04366# 0.0005986683 0.5136429 0.4856355 1.228907e-04367# 0.0002258733 0.5201106 0.4796231 4.051641e-05368# > PercCVaR_MCC[138:140,]369# 0e+00 0.4999 0.5000 0370#> vmu_MCC[139]*12371#[1] 0.09483605372# > vrisk_MCC[139]373# [1] 0.09808784374# > vriskconc_MCC[139]375# [1] 0.049376# Segment 3: increasing alllocation to US equity and decreasing to EAFE377# Portfolio risk concentration and risk increase together378# > tail(W_MCC,1)379# 5.45402e-05 0.9998762 4.340072e-05 2.585630e-05380381382383384