Path: blob/master/sandbox/riskbudgetpaper(superseded)/R_Allocation/EfficientFrontier_ComputeWeights.R
1433 views
setwd("c:/Documents and Settings/Administrator/Desktop/risk budget programs")12cAssets = 4; p = priskbudget = 0.95;3mincriterion = "mES" ; percriskcontribcriterion = "mES";45# Load programs67source("R_Allocation/Risk_budget_functions.R");8library(zoo); library(fGarch); library("PerformanceAnalytics"); library("PortfolioAnalytics")9clean = TRUE1011# Load the data12firstyear = 1976 ; firstquarter = 1; lastyear = 2010; lastquarter = 2;13data = read.table( file= paste("data/","/data.txt",sep="") ,header=T)14date = as.Date(data[,1],format="%Y-%m-%d")1516monthlyR = zoo( data[,2:(1+cAssets)] , order.by = date )17if(clean){ monthlyR = clean.boudt2(monthlyR,alpha=0.05)[[1]] }1819mu = apply(monthlyR,2,'mean')20sigma = cov(monthlyR)21M3 = PerformanceAnalytics:::M3.MM(monthlyR)22M4 = PerformanceAnalytics:::M4.MM(monthlyR)2324#################################################################################25# Make Exhibit 3 Risk budget paper: Efficient frontier plot26#################################################################################2728mESfun = function( series ){ return( operMES( series , alpha = 0.05 , r = 2 ) ) }29assetmu = apply( monthlyR , 2 , 'mean' )30assetCVaR = apply( monthlyR , 2 , 'mESfun' )31minmu = min(assetmu); maxmu = max(assetmu); print(minmu*12); print(maxmu*12);3233# Mean/CVaR concentration efficient portfolios34#-----------------------------------------------3536# unconstrained solution is Minimum CVaR Concentration portfolio (having the equal risk contribution property):37# sol = MinMaxCompCVaRconportfolio(R=monthlyR, Riskupper = Inf ,Returnlower= -Inf )38minmu = min( apply(monthlyR,2,'mean' ));39sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = T, percriskcontribcriterion = "mES" ,40Riskupper = Inf , mu = mu, sigma = sigma, M3=M3, M4=M4)4142W = as.vector( sol[[1]] ) ; vmu = as.vector( sol[[2]] )43vrisk = as.vector( sol[[3]] ) ; mPercrisk = as.vector( sol[[4]] )44vmaxpercrisk = max( sol[[4]] ) ; vmaxriskcontrib = max( sol[[5]] )4546for( mutarget in seq(minmu+0.00001,maxmu,0.00001) ){47sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = T, percriskcontribcriterion = "mES" ,48Riskupper = Inf ,Returnlower= mutarget,49mu = mu, sigma = sigma, M3=M3, M4=M4)50W = rbind( W, as.vector( sol[[1]] ) )51mPercrisk = rbind( mPercrisk , as.vector( sol[[4]] ) )52vmu = c( vmu , as.vector( sol[[2]] ))53vrisk = c( vrisk , as.vector( sol[[3]] ) )54vmaxpercrisk = c( vmaxpercrisk , max( sol[[4]] ) )55vmaxriskcontrib = c( vmaxriskcontrib , max( sol[[5]] ) )56}5758# For the highest return targets, a very high penalty parameter is (sometimes) needed5960for( mutarget in c(seq( max(vmu) , maxmu, 0.000001),maxmu) ){61print( c("mutarget equal to",mutarget) )62sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = T, percriskcontribcriterion = "mES" ,63Riskupper = Inf ,Returnlower= mutarget, penalty = 1e9,64mu = mu, sigma = sigma, M3=M3, M4=M4)65W = rbind( W, as.vector( sol[[1]] ) )66mPercrisk = rbind( mPercrisk , as.vector( sol[[4]] ) )67vmu = c( vmu , as.vector( sol[[2]] ))68vrisk = c( vrisk , as.vector( sol[[3]] ) )69vmaxpercrisk = c( vmaxpercrisk , max( sol[[4]] ) )70vmaxriskcontrib = c( vmaxriskcontrib , max( sol[[5]] ) )71}727374if(clean){75write.csv( W , file = "EffFrontierMinCVaRConc_weights_clean.csv" )76write.csv( mPercrisk , file = "EffFrontierMinCVaRConc_percrisk_clean.csv" )77EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)78write.csv( EffFrontier_stats , file = "EffFrontierMinCVaRConc_stats_clean.csv" )79}else{80write.csv( W , file = "EffFrontierMinCVaRConc_weights.csv" )81write.csv( mPercrisk , file = "EffFrontierMinCVaRConc_percrisk.csv" )82EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)83write.csv( EffFrontier_stats , file = "EffFrontierMinCVaRConc_stats.csv" )84}85868788# Mean/CVaR efficient portfolios89#--------------------------------9091# unconstrained solution is Minimum CVaR portfolio (having the property that percentage CVaR corresponds to porfolio weights):92minmu = min( apply(monthlyR,2,'mean' ));93sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = F, percriskcontribcriterion = "mES" ,94Riskupper = Inf , mu = mu, sigma = sigma, M3=M3, M4=M4)9596W = as.vector( sol[[1]] ) ; vmu = as.vector( sol[[2]] )97vrisk = as.vector( sol[[3]] ) ; mPercrisk = as.vector( sol[[4]] )98vmaxpercrisk = max( sol[[4]] ) ; vmaxriskcontrib = max( sol[[5]] )99100for( mutarget in seq(minmu+0.00001,maxmu,0.00001) ){101sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = F, percriskcontribcriterion = "mES" ,102Riskupper = Inf ,Returnlower= mutarget,103mu = mu, sigma = sigma, M3=M3, M4=M4)104W = rbind( W, as.vector( sol[[1]] ) )105mPercrisk = rbind( mPercrisk , as.vector( sol[[4]] ) )106vmu = c( vmu , as.vector( sol[[2]] ))107vrisk = c( vrisk , as.vector( sol[[3]] ) )108vmaxpercrisk = c( vmaxpercrisk , max( sol[[4]] ) )109vmaxriskcontrib = c( vmaxriskcontrib , max( sol[[5]] ) )110}111112# For the highest return targets, a very high penalty parameter is (sometimes) needed113114for( mutarget in c(seq( max(vmu) , maxmu, 0.000001),maxmu) ){115print( c("mutarget equal to",mutarget) )116sol = PortfolioOptim( minriskcriterion = "mES" , MinMaxComp = F, percriskcontribcriterion = "mES" ,117Riskupper = Inf ,Returnlower= mutarget, penalty = 1e9,118mu = mu, sigma = sigma, M3=M3, M4=M4)119W = rbind( W, as.vector( sol[[1]] ) )120mPercrisk = rbind( mPercrisk , as.vector( sol[[4]] ) )121vmu = c( vmu , as.vector( sol[[2]] ))122vrisk = c( vrisk , as.vector( sol[[3]] ) )123vmaxpercrisk = c( vmaxpercrisk , max( sol[[4]] ) )124vmaxriskcontrib = c( vmaxriskcontrib , max( sol[[5]] ) )125}126127if(clean){128write.csv( W , file = "EffFrontierMinCVaR_weights_clean.csv" )129write.csv( mPercrisk , file = "EffFrontierMinCVaR_percrisk_clean.csv" )130EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)131write.csv( EffFrontier_stats , file = "EffFrontierMinCVaR_stats_clean.csv" )132}else{133write.csv( W , file = "EffFrontierMinCVaR_weights.csv" )134write.csv( mPercrisk , file = "EffFrontierMinCVaR_percrisk.csv" )135EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)136write.csv( EffFrontier_stats , file = "EffFrontierMinCVaR_stats.csv" )137}138139140# Mean/StdDev efficient portfolios (use quadprog)141#-------------------------------------------------142143library(quadprog)144N = 4 ; maxweight = 1; minweight = 0; sumweights = 1;145Amat = rbind( rep(1,N) , diag(x =1,nrow=N,ncol=N) , diag(x =-1,nrow=N,ncol=N) , as.numeric(mu) );146bvec = c( sumweights , rep(minweight,N), rep(-maxweight,N) )147dvec = matrix( rep(0,N) , ncol=1 )148149mutarget = -10000;150# min(-d^T b + 1/2 b^T D b) with the constraints A^T b >= b_0.151optw = solve.QP( Dmat = sigma , dvec = dvec , Amat = t(Amat) ,152bvec = matrix( c(bvec,mutarget) , ncol = 1) , meq =1 )$solution153sol = ES(weights=optw, portfolio_method="component", mu = mu, sigma = sigma, m3=M3, m4=M4,invert=FALSE)154W = optw ; vmu = sum(optw*mu)155vrisk = sol$MES ; mPercrisk = as.vector( sol$pct_contrib_MES )156vmaxpercrisk = max( sol$pct_contrib_MES ) ; vmaxriskcontrib = max( sol$contribution )157158# unconstrained solution is Minimum CVaR portfolio (having the property that percentage CVaR corresponds to porfolio weights):159minmu = min( apply(monthlyR,2,'mean' ));160161162for( mutarget in seq(minmu+0.00001,maxmu,0.00001) ){163optw = solve.QP( Dmat = sigma , dvec = dvec , Amat = t(Amat) ,164bvec = matrix( c(bvec,mutarget) , ncol = 1) , meq =1 )$solution165sol = ES(weights=optw, portfolio_method="component", mu = mu, sigma = sigma, m3=M3, m4=M4,invert=FALSE)166W = rbind( W, optw )167mPercrisk = rbind( mPercrisk , as.vector( sol$pct_contrib_MES ) )168vmu = c( vmu , sum(optw*mu) )169vrisk = c( vrisk , sol$MES )170vmaxpercrisk = c( vmaxpercrisk , max( sol$pct_contrib_MES ) )171vmaxriskcontrib = c( vmaxriskcontrib , max( sol$contribution ) )172}173174if(clean){175write.csv( W , file = "EffFrontierMinVar_weights_clean.csv" )176write.csv( mPercrisk , file = "EffFrontierMinVar_percrisk_clean.csv" )177EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)178write.csv( EffFrontier_stats , file = "EffFrontierMinVar_stats_clean.csv" )179}else{180write.csv( W , file = "EffFrontierMinVar_weights.csv" )181write.csv( mPercrisk , file = "EffFrontierMinVar_percrisk.csv" )182EffFrontier_stats = cbind( vmu , vrisk , vmaxpercrisk , vmaxriskcontrib)183write.csv( EffFrontier_stats , file = "EffFrontierMinVar_stats.csv" )184}185186187188189190