chart.Weight.pso <- function(object, ..., neighbors = NULL, main="Weights", las = 3, xlab=NULL, cex.lab = 1, element.color = "darkgray", cex.axis=0.8, colorset=NULL, legend.loc="topright", cex.legend=0.8, plot.type="line"){
if(!inherits(object, "optimize.portfolio.pso")) stop("object must be of class 'optimize.portfolio.pso'")
if(plot.type %in% c("bar", "barplot")){
barplotWeights(object=object, ..., main=main, las=las, xlab=xlab, cex.lab=cex.lab, element.color=element.color, cex.axis=cex.axis, legend.loc=legend.loc, cex.legend=cex.legend, colorset=colorset)
} else if(plot.type == "line"){
columnnames = names(object$weights)
numassets = length(columnnames)
constraints <- get_constraints(object$portfolio)
if(is.null(xlab))
minmargin = 3
else
minmargin = 5
if(main=="") topmargin=1 else topmargin=4
if(las > 1) {
bottommargin = max(c(minmargin, (strwidth(columnnames,units="in"))/par("cin")[1])) * cex.lab
if(bottommargin > 10 ) {
bottommargin<-10
columnnames<-substr(columnnames,1,19)
}
}
else {
bottommargin = minmargin
}
par(mar = c(bottommargin, 4, topmargin, 2) +.1)
if(any(is.infinite(constraints$max)) | any(is.infinite(constraints$min))){
ylim <- range(object$weights)
} else {
ylim <- range(c(constraints$min, constraints$max))
}
plot(object$weights, type="b", col="blue", axes=FALSE, xlab='', ylim=ylim, ylab="Weights", main=main, pch=16, ...)
if(!any(is.infinite(constraints$min))){
points(constraints$min, type="b", col="darkgray", lty="solid", lwd=2, pch=24)
}
if(!any(is.infinite(constraints$max))){
points(constraints$max, type="b", col="darkgray", lty="solid", lwd=2, pch=25)
}
axis(2, cex.axis = cex.axis, col = element.color)
axis(1, labels=columnnames, at=1:numassets, las=las, cex.axis = cex.axis, col = element.color)
box(col = element.color)
}
}
chart.Weights.optimize.portfolio.pso <- chart.Weight.pso
chart.Scatter.pso <- function(object, ..., neighbors=NULL, return.col="mean", risk.col="ES", chart.assets=FALSE, element.color = "darkgray", cex.axis=0.8, xlim=NULL, ylim=NULL){
if(!inherits(object, "optimize.portfolio.pso")) stop("object must be of class 'optimize.portfolio.pso'")
R <- object$R
if(is.null(R)) stop("Returns object not detected, must run optimize.portfolio with trace=TRUE")
xtract = extractStats(object)
columnnames = colnames(xtract)
return.column = pmatch(return.col,columnnames)
if(is.na(return.column)) {
return.col = paste(return.col,return.col,sep='.')
return.column = pmatch(return.col,columnnames)
}
risk.column = pmatch(risk.col,columnnames)
if(is.na(risk.column)) {
risk.col = paste(risk.col,risk.col,sep='.')
risk.column = pmatch(risk.col,columnnames)
}
if(is.na(return.column) | is.na(risk.column)){
return.col <- gsub("\\..*", "", return.col)
risk.col <- gsub("\\..*", "", risk.col)
warning(return.col,' or ', risk.col, ' do not match extractStats output of $objective_measures slot')
wts_index <- grep("w.", columnnames)
wts <- xtract[, wts_index]
if(is.na(return.column)){
tmpret <- applyFUN(R=R, weights=wts, FUN=return.col)
xtract <- cbind(tmpret, xtract)
colnames(xtract)[which(colnames(xtract) == "tmpret")] <- return.col
}
if(is.na(risk.column)){
tmprisk <- applyFUN(R=R, weights=wts, FUN=risk.col)
xtract <- cbind(tmprisk, xtract)
colnames(xtract)[which(colnames(xtract) == "tmprisk")] <- risk.col
}
columnnames = colnames(xtract)
return.column = pmatch(return.col,columnnames)
if(is.na(return.column)) {
return.col = paste(return.col,return.col,sep='.')
return.column = pmatch(return.col,columnnames)
}
risk.column = pmatch(risk.col,columnnames)
if(is.na(risk.column)) {
risk.col = paste(risk.col,risk.col,sep='.')
risk.column = pmatch(risk.col,columnnames)
}
}
if(chart.assets){
arguments <- NULL
if(is.null(arguments)){
tmp.args <- unlist(lapply(object$portfolio$objectives, function(x) x$arguments), recursive=FALSE)
tmp.args <- tmp.args[!duplicated(names(tmp.args))]
if(!is.null(tmp.args$portfolio_method)) tmp.args$portfolio_method <- "single"
arguments <- tmp.args
}
asset_ret <- scatterFUN(R=R, FUN=return.col, arguments)
asset_risk <- scatterFUN(R=R, FUN=risk.col, arguments)
xlim <- range(c(xtract[,risk.column], asset_risk))
ylim <- range(c(xtract[,return.column], asset_ret))
} else {
asset_ret <- NULL
asset_risk <- NULL
}
plot(xtract[,risk.column],xtract[,return.column], xlab=risk.col, ylab=return.col, col="darkgray", axes=FALSE, xlim=xlim, ylim=ylim, ...)
if(length(names(object)[which(names(object)=='constrained_objective')])) {
result.slot<-'constrained_objective'
} else {
result.slot<-'objective_measures'
}
objcols<-unlist(object[[result.slot]])
names(objcols)<-name.replace(names(objcols))
return.column = pmatch(return.col,names(objcols))
if(is.na(return.column)) {
return.col = paste(return.col,return.col,sep='.')
return.column = pmatch(return.col,names(objcols))
}
risk.column = pmatch(risk.col,names(objcols))
if(is.na(risk.column)) {
risk.col = paste(risk.col,risk.col,sep='.')
risk.column = pmatch(risk.col,names(objcols))
}
if(is.na(return.column) | is.na(risk.column)){
return.col <- gsub("\\..*", "", return.col)
risk.col <- gsub("\\..*", "", risk.col)
opt_weights <- object$weights
ret <- as.numeric(applyFUN(R=R, weights=opt_weights, FUN=return.col))
risk <- as.numeric(applyFUN(R=R, weights=opt_weights, FUN=risk.col))
points(risk, ret, col="blue", pch=16)
text(x=risk, y=ret, labels="Optimal",col="blue", pos=4, cex=0.8)
} else {
points(objcols[risk.column], objcols[return.column], col="blue", pch=16)
text(x=objcols[risk.column], y=objcols[return.column], labels="Optimal",col="blue", pos=4, cex=0.8)
}
if(chart.assets){
points(x=asset_risk, y=asset_ret)
text(x=asset_risk, y=asset_ret, labels=colnames(R), pos=4, cex=0.8)
}
axis(1, cex.axis = cex.axis, col = element.color)
axis(2, cex.axis = cex.axis, col = element.color)
box(col = element.color)
}
chart.RiskReward.optimize.portfolio.pso <- chart.Scatter.pso
charts.pso <- function(pso, return.col="mean", risk.col="ES", chart.assets=FALSE, cex.axis=0.8, element.color="darkgray", neighbors=NULL, main="PSO.Portfolios", xlim=NULL, ylim=NULL, ...){
op <- par(no.readonly=TRUE)
layout(matrix(c(1,2)),heights=c(2,2),widths=1)
par(mar=c(4,4,4,2))
chart.Scatter.pso(object=pso, return.col=return.col, risk.col=risk.col, chart.assets=chart.assets, element.color=element.color, cex.axis=cex.axis, main=main, xlim=xlim, ylim=ylim, ...=...)
par(mar=c(2,4,0,2))
chart.Weight.pso(object=pso, neighbors=neighbors, las=3, xlab=NULL, cex.lab=1, element.color=element.color, cex.axis=cex.axis, ...=..., main="")
par(op)
}
plot.optimize.portfolio.pso <- function(x, ..., return.col="mean", risk.col="ES", chart.assets=FALSE, cex.axis=0.8, element.color="darkgray", neighbors=NULL, main="PSO.Portfolios", xlim=NULL, ylim=NULL){
charts.pso(pso=x, return.col=return.col, risk.col=risk.col, chart.assets=FALSE, cex.axis=cex.axis, element.color=element.color, neighbors=neighbors, main=main, xlim=xlim, ylim=ylim, ...=...)
}