Path: blob/master/sandbox/paper_analysis/R_interpretation/old/performanceanalysis.R
1433 views
1setwd("c:/Documents and Settings/Administrator/Desktop/risk budget programs")23# Optimized portfolio you want to analyse out-of-sample performance through (Component) Sharpe ratios45datacase = "equitybondscommodity" # "intequitybonds" or "equitybondscommodity"67estyears = 4;8percriskcontribcriterion = "mES"9RBcon = 0.4#10frequency = "quarterly" ;yearly = F;11alpha = 0.05; # probability level for which CVaR is computed1213# Load additional programs to interpret the data1415library(zoo); library("PerformanceAnalytics"); source("R_interpretation/pfolioreturn.R");1617# Choose data18datacase = "equitybondscommodity" # "equitybondscommodity" or "equitybondscommodity"1920# Define optimization criteria2122optimcrit = "mES."23mainname = paste("weights/" , percriskcontribcriterion,"/", datacase , "/" , frequency , "/" , sep="")24criterion = paste(mainname,optimcrit,estyears,"yr",sep="")25criteria = c( paste(mainname,"EW",sep="") ,26paste(mainname,"unconstrained/", optimcrit , "4yr-InfInf" , sep="") ,27paste( criterion , "-InfInf" , sep="") , paste( criterion , "-Inf" , 0.4 , sep="") ,28paste( mainname,"unconstrained/", optimcrit , "4yr0.220.28" , sep="") );2930source("R_Allocation/allocation_functions_monthly.R"); source("R_Allocation/estimators.R");31library(zoo); library("PerformanceAnalytics");32memory.limit(2048)3334#############################################################################35# Load the data36#############################################################################3738firstyear = 1976 ; firstquarter = 1; lastyear = 2009; lastquarter = 2;3940data = read.table( file= paste("data/",datacase,"/data.txt",sep="") ,header=T)41date = as.Date(data[,1],format="%Y-%m-%d")42monthlyR = zoo( data[,2:ncol(data)] , order.by = date )4344# "Bond" "SP500" "EAFE" "SPGSCI" "TBill" "Inflation"4546cAssets = 4;47head(monthlyR);4849apply( monthlyR , 2 , 'mean' )*10050apply( monthlyR , 2 , 'sd' )*10051apply( monthlyR , 2 , 'skew' )52apply( monthlyR , 2 , 'exkur' )53cor(monthlyR)54monthlyRTBill = monthlyR[,cAssets+1]5556# Define the out-of-sample periods5758from=to=c();59if( frequency == "yearly" ){60for( year in (firstyear):(lastyear) ){61from = c( from , paste( year,"-01-01",sep="" ) ); to = c( to , paste( (year),"-12-31",sep="" ) ) }62}else{63for( year in (firstyear+estyears):(lastyear) ){64from = c( from , paste( year,"-01-01",sep="" ) , paste( year,"-04-01",sep="" ) , paste( year,"-07-01",sep="" ) , paste( year,"-10-01",sep="" ) );65to = c( to , paste( year,"-03-31",sep="" ) , paste( year,"-06-30",sep="" ) , paste( year,"-09-30",sep="" ) , paste( year,"-12-31",sep="" ) )}66from = from[firstquarter:(length(from)-4+lastquarter)]; to = to[firstquarter:(length(to)-4+lastquarter)]67}6869# Compute daily out of sample returns, accounting for compounding effects7071Returns.rebalancing( R = monthlyR , criteria = criteria, from = from, to = to , folder=paste("/oosreturns/",datacase,"/", frequency ,"/", sep="") )72oosdates = time( window (monthlyR , start = from[1] , end = to[ length(to) ] ) )7374load(paste(getwd(),"/","/oosreturns/",datacase,"/", frequency , "/simplereturns.Rdata" ,sep="") )7576colnames(simplereturns) = c( "EW" , "UnconstrainedMinCVaR", "MaxWeightConstrained" , "MaxRiskbudgetconstrained" , "EqualRisk" )77date = time(simplereturns)7879# Assess out of sample performance of the minimum StdDev portfolio through the rolling centered 3-year rolling standard deviation8081sd_EW = rollapply(data=simplereturns[,1],width=36, FUN=sd)82sd_MinCVaR = rollapply(data=simplereturns[,2],width=36, FUN=sd)83sd_weightconstrained = rollapply(data=simplereturns[,3],width=36, FUN=sd)84sd_RCconstrained = rollapply(data=simplereturns[,4],width=36, FUN=sd)85sd_equalrisk = rollapply(data=simplereturns[,5],width=36, FUN=sd)8687# Assess out of sample performance of the maximum Sharpe ratio through relative cumulative performance chart8889cumperf_EW = cumprod(1 + na.omit(simplereturns[,1]))90cumperf_MinCVaR = cumprod(1 + na.omit(simplereturns[,2]))91cumperf_weightconstrained = cumprod(1 + na.omit(simplereturns[,3]))92cumperf_RCconstrained = cumprod(1 + na.omit(simplereturns[,4]))93cumperf_equalrisk = cumprod(1 + na.omit(simplereturns[,5]))949596postscript( file=paste("fig/",percriskcontribcriterion,"/",datacase,"/",frequency,"/relativeperformance.eps",sep="") )9798par(mfrow=c(4,1), mar = c(2,2,3,2) , cex.main = 1.1 , cex.axis=0.8);99100plot( sd_RCconstrained /sd_EW ,101main="Relative rolling 3 month standard deviation w.r.t. equal-weighted", type = "l" )102103plot( sd_RCconstrained /sd_MinCVaR ,104main="Relative rolling 3 month standard deviation w.r.t. min CVaR", type = "l" )105106plot( sd_RCconstrained /sd_weightconstrained ,107main="Relative rolling 3 month standard deviation w.r.t. max 40 % weight constrained", type = "l" )108109plot( sd_RCconstrained /sd_equalrisk ,110main="Relative rolling 3 month standard deviation w.r.t. equal-risk", type = "l" )111112113par(mfrow=c(4,1), mar = c(2,2,3,2) , cex.main = 1.1 , cex.axis=0.8);114115plot( cumperf_equalrisk /cumperf_EW , main="Relative cumulative performance w.r.t. equal-weighted", type = "l" )116117plot( cumperf_equalrisk /cumperf_MinCVaR , main="Relative cumulative performance w.r.t. unconstrained Min CVaR", type = "l" )118119plot( cumperf_equalrisk /cumperf_weightconstrained , main="Relative cumulative performance w.r.t. max 40 % weight constrained", type = "l" )120121plot( cumperf_equalrisk /cumperf_RCconstrained , main="Relative cumulative performance w.r.t. equal-risk", type = "l" )122123124dev.off()125126library(PerformanceAnalytics)127library(zoo)128oosreturns = zoo(simplereturns[,1:5],order.by = seq.Date(as.Date(from[1])+31, as.Date(tail(to,1)) + 1, by ="month") - 1)129charts.PerformanceSummary(oosreturns)130table.Drawdowns(oosreturns[,1],top=10)131table.Drawdowns(oosreturns[,2],top=10)132table.Drawdowns(oosreturns[,3],top=10)133table.Drawdowns(oosreturns[,4],top=10)134table.Drawdowns(oosreturns[,5],top=10)135136# Portfolio turnover per strategy:137138# compute endweights:139(1+simplereturns)/rowSums(simplereturns)140141# frequency of rebalancing: yearly of quarterly142estyears = 4;143percriskcontribcriterion = "mES"144RBconstraint = 0.4#145frequency = "quarterly" ;146crit1="mES";147# Load portfolio weights:148149Z = read.csv( file = paste(criteria[1],".csv" , sep="") );150wstart_EW = cbind(Z$Bond,Z$SP500,Z$EAFE,Z$TBill)151Z = read.csv( file = paste(criteria[2],".csv" , sep="") );152wstart_MinCVaR = cbind(Z$Bond,Z$SP500,Z$EAFE,Z$TBill)153Z = read.csv( file = paste(criteria[3],".csv" , sep="") );154wstart_weightconst = cbind(Z$Bond,Z$SP500,Z$EAFE,Z$TBill);155Z = read.csv( file = paste(criteria[4],".csv" , sep="") );156wstart_RCconst = cbind(Z$Bond,Z$SP500,Z$EAFE,Z$TBill)157Z = read.csv( file = paste(criteria[5],".csv" , sep="") );158wstart_equalrisk = cbind(Z$Bond,Z$SP500,Z$EAFE,Z$TBill)159160161cRebalancing = length(from)162163cumR = c()164oosR = window (monthlyR , start = from[1] , end = to[ length(to) ] )165166for( i in 1:cRebalancing ){167sel = seq( (i-1)*3+1 , i*3 )168cumR = rbind( cumR , apply((1+oosR[sel,]),2,'cumprod')[3,] )169}170171wend_EW = (wstart_EW[1:cRebalancing]*cumR)/rowSums( wstart_EW[1:cRebalancing]*cumR )172wend_MinCVaR = (wstart_MinCVaR[1:cRebalancing]*cumR)/rowSums( wstart_MinCVaR[1:cRebalancing]*cumR )173wend_weightconst = (wstart_weightconst[1:cRebalancing]*cumR)/rowSums( wstart_weightconst[1:cRebalancing]*cumR )174wend_RCconst = (wstart_RCconst[1:cRebalancing]*cumR)/rowSums( wstart_RCconst[1:cRebalancing]*cumR )175wend_equalrisk = (wstart_equalrisk[1:cRebalancing]*cumR)/rowSums( wstart_equalrisk[1:cRebalancing]*cumR )176177turnover_EW = mean( abs(wend_EW[1:(cRebalancing-1)] - wstart_EW[2:cRebalancing] ) )178turnover_MinCVaR = mean( abs(wend_MinCVaR[1:(cRebalancing-1)] - wstart_MinCVaR[2:cRebalancing] ) )179turnover_weightconst = mean( abs(wend_weightconst[1:(cRebalancing-1)] - wstart_weightconst[2:cRebalancing]) )180turnover_RCconst = mean( abs(wend_RCconst[1:(cRebalancing-1)] - wstart_RCconst[2:cRebalancing] ) )181turnover_equalrisk = mean( abs(wend_equalrisk[1:(cRebalancing-1)] - wstart_equalrisk[2:cRebalancing] ) )182183184185