Path: blob/master/sandbox/script.workshop2010.R
1433 views
### For R/Finance workshop on Portfolio Analytics1# Chicago, 16 April 20102# Peter Carl and Brian Peterson34### Load the necessary packages5# Include optimizer and multi-core packages6library(PortfolioAnalytics)7require(xts)8require(DEoptim)9require(doMC)10registerDoMC()11require(TTR)1213### Load the data14# Monthly total returns of four asset-class indexes15data(indexes)16#only look at 2000 onward17indexes<-indexes["2000::"]1819#'## Review the data20postscript(file="WeightsVsRiskReview.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)21# Generate charts to show 12m sma returns and CVaR by asset22charts.BarVaR(indexes[,1:4], p=(1-1/12), clean='boudt', show.cleaned=TRUE, methods=c("ModifiedVaR","ModifiedES"), colorset=rainbow6equal, cex.axis=1)23# Weights v %Contrib to CVaR24table = as.matrix(ES(indexes[,1:4], weights=rep(1/4,4), portfolio_method="component", p=(1-1/12))$pct_contrib_MES)25table = cbind(rep(1/4,4),table)26colnames(table) = c("Weights", "%Contrib to CVaR")27plot(table, ylim=c(-0.1,1), xlim=c(0,1), col=1:4, main="Weight and Contribution to Risk")28text(table[,1],table[,2],rownames(table), pos=4, cex = 0.8, col=1:4)29abline(a=0,b=1, col="darkgray", lty="dotted")30dev.off()3132### Create a benchmark using equal-weighted portfolio returns33# Rebalance an equal-weight portfolio quarterly34dates=c(as.Date("1999-12-31"),time(indexes[endpoints(indexes, on="quarters")]))35weights = xts(matrix(rep(1/4,length(dates)*4), ncol=4), order.by=dates)36colnames(weights)= colnames(indexes[,1:4])37EqWgt = Return.rebalancing(indexes[,1:4],weights)3839# Chart EqWgt Results40postscript(file="EqWgtPlot1.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)41charts.PerformanceSummary(EqWgt, main="Eq Wgt Portfolio", methods=c("ModifiedVaR", "ModifiedES"), p=(1-1/12), clean='boudt', show.cleaned=TRUE, gap=36, colorset=bluefocus, lwd=3)42dev.off()4344### Chart the VaR Sensitivity45postscript(file="VaRSense.eps", height=6, width=6, paper="special", horizontal=FALSE, onefile=FALSE)46layout(matrix(c(1,2,3,4), nrow=2))47for(i in 1:4)48chart.VaRSensitivity(indexes[,i], methods=c("ModifiedES", "HistoricalES", "GaussianES"), colorset=bluemono, lwd=c(3,2,2), clean="boudt", main=paste("VaR Sensitivity for", colnames(indexes)[i], sep=" "), cex=.8)49dev.off()5051# chart the assets52postscript(file="assetReturns.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)53charts.BarVaR(indexes[,1:4], methods=c("ModifiedVaR", "ModifiedES"), colorset=rep("black",4), clean="boudt", show.clean=TRUE)54dev.off()5556#'# EXAMPLE 1: Constrained Mean-CVaR Portfolio57### Show an example of a constraint set58aConstraintObj <- constraint(assets = colnames(indexes[,1:4]),59min = .05, # minimum position weight60max = c(.85,.5,.5,.3), #1, # maximum position weight61min_sum=0.99, # minimum sum of weights must be equal to 1-ish62max_sum=1.01, # maximum sum must also be about 163weight_seq = generatesequence()) # possible weights for random or brute force portfolios6465### Add a return objective to a constraint66# Create a small weighted annualized trailing-period mean wrapper function67pamean <- function(n=12, R, weights, geometric=TRUE)68{ sum(Return.annualized(last(R,n), geometric=geometric)*weights) }6970# Portfolio annualized exponential moving average monthly return71aConstraintObj <- add.objective(constraints=aConstraintObj,72type="return",73name="pamean",74enabled=TRUE,75multiplier=-1, # to maximize this objective using a minimizer76arguments = list(n=12))7778### Add a risk objective to a constraint79aConstraintObj <- add.objective(aConstraintObj,80type="risk", # the kind of objective this is81name="CVaR", # the function to minimize82enabled=TRUE, # enable or disable the objective83arguments=list(p=(1-1/12), clean="boudt")84)8586### Use the Random Portfolios engine87# Evaluate the constraint object with Random Portfolios88rndResult<-optimize.portfolio(R=indexes[,1:4],89constraints=aConstraintObj,90optimize_method='random',91search_size=1000, trace=TRUE, verbose=TRUE)9293# Chart the results94postscript(file="rpPerformancePlot1.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)95charts.RP(rndResult, risk.col="CVaR", return.col="pamean", main="Constrained Mean-CVaR", neighbors=25)96dev.off()9798# Chart the weights versus contribution to risk99postscript(file="WeightsVsRisk1.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)100table = ES(indexes[,1:4],weights=rndResult$weights, portfolio_method="component", p=(1-1/12))$pct_contrib_MES101table = cbind(rndResult$weights,table)102colnames(table) = c("Weights", "%Contrib to CVaR")103plot(table, ylim=c(0,1), xlim=c(0,1), col=rainbow6equal, main="Weight and Contribution to Risk")104text(table[,1],table[,2],rownames(table), pos=4, cex = 1, col=rainbow6equal)105abline(a=0,b=1, col="darkgray", lty="dotted")106dev.off()107108## Evaluate Constrained Mean-CVaR through time109#on one line for easy cut/paste/editing in interactive mode110registerDoMC()111rndResults<-optimize.portfolio.rebalancing(R=indexes[,1:4], constraints=aConstraintObj, optimize_method="random", trace=TRUE, rebalance_on='quarters', trailing_periods=NULL, training_period=36, search_size=1000)112113# Chart the cumulative returns114weights1=extractWeights.rebal(rndResults)115Ex1=Return.rebalancing(indexes[,1:4], weights1)116index(weights1)<-as.Date(index(weights1))+1117colnames(Ex1)="Mean CVaR"118results = cbind(EqWgt,Ex1)119postscript(file="ReturnsEx1.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)120charts.PerformanceSummary(results[,2:1], main="Constrained Mean-CVaR", colorset=bluefocus[-3], lwd=c(3,2), method=c("ModifiedVaR","ModifiedES"), p=(1-1/12), gap=36)121dev.off()122123# Chart the weights and contribution to risk through time124# First, extract weights and calculate ES125numColumns = length(rndResults[[1]]$weights)126numRows = length(rndResults)127contrib1 <- matrix(nrow=numRows, ncol=numColumns)128for(i in 1:numRows){129todate=paste("::",as.Date(names(rndResults)[i]), sep="")130contrib1[i,]=ES(indexes[todate,1:4], portfolio_method="component", weights=rndResults[[i]]$weights, clean="boudt", p=(1-1/12))$pct_contrib_MES131}132colnames(contrib1) = names(unlist(rndResults[[1]]$weights))133contrib1<-xts(contrib1,order.by=index(weights1))134135# test136postscript(file="InSampleStats.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)137138retrisk1 <- matrix(nrow=numRows, ncol=2)139for(i in 1:numRows)140retrisk1[i,] = unlist(rndResults[[i]]$objective_measures)141rownames(retrisk1) = names(rndResults)142colnames(retrisk1) = c("pamean", "CVaR")143chart.TimeSeries(retrisk1, legend="topright", main="In Sample Estimates")144dev.off()145# end test146147postscript(file="WeightsContribEx1.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)148layout(rbind(1, 2, 3), height = c(3, 3, 1.2), width = 1)149par(mar = c(2, 4, 4, 2) + 0.1)150PerformanceAnalytics:::chart.StackedBar.xts(weights1, main="Mean-CVaR Weights", legend.loc=NULL, cex.axis=1, colorset=bluemono[c(-2,-4,-6)], space=0, border="darkgray")151par(mar = c(2, 4, 4, 2) + 0.1)152PerformanceAnalytics:::chart.StackedBar.xts(contrib1, main="Mean-CVaR Risk Contribution", legend.loc=NULL, cex.axis=1, colorset=bluemono[c(-2,-4,-6)], space=0, border="darkgray")153plot.new()154par(oma = c(0, 0, 0, 0), mar=c(2,4,4,2)) #c(bottom, left, top, right)155legend("top", legend = colnames(weights1), fill = bluemono[c(-2,-4,-6)], ncol = 4, box.col="darkgray", border.col="white", cex=1)156dev.off()157158#'# EXAMPLE 2: Mean-CVaR Risk Limit Portfolio159### Add a risk contribution constraint160# No more than 40% of the risk may be contributed by any one asset161# Reset the position constraints162aConstraintObj$max <-rep(1,4)163names(aConstraintObj$max) <- names(aConstraintObj$min)164165aConstraintObj <- add.objective(aConstraintObj, type="risk_budget", name="CVaR", enabled=TRUE, min_prisk=-Inf, max_prisk=.4, arguments = list(clean='boudt', method="modified",p=(1-1/12)))166167rndResult2<-optimize.portfolio(R=indexes[,1:4],168constraints=aConstraintObj,169optimize_method='random',170search_size=1000, trace=TRUE, verbose=TRUE)171172### Chart the results173postscript(file="rpPerformancePlot2.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)174charts.RP(rndResult2, risk.col="CVaR", return.col="pamean", main="Mean-CVaR With Risk Limits", neighbors=25)175dev.off()176177# Chart the weights versus contribution to risk178postscript(file="WeightsVsRisk2.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)179table = cbind(rndResult2$weights, rndResult2$objective_measures$CVaR$pct_contrib_MES)180colnames(table) = c("Weights", "%Contrib to CVaR")181plot(table, ylim=c(0,1), xlim=c(0,1), col=rainbow6equal, main="Weight and Contribution to Risk")182text(table[,1],table[,2],rownames(table), pos=4, cex = 1, col=rainbow6equal)183abline(a=0,b=1, col="darkgray", lty="dotted")184dev.off()185186### Evaluate Mean-CVaR Risk Limit through time187#on one line for easy cut/paste/editing in interactive mode188registerDoMC()189rndResults2<-optimize.portfolio.rebalancing(R=indexes[,1:4], constraints=aConstraintObj, optimize_method="random", trace=TRUE, rebalance_on='quarters', trailing_periods=NULL, training_period=36, search_size=3000)190191### Chart the results192# Chart the cumulative returns193weights2=extractWeights.rebal(rndResults2)194Ex2=Return.rebalancing(indexes[,1:4], weights2)195index(weights2)<-as.Date(index(weights2)) + 1196colnames(Ex2) = "Risk Limit"197results = cbind(results, Ex2)198postscript(file="ReturnsEx2.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)199charts.PerformanceSummary(results[,3:1], main="Mean-CVaR Risk Limit", colorset=bluefocus[-3], lwd=c(3,2,2), method=c("ModifiedVaR","ModifiedES"), p=(1-1/12), gap=36)200dev.off()201202# Chart the weights and contribution to risk through time203numColumns = length(rndResults2[[1]]$weights)204numRows = length(rndResults2)205contrib2 <- matrix(nrow=numRows, ncol=numColumns)206for(i in 1:numRows)207contrib2[i,] = unlist(rndResults2[[i]]$objective_measures$CVaR$pct_contrib_MES)208colnames(contrib2) = names(unlist(rndResults2[[1]]$objective_measures$CVaR$pct_contrib_MES))209contrib2<-xts(contrib2,order.by=index(weights1))210211# op <- par(no.readonly = TRUE)212postscript(file="WeightsContribEx2.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)213layout(rbind(1, 2, 3), height = c(3, 3, 1.2), width = 1)214par(mar = c(2, 4, 4, 2) + 0.1)215PerformanceAnalytics:::chart.StackedBar.xts(weights2, main="Risk Limit Weights", legend.loc=NULL, cex.axis=1, colorset=bluemono[c(-2,-4,-6)], space=0, border="darkgray")216par(mar = c(2, 4, 4, 2) + 0.1)217PerformanceAnalytics:::chart.StackedBar.xts(contrib2, main="Risk Limit Risk Contribution", legend.loc=NULL, cex.axis=1, colorset=bluemono[c(-2,-4,-6)], space=0, border="darkgray")218plot.new()219par(oma = c(0, 0, 0, 0), mar=c(2,4,4,2))220legend("top", legend = colnames(weights2), fill = bluemono[c(-2,-4,-6)], ncol = 4, box.col="darkgray", border.col="white", cex=1)221dev.off()222# par(op)223224#'# EXAMPLE 3: Equal Risk Portfolio225### Constraints for an Equal risk contribution portfolio226EqRiskConstr <- constraint(assets = colnames(indexes[,1:4]), min = 0.05, max = c(0.85,0.5,0.5,0.3), min_sum=1, max_sum=1, weight_seq = generatesequence())227EqRiskConstr <- add.objective(EqRiskConstr, type="risk_budget", name="CVaR", enabled=TRUE, min_concentration=TRUE, arguments = list(clean='boudt', p=(1-1/12)))228EqRiskConstr <- add.objective(constraints=EqRiskConstr, type="return", name="pamean", enabled=TRUE, multiplier=0, arguments = list(n=12))229230### Use DEoptim engine231EqRiskResultDE<-optimize.portfolio(R=indexes[,1:4], constraints=EqRiskConstr, optimize_method='DEoptim', search_size=2000, trace=TRUE, verbose=FALSE) #itermax=55, CR=0.99, F=0.5,232233postscript(file="EqRiskDE.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)234charts.DE(EqRiskResultDE, return.col="pamean", risk.col="CVaR")235dev.off()236237### Evaluate through time238EqRiskResultDERebal<-optimize.portfolio.rebalancing(R=indexes[,1:4],239constraints=EqRiskConstr, optimize_method="DEoptim", trace=FALSE, rebalance_on='quarters', trailing_periods=NULL, training_period=36, itermax=75, CR=0.99, F=0.5, search_size=3000)240241### Chart results242# Panel 1: Equal Risk Performance Summary243EqRiskWeights=extractWeights.rebal(EqRiskResultDERebal)244EqRisk=Return.rebalancing(indexes, EqRiskWeights)245index(EqRiskWeights)<-as.Date(index(EqRiskWeights)) + 1246R=cbind(EqRisk,EqWgt)247colnames(R)=c("Equal Risk","Equal Weight")248postscript(file="EqRiskPerf.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)249charts.PerformanceSummary(R, methods=c("ModifiedVaR", "HistoricalVaR"), p=(1-1/12), colorset=bluefocus)250dev.off()251252# Panel 2: Equal Risk Allocations253postscript(file="EqRiskBars.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)254layout(rbind(1, 2, 3), height = c(3, 3, 1.2), width = 1)255par(mar = c(2, 4, 4, 2) + 0.1)256PerformanceAnalytics:::chart.StackedBar.xts(EqRiskWeights, main="Equal Risk Weights", legend.loc=NULL, cex.axis=1, colorset=bluemono[c(-2,-4,-6)], space=0, border="darkgray")257par(mar = c(2, 4, 4, 2) + 0.1)258### @TODO: Make this an extract function or calculate in the optim results259EqRiskPercContrCVaR=matrix(nrow=nrow(EqRiskWeights), ncol=ncol(EqRiskWeights))260for(i in 1:nrow(EqRiskWeights)){261dates = paste(index(indexes)[1], index(EqRiskWeights)[i], sep="::")262EqRiskPercContrCVaR[i,] = ES(indexes[dates,1:4], weights=EqRiskWeights[i,], p=(1-1/12), portfolio_method="component")$pct_contrib_MES263}264colnames(EqRiskPercContrCVaR) = names(EqRiskResultDERebal[[1]]$weights)265EqRiskPercContrCVaR<-xts(EqRiskPercContrCVaR,order.by=index(weights1))266par(mar = c(2, 4, 4, 2) + 0.1)267PerformanceAnalytics:::chart.StackedBar.xts(EqRiskPercContrCVaR, main="Equal Risk Risk Contribution", legend.loc=NULL, cex.axis=1, colorset=bluemono[c(-2,-4,-6)], space=0, border="darkgray")268plot.new()269par(oma = c(0, 0, 0, 0), mar=c(2,4,4,2))270legend("top", legend = colnames(weights1), fill = bluemono[c(-2,-4,-6)], ncol = 4, box.col="darkgray", border.col="white", cex=1)271dev.off()272273#'## extended Equal Risk example274#' shart with the prior example275CDDConstr<-EqRiskConstr276#' turn back on the return objective277CDDConstr$objectives[[2]]$multiplier = -1278#' turn off risk_budget objective279CDDConstr$objectives[[1]]$multiplier = 0280#' add CDD objective281CDDConstr <- add.objective(CDDConstr, type="risk", name="CDD", enabled=TRUE, arguments = list(p=(1-1/12)))282283### Use DEoptim engine284CDDResultDE2<-optimize.portfolio(R=indexes[,1:4], constraints=CDDConstr, optimize_method='DEoptim', search_size=3000, trace=TRUE, verbose=FALSE, itermax=75, CR=0.99, F=0.5)285postscript(file="CDDDE2.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)286charts.DE(CDDResultDE2, return.col="pamean", risk.col="CDD")287dev.off()288289### Evaluate through time290CDDResultDERebal2<-optimize.portfolio.rebalancing(R=indexes[,1:4],291constraints=CDDConstr, optimize_method="DEoptim", trace=FALSE, rebalance_on='quarters', trailing_periods=NULL, training_period=36, itermax=75, CR=0.99, F=0.5, search_size=3000)292293### Chart results294# Panel 1: CDD Performance Summary295CDDweights=extractWeights.rebal(CDDResultDERebal2)296CDDRet=Return.rebalancing(indexes, CDDweights)297index(CDDweights)<-as.Date(index(CDDweights)) + 1298R=cbind(CDDRet,EqWgt)299colnames(R)=c("CDD","Equal Weight")300postscript(file="CDDPerf.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)301charts.PerformanceSummary(R, methods=c("ModifiedVaR", "HistoricalVaR"), p=(1-1/12), colorset=bluefocus)302dev.off()303304# Panel 2: CDD Allocations305postscript(file="CDDBars2.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)306layout(rbind(1, 2, 3), height = c(3, 3, 1.2), width = 1)307par(mar = c(2, 4, 4, 2) + 0.1)308PerformanceAnalytics:::chart.StackedBar.xts(CDDweights, main="CDD w/ Return Obj. Weights", legend.loc=NULL, cex.axis=1, colorset=bluemono[c(-2,-4,-6)], space=0, border="darkgray")309par(mar = c(2, 4, 4, 2) + 0.1)310### @TODO: Make this an extract function or calculate in the optim results311CDDPercContrCVaR2=matrix(nrow=nrow(CDDweights), ncol=ncol(CDDweights))312for(i in 1:nrow(CDDweights)){313dates = paste(index(indexes)[1], index(CDDweights)[i], sep="::")314CDDPercContrCVaR2[i,] = ES(indexes[dates,1:4], weights=CDDweights[i,], p=(1-1/12), portfolio_method="component")$pct_contrib_MES315}316colnames(CDDPercContrCVaR2) = names(unlist(CDDResultDERebal2[[1]]$weights))317CDDPercContrCVaR2<-xts(CDDPercContrCVaR2,order.by=index(weights1))318par(mar = c(2, 4, 4, 2) + 0.1)319PerformanceAnalytics:::chart.StackedBar.xts(CDDPercContrCVaR2, main="CDD w/ Ret. Obj. Risk Contribution", legend.loc=NULL, cex.axis=1, colorset=bluemono[c(-2,-4,-6)], space=0, border="darkgray")320plot.new()321par(oma = c(0, 0, 0, 0), mar=c(2,4,4,2))322legend("top", legend = colnames(weights1), fill = bluemono[c(-2,-4,-6)], ncol = 4, box.col="darkgray", border.col="white", cex=1)323dev.off()324325326327#'## APPENDIX EXAMPLES? ###328stopifnot(isTRUE(extended_ex),"halting")329330## Markowitz-like constrained mean-variance331MeanVarConstr <- constraint(assets = colnames(indexes[,1:4]),332min = 0, max = 1, min_sum=0.99, max_sum=1.01,333weight_seq = generatesequence())334335MeanVarConstr <- add.objective(constraints=MeanVarConstr, type="return", name="mean", enabled=TRUE, multiplier=-1, arguments = list())336337MeanVarConstr <- add.objective(MeanVarConstr,338type="risk", # the kind of objective this is339name="sd",340enabled=TRUE, # enable or disable the objective341arguments= list())342343MeanVarResultRP<-optimize.portfolio(R=indexes[,1:4],344constraints=MeanVarConstr,345optimize_method='random',346search_size=1000,347trace=TRUE, verbose=TRUE)348# Chart the results349postscript(file="mvRP.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)350charts.RP(MeanVarResultRP, risk.col="sd", return.col="mean", main="Mean Variance", neighbors=25)351dev.off()352353MeanVarResultRPRebal<-optimize.portfolio.rebalancing(R=indexes[,1:4],354constraints=MeanVarConstr,355optimize_method="random",356trace=FALSE,357rebalance_on='quarters',358trailing_periods=NULL,359training_period=36,360search_size=1000)361362## Risk budget363RiskBudget.constr <- constraint(assets = colnames(indexes[,1:4]), min = 0, max = 1, min_sum=1, max_sum=1, weight_seq = generatesequence())364365RiskBudget.constr <- add.objective(RiskBudget.constr, type="risk_budget", name="CVaR", enabled=TRUE, min_prisk=-Inf, max_prisk=.4, arguments = list(clean='boudt', method="modified",p=.95))366367RiskBudget.constr <- add.objective(constraints=RiskBudget.constr, type="risk", name="CVaR", enabled=TRUE, arguments = list(method="modified", portfolio_method="single", enabled=TRUE, p=.95, clean="boudt"))368369RiskBudget.optimResult<-optimize.portfolio(R=indexes[,1:4], constraints=RiskBudget.constr,370optimize_method='DEoptim', search_size=1000, verbose=TRUE)371372## Equal risk373# First method: minimize risk concentration across assets374EqRiskConstr1 <- constraint(assets = colnames(indexes[,1:4]), min = 0.05, max = c(0.85,0.5,0.5,0.3), min_sum=0.99, max_sum=1.01, weight_seq = generatesequence())375EqRiskConstr1 <- add.objective(EqRiskConstr1, type="risk_budget", name="CVaR", enabled=TRUE, min_concentration=TRUE, arguments = list(clean='boudt', p=(1-1/12)))376EqRiskResultDE1<-optimize.portfolio(R=indexes[,1:4], constraints=EqRiskConstr1, optimize_method='DEoptim', search_size=2000, trace=TRUE, verbose=FALSE) #itermax=55, CR=0.99, F=0.5,377378# Second method: force risk levels between limits379EqRiskConstr <- constraint(assets = colnames(indexes[,1:4]), min = 0.05, max = c(0.85,0.5,0.5,0.3), min_sum=1, max_sum=1, weight_seq = generatesequence())380EqRiskConstr <- add.objective(EqRiskConstr, type="risk_budget", name="CVaR", enabled=TRUE, arguments = list(p=(1-1/12), clean="boudt"), min_prisk=0.24, max_prisk=0.26)381EqRiskResultDE<-optimize.portfolio(R=indexes[,1:4], constraints=EqRiskConstr, optimize_method='DEoptim', search_size=2000, trace=TRUE, verbose=FALSE)382383#EqRiskResultRP<-optimize.portfolio(R=indexes[,1:4], constraints=EqRiskConstr, optimize_method='random', search_size=1000, trace=TRUE, verbose=TRUE)384# Chart the results385# postscript(file="EqRiskRP.eps", height=6, width=5, paper="special", horizontal=FALSE, onefile=FALSE)386# charts.RP(EqRiskResultRP, risk.col="CVaR", return.col="mean", main="Mean Variance", neighbors=25)387# dev.off()388EqRiskResultDERebal<-optimize.portfolio.rebalancing(R=indexes[,1:4],389constraints=EqRiskConstr, optimize_method="DEoptim", trace=FALSE, rebalance_on='quarters', trailing_periods=NULL, training_period=36, itermax=45, CR=0.99, F=0.5, search_size=1000)390391# Panel 1: Equal Risk Performance Summary392EqRiskWeights=extractWeights.rebal(EqRiskResultDERebal)393EqRisk=Return.rebalancing(indexes, EqRiskWeights)394index(EqRiskWeights)<-as.Date(index(EqRiskWeights)) + 1395R=cbind(EqRisk,EqWgt)396colnames(R)=c("Equal Risk","Equal Weight")397charts.PerformanceSummary(R, methods=c("ModifiedVaR", "HistoricalVaR"), p=(1-1/12), colorset=redfocus)398399# Panel 2: Equal Risk Allocations400chart.StackedBar(EqRiskWeights)401## @TODO: Make this an extract function or calculate in the optim results402EqRiskPercContrCVaR=matrix(nrow=nrow(EqRiskWeights), ncol=ncol(EqRiskWeights))403for(i in 1:nrow(EqRiskWeights)){404dates = paste(index(indexes)[1], index(EqRiskWeights)[i], sep="::")405EqRiskPercContrCVaR[i,] = ES(indexes[dates,1:4], weights=EqRiskWeights[i,], p=(1-1/12), portfolio_method="component")$pct_contrib_MES406}407colnames(EqRiskPercContrCVaR) = names(unlist(EqRiskResultDERebal[[1]]$weights))408rownames(EqRiskPercContrCVaR) = colnames(weights1)409chart.StackedBar(EqRiskPercContrCVaR)410411## Return target with risk budget412413## You want to do what?414415416### ---------------------- Scratch area ---------------------- ###417# Single period DEOptim results418assets.pema=matrix(nrow=1,ncol=4)419# for(i in 1:4){ assets.pema[,i] = paEMA(n=12,indexes[,i],1) }420for(i in 1:4){ assets.pema[,i] = Return.annualized(last(indexes[,i],12),geometric=TRUE) }421colnames(assets.pema)=colnames(indexes[,1:4])422rownames(assets.pema)="Tr 12m Ann Return"423assets.CVaR=ES(indexes[,1:4], invert=FALSE)424assets = rbind(assets.CVaR,assets.pema)425pdf()426plot(t(assets))427points(optimResult$objective_measures[1], optimResult$objective_measures[2])428text(t(assets), colnames(assets))429text(optimResult$objective_measures[1], optimResult$objective_measures[2], "Optimal")430dev.off()431paEMA <- function(n=10, R, weights, ...)432{# call Exponential Moving Average from TTR, return the last observation433sum((12*last(apply(R,2,FUN=TTR::EMA,n=n)))*weights)434}435# xtract = extractStats.rp(rndResult)436# plot(xtract[,6],xtract[,7], xlab="CVaR", ylab="pEMA", col="lightgray", main="Random Portfolios")437# points(xtract[1,6],xtract[1,7], col="orange", pch=16) # equal weighted (seed)438# points(rndResult$constrained_objective[[1]], rndResult$constrained_objective[[2]], col="red", pch=16)439440## Use DEoptim as an engine441optimResult<-optimize.portfolio(R=indexes[,1:4],442constraints=aConstraintObj,443optimize_method='DEoptim',444itermax=45, CR=0.99, F=0.5,445search_size=2000 #, verbose=TRUE446)447448### Run it several times449optimResultList <- foreach(ii=iter(1:20),# find 20 sol'ns450.errorhandling='pass') %dopar%451optimize.portfolio(R=indexes[,1:4], aConstraintObj,452optimize_method='DEoptim', trace=TRUE,453itermax=25, CR=0.99, F=0.5, search_size=1000)454455rndResultList <- foreach(ii=iter(1:20),# 120 sol'ns456.errorhandling='pass') %dopar%457optimize.portfolio(R=indexes[,1:4], aConstraintObj,458optimize_method='random', trace=TRUE,459search_size=1000, verbose=TRUE)460461### Evaluate through time462#on one line for easy cut/paste/editing in interactive mode463registerDoMC()464rndResults<-optimize.portfolio.rebalancing(R=indexes[,1:4], constraints=aConstraintObj, optimize_method="random", trace=TRUE, rebalance_on='quarters', trailing_periods=NULL, training_period=36, search_size=1000)465466# on multiple, for demo467rndResults<-optimize.portfolio.rebalancing(R=indexes[,1:4],468constraints=aConstraintObj, # our constraints object469optimize_method="random", # allows kitchen sink sol'ns470trace=FALSE, # set verbosity for tracking471rebalance_on='quarters', # any xts 'endpoints'472trailing_periods=NULL, # calculation from inception473training_period=36, # starting period for calculation474search_size=1000) # how many portfolios to test475476477