Path: blob/master/sandbox/paper_analysis/insample/EfficientFrontier_ComputeWeights.R
1433 views
1#################################################################################2# Make Exhibit 3 Risk budget paper: Efficient frontier plot3#################################################################################456setwd("c:/Documents and Settings/Administrator/Desktop/risk budget programs/insample")7#setwd("c:/Documents and Settings/n06054/Desktop/risk budget programs")8cAssets = 4; p = priskbudget = 0.95;9mincriterion = "mES" ; percriskcontribcriterion = "mES";1011# Load programs1213source("Risk_budget_functions.R");14library(zoo); library(fGarch); library("PerformanceAnalytics"); library("PortfolioAnalytics")15clean = TRUE16CC = TRUE1718# Load the data19firstyear = 1976 ; firstquarter = 1; lastyear = 2010; lastquarter = 2;20data = read.table( file= paste(getwd(),"/data.txt",sep="") ,header=T)21date = as.Date(data[,1],format="%Y-%m-%d")2223monthlyR = zoo( data[,2:(1+cAssets)] , order.by = date )2425if(clean){ monthlyR = clean.boudt2(monthlyR,alpha=0.05)[[1]] }26mu = apply(monthlyR,2,'mean')27sigma = cov(monthlyR)28if(!CC){29M3 = PerformanceAnalytics:::M3.MM(monthlyR)30M4 = PerformanceAnalytics:::M4.MM(monthlyR)31}else{32source( "coskewkurtosis.R" )33M3 = coskewCC(monthlyR-matrix( rep(mu,nrow(monthlyR)) , nrow=nrow(monthlyR) , byrow=TRUE) );34M4 = cokurtCC(monthlyR-matrix( rep(mu,nrow(monthlyR)) , nrow=nrow(monthlyR) , byrow=TRUE) );35}36N = ncol(monthlyR)373839#################################################################################40# Make Exhibit 3 Risk budget paper: Efficient frontier plot41#################################################################################4243mESfun = function( series ){ return( operMES( series , alpha = 0.05 , r = 2 ) ) }44assetmu = apply( monthlyR , 2 , 'mean' )45assetCVaR = apply( monthlyR , 2 , 'mESfun' )46# Bond SP500 NAREIT SPGSCI47#0.01228896 0.12481216 0.27768243 0.2058818948mESfun2 = function( w ){ return( operPortMES(w,mu=mu,alpha=0.05,sigma=sigma,M3=M3,M4=M4)[[1]] ) }49mESfun2( as.matrix(c(0,1,0,0)) )5051minmu = min(assetmu); maxmu = max(assetmu); print(minmu*12); print(maxmu*12);5253# Mean/CVaR concentration efficient portfolios54#-----------------------------------------------5556eps = 0.02557set.seed(1234)58rpconstraint<-constraint(assets=N, min_sum=(1-eps), max_sum=(1+eps),59min=rep(0,N), max=rep(1,N), weight_seq=generatesequence(),by=.001,rounding=3)60rp<- random_portfolios(rpconstraints=rpconstraint,permutations=200)61rp<-rbind( rp , diag( rep(1,4) ) )62rp <-rp/rowSums(rp)63controlDE <- list(reltol=1e-6,steptol=150, itermax = 5000,trace = 100, strategy=6, c=.4,64NP=as.numeric(nrow(rp)),initialpop=rp)65#controlDE <- list(reltol=1e-6,steptol=150, itermax = 5000,trace = 100, strategy=2, c=0,66# NP=as.numeric(nrow(rp)),initialpop=rp)67# unconstrained solution is Minimum CVaR Concentration portfolio (having the equal risk contribution property):68# sol = MinMaxCompCVaRconportfolio(R=monthlyR, Riskupper = Inf ,Returnlower= -Inf )69minmu = min( apply(monthlyR,2,'mean' ));70sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = T, percriskcontribcriterion = "mES" ,71Riskupper = Inf , mu = mu, sigma = sigma, M3=M3, M4=M4, controlDE = controlDE)7273W = as.vector( sol[[1]] ) ; vmu = as.vector( sol[[2]] )74vrisk = as.vector( sol[[3]] ) ; mPercrisk = as.vector( sol[[4]] )75vmaxpercrisk = max( sol[[4]] ) ; vmaxriskcontrib = max( sol[[5]] )7677mutarget = minmu+0.0000178while( mutarget <= maxmu ){79print("------------")80print( c(minmu,mutarget,maxmu) )81sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = T, percriskcontribcriterion = "mES" ,82Riskupper = Inf ,Returnlower= mutarget,83mu = mu, sigma = sigma, M3=M3, M4=M4, controlDE = controlDE)84controlDE$initialpop = rbind( rp , W )85controlDE$NP = as.numeric( nrow(controlDE$initialpop) )86W = rbind( W, as.vector( sol[[1]] ) )87mPercrisk = rbind( mPercrisk , as.vector( sol[[4]] ) )88vmu = c( vmu , as.vector( sol[[2]] ))89vrisk = c( vrisk , as.vector( sol[[3]] ) )90vmaxpercrisk = c( vmaxpercrisk , max( sol[[4]] ) )91vmaxriskcontrib = c( vmaxriskcontrib , max( sol[[5]] ) )92oldmutarget = mutarget93mutarget = as.vector( sol[[2]] ) + 0.0000194if( mutarget == oldmutarget ){ mutarget = mutarget + 0.00001 }95}9697# For the highest return targets, a very high penalty parameter is (sometimes) needed9899for( mutarget in c(seq( max(vmu) , maxmu,0.00001),maxmu) ){100print("------------")101print( c("mutarget equal to",mutarget) )102controlDE$initialpop = rbind( rp , W )103controlDE$NP = as.numeric( nrow(controlDE$initialpop) )104sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = T, percriskcontribcriterion = "mES" ,105Riskupper = Inf ,Returnlower= mutarget, penalty = 1e9,106mu = mu, sigma = sigma, M3=M3, M4=M4)107W = rbind( W, as.vector( sol[[1]] ) )108mPercrisk = rbind( mPercrisk , as.vector( sol[[4]] ) )109vmu = c( vmu , as.vector( sol[[2]] ))110vrisk = c( vrisk , as.vector( sol[[3]] ) )111vmaxpercrisk = c( vmaxpercrisk , max( sol[[4]] ) )112vmaxriskcontrib = c( vmaxriskcontrib , max( sol[[5]] ) )113}114115116EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)117if(clean){118if(!CC){119write.csv( W , file = "EffFrontierMinCVaRConc_weights_clean.csv" )120write.csv( mPercrisk , file = "EffFrontierMinCVaRConc_percrisk_clean.csv" )121write.csv( EffFrontier_stats , file = "EffFrontierMinCVaRConc_stats_clean.csv" )122}else{123write.csv( W , file = "EffFrontierMinCVaRConc_weights_clean_CC.csv" )124write.csv( mPercrisk , file = "EffFrontierMinCVaRConc_percrisk_clean_CC.csv" )125write.csv( EffFrontier_stats , file = "EffFrontierMinCVaRConc_stats_clean_CC.csv" )126}127}else{128if(!CC){129write.csv( W , file = "EffFrontierMinCVaRConc_weights.csv" )130write.csv( mPercrisk , file = "EffFrontierMinCVaRConc_percrisk.csv" )131write.csv( EffFrontier_stats , file = "EffFrontierMinCVaRConc_stats.csv" )132}else{133write.csv( W , file = "EffFrontierMinCVaRConc_weights_CC.csv" )134write.csv( mPercrisk , file = "EffFrontierMinCVaRConc_percrisk_CC.csv" )135write.csv( EffFrontier_stats , file = "EffFrontierMinCVaRConc_stats_CC.csv" )136}137}138139# Mean/CVaR efficient portfolios140#--------------------------------141142eps = 0.025143set.seed(1234)144rpconstraint<-constraint(assets=N, min_sum=(1-eps), max_sum=(1+eps),145min=rep(0,N), max=rep(1,N), weight_seq=generatesequence(),by=.001,rounding=3)146rp<- random_portfolios(rpconstraints=rpconstraint,permutations=200)147rp<-rbind( rp , diag( rep(1,4) ) )148rp <-rp/rowSums(rp)149controlDE <- list(reltol=1e-6,steptol=150, itermax = 5000,trace = 100, strategy=6, c=.4,150NP=as.numeric(nrow(rp)),initialpop=rp)151152# unconstrained solution is Minimum CVaR portfolio (having the property that percentage CVaR corresponds to porfolio weights):153minmu = min( apply(monthlyR,2,'mean' ));154sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = F, percriskcontribcriterion = "mES" ,155Riskupper = Inf , mu = mu, sigma = sigma, M3=M3, M4=M4, controlDE = controlDE)156157W = as.vector( sol[[1]] ) ; vmu = as.vector( sol[[2]] )158vrisk = as.vector( sol[[3]] ) ; mPercrisk = as.vector( sol[[4]] )159vmaxpercrisk = max( sol[[4]] ) ; vmaxriskcontrib = max( sol[[5]] )160161mutarget = minmu+0.00001162while( mutarget <= maxmu ){163print("------------")164print( c("mutarget equal to",mutarget) )165controlDE$initialpop = rbind( rp , W )166controlDE$NP = as.numeric( nrow(controlDE$initialpop) )167sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = F, percriskcontribcriterion = "mES" ,168Riskupper = Inf ,Returnlower= mutarget,169mu = mu, sigma = sigma, M3=M3, M4=M4, controlDE = controlDE)170W = rbind( W, as.vector( sol[[1]] ) )171mPercrisk = rbind( mPercrisk , as.vector( sol[[4]] ) )172vmu = c( vmu , as.vector( sol[[2]] ))173vrisk = c( vrisk , as.vector( sol[[3]] ) )174vmaxpercrisk = c( vmaxpercrisk , max( sol[[4]] ) )175vmaxriskcontrib = c( vmaxriskcontrib , max( sol[[5]] ) )176oldmutarget = mutarget177mutarget = as.vector( sol[[2]] ) + 0.00001178if( mutarget == oldmutarget ){ mutarget = mutarget + 0.00001 }179}180181# For the highest return targets, a very high penalty parameter is (sometimes) needed182183for( mutarget in c(seq( max(vmu) , maxmu, 0.00001),maxmu) ){184print( c("mutarget equal to",mutarget) )185controlDE$initialpop = rbind( rp , W )186controlDE$NP = as.numeric( nrow(controlDE$initialpop) )187sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = F, percriskcontribcriterion = "mES" ,188Riskupper = Inf ,Returnlower= mutarget, penalty = 1e9,189mu = mu, sigma = sigma, M3=M3, M4=M4, controlDE = controlDE)190W = rbind( W, as.vector( sol[[1]] ) )191mPercrisk = rbind( mPercrisk , as.vector( sol[[4]] ) )192vmu = c( vmu , as.vector( sol[[2]] ))193vrisk = c( vrisk , as.vector( sol[[3]] ) )194vmaxpercrisk = c( vmaxpercrisk , max( sol[[4]] ) )195vmaxriskcontrib = c( vmaxriskcontrib , max( sol[[5]] ) )196}197198EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)199if(clean){200if(!CC){201write.csv( W , file = "EffFrontierMinCVaR_weights_clean.csv" )202write.csv( mPercrisk , file = "EffFrontierMinCVaR_percrisk_clean.csv" )203write.csv( EffFrontier_stats , file = "EffFrontierMinCVaR_stats_clean.csv" )204}else{205write.csv( W , file = "EffFrontierMinCVaR_weights_clean_CC.csv" )206write.csv( mPercrisk , file = "EffFrontierMinCVaR_percrisk_clean_CC.csv" )207write.csv( EffFrontier_stats , file = "EffFrontierMinCVaR_stats_clean_CC.csv" )208}209}else{210if(!CC){211write.csv( W , file = "EffFrontierMinCVaR_weights.csv" )212write.csv( mPercrisk , file = "EffFrontierMinCVaR_percrisk.csv" )213write.csv( EffFrontier_stats , file = "EffFrontierMinCVaR_stats.csv" )214}else{215write.csv( W , file = "EffFrontierMinCVaR_weights_CC.csv" )216write.csv( mPercrisk , file = "EffFrontierMinCVaR_percrisk_CC.csv" )217write.csv( EffFrontier_stats , file = "EffFrontierMinCVaR_stats_CC.csv" )218}219}220221222# Mean/StdDev efficient portfolios (use quadprog)223#-------------------------------------------------224225library(quadprog)226N = 4 ; maxweight = 1; minweight = 0; sumweights = 1;227Amat = rbind( rep(1,N) , diag(x =1,nrow=N,ncol=N) , diag(x =-1,nrow=N,ncol=N) , as.numeric(mu) );228bvec = c( sumweights , rep(minweight,N), rep(-maxweight,N) )229dvec = matrix( rep(0,N) , ncol=1 )230231mutarget = -10000;232# min(-d^T b + 1/2 b^T D b) with the constraints A^T b >= b_0.233optw = solve.QP( Dmat = sigma , dvec = dvec , Amat = t(Amat) ,234bvec = matrix( c(bvec,mutarget) , ncol = 1) , meq =1 )$solution235sol = ES(weights=optw, portfolio_method="component", mu = mu, sigma = sigma, m3=M3, m4=M4,invert=FALSE)236W = optw ; vmu = sum(optw*mu)237vrisk = sol$MES ; mPercrisk = as.vector( sol$pct_contrib_MES )238vmaxpercrisk = max( sol$pct_contrib_MES ) ; vmaxriskcontrib = max( sol$contribution )239240# unconstrained solution is Minimum CVaR portfolio (having the property that percentage CVaR corresponds to porfolio weights):241minmu = min( apply(monthlyR,2,'mean' ));242243244for( mutarget in seq(minmu+0.00005,maxmu,0.00005) ){245optw = solve.QP( Dmat = sigma , dvec = dvec , Amat = t(Amat) ,246bvec = matrix( c(bvec,mutarget) , ncol = 1) , meq =1 )$solution247sol = ES(weights=optw, portfolio_method="component", mu = mu, sigma = sigma, m3=M3, m4=M4,invert=FALSE)248W = rbind( W, optw )249mPercrisk = rbind( mPercrisk , as.vector( sol$pct_contrib_MES ) )250vmu = c( vmu , sum(optw*mu) )251vrisk = c( vrisk , sol$MES )252vmaxpercrisk = c( vmaxpercrisk , max( sol$pct_contrib_MES ) )253vmaxriskcontrib = c( vmaxriskcontrib , max( sol$contribution ) )254}255256if(clean){257write.csv( W , file = "EffFrontierMinVar_weights_clean.csv" )258write.csv( mPercrisk , file = "EffFrontierMinVar_percrisk_clean.csv" )259EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)260write.csv( EffFrontier_stats , file = "EffFrontierMinVar_stats_clean.csv" )261}else{262write.csv( W , file = "EffFrontierMinVar_weights.csv" )263write.csv( mPercrisk , file = "EffFrontierMinVar_percrisk.csv" )264EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)265write.csv( EffFrontier_stats , file = "EffFrontierMinVar_stats.csv" )266}267268269270271272