Enrique,
Rather than computing the entire efficient frontier, you could do a binary
search around your target risk. This would involve many fewer optimizations
than computing the entire range. I have used this approach using solve.QP for
portfolio optimization problems (but I would think you could adapt it to
fPortfolio). See code fragments below:
# Functions we use for optimization
# This function can be used to obtain two values: opt(.....)$solQPw and/or
opt(.....)$Psd
opt <- function(K, DMAT, DVEC, AMATRIX,BOVEC,MEQ) {
solQP<-solve.QP(DMAT,K*DVEC,AMATRIX,bvec=BOVEC,meq=MEQ)
solQPw<-as.array(solQP$solution)
#Variance of portfolio
Psd <- (t(solQPw)%*%Dmat%*%(solQPw))^(0.5)
return(solQPw, Psd)
}
# Very fast way to home in on right k to hit vol target
BinarySrch <- function(STRT, END, TARG, DMAT, DVEC, AMATRIX, BOVEC, MEQ) {
if (STRT > END) {
return (-1); # Couldn't find k that meets target
} else {
Mid = (STRT + END)/2
sDiff = opt(Mid, DMAT, DVEC, AMATRIX,BOVEC,MEQ)$Psd - TARG
Diff = abs(sDiff)
if (Diff < 0.0001) {
return(Mid);
} else if (sDiff < 0) { # add/subtract a constant to Mid to make sure we
don't do this forever!
return(BinarySrch(Mid + 0.00001, END, TARG, DMAT, DVEC, AMATRIX, BOVEC,
MEQ))
} else if (sDiff > 0) {
return(BinarySrch(STRT, Mid - 0.00001, TARG, DMAT, DVEC, AMATRIX, BOVEC,
MEQ))
}
}
}
# How we use the functions.......
if (opt(500, Dmat, dvec, Amatrix, boVec, meq)$Psd < volTarg) { #if will never
exceed volTarg
sol <- rbind(sol, opt(500, Dmat, dvec, Amatrix, boVec, meq)$solQPw)
} else if (opt(0, Dmat, dvec, Amatrix, boVec, meq)$Psd > volTarg) { #if will
always exceed volTarg
sol <- rbind(sol, opt(0, Dmat, dvec, Amatrix, boVec, meq)$solQPw)
} else { # else find the right k that gets us to the volTarg
k = BinarySrch(0, 500, volTarg, Dmat, dvec, Amatrix, boVec, meq)
sol <- rbind(sol, opt(k, Dmat, dvec, Amatrix, boVec, meq)$solQPw)
}
Hope that is helpful.
Best,
Hugh
Hi,
?
Does anybody know whether is it possible to optimize with fPortfolio (I'm
using v260.72 under R 2.7.2) defining the target risk? I know it is possible
to set the target return and obtain the minimum variance portfolio, but is it
possible to solve the dual problem of setting the target (volatility) risk
and getting the point on the efficient frontier that maximizes the return given
that risk?
?
The only way I've found is an indirect one: compute the whole efficient
frontier, then select the point with the risk closest to the target. But this
seems inefficient and depends on the actual search grid used...