Wildeteddy
Wildeteddy

Reputation: 11

Plot multiple graphs in one figure using a loop

I need to compute the efficient frontier with different risk measure and to use a bootstrapping technique to simulate possible outcome. However, now I'm stuck: what I want to do is to generate via a loop (which will be integrated later into a function) multiple efficient frontier, each one associated to a possible future outcome, and to plot them on the same figure in such a way to see how they may change as the simulation goes on. Here is the loop that I wrote so far:

for (i in 1:B) { 
  idx <- sample(1:N, N, replace = TRUE) 
  new.x <- x[idx, ] 
  µ.b <- apply(X = new.x, 2, FUN = mean) 
  range.b[, i] <- seq(from = min(µ.b), to = max(µ.b), length.out = steps) 
  sigma.b <- apply(X = new.x, 2, FUN = sd) 
  riskCov.b[, i] <- sapply(range.b[, i], function(targetReturn) { 
    w <- MV_QP(new.x, targetReturn, Sigma) 
    sd(c(new.x %*% w)) 
    }) 
  xlim.b <- range(c(sigma.b, riskCov.b[, 1]), na.rm = TRUE) 
  ylim.b <- range(µ.b) 
  par(new = TRUE) 
  plot(x = riskCov.b[, i], y = range.b[, i], type = "l", xlim = xlim.b, ylim = ylim.b, xlab = "Risk", ylab = "Return", main = "Resampling EFs") 
} 

but the problem is that the elements on the x and y axis are rewriting each time the loop runs. How can this problem be solved?

Upvotes: 1

Views: 821

Answers (1)

Robert
Robert

Reputation: 5152

I don't nknow if the optimization is correct. For ploting you can try the following:

for (i in 1:B) { 
  idx <- sample(1:N, N, replace = TRUE) 
  new.x <- x[idx, ] 
  µ.b <- apply(X = new.x, 2, FUN = mean) 
  range.b[, i] <- seq(from = min(µ.b), to = max(µ.b), length.out = steps) 
  #sigma.b <- apply(X = new.x, 2, FUN = sd) 
  riskCov.b[, i] <- sapply(range.b[, i], function(targetReturn) { 
    w <- MV_QP(new.x, targetReturn,Sigma=cov(new.x))
    sd(c(new.x %*% w)) 
  }) 
}

xlim.b <- range(c(apply(X = x, 2, FUN= sd), riskCov.b), na.rm = TRUE) *c(0.98,1.02)
  ylim.b <- range(µ.b) *c(0.98,1.02)
  #par(new = TRUE) 
for (i in 1:B){
  if (i==1) plot(x = riskCov.b[, i], y = range.b[, i], type = "l", xlim = xlim.b, ylim = ylim.b, xlab = "Risk", ylab = "Return", main = "Resampling EFs") else
  lines(x = riskCov.b[, i], y = range.b[, i],col=rainbow(B)[i])
}

Depending on your data, you should end up with a similar plot: enter image description here

Upvotes: 1

Related Questions