2014-11-16 1 views
0

저는 포트폴리오 최적화에 익숙하지 않습니다. 주어진 포트폴리오 가중치 w에 대해 기대 수익률과 분산은 각각 w '= q와 w'= w이다. 우리는 포트폴리오 선택 문제를 다음과 같이 정의한다. w '= 1 및 w'= q로 주어지는 분산을 최소화하기 위해, q는 기대 수익률이다. 그리고 짧은 매도는 금지되어 있습니다. 나는 똑같이 가중 된 포트폴리오를 원한다. 내가 어떻게 해? 이 코드는 맞습니까? 다른 문제, e는 그것들을 벡터화해야하나요, 아니면 quadprog가 이미 가지고 있습니까? 당신이 나를 도울 수?R의 포트폴리오 최적화

Dmat <- cov(x) #covariance matrix 
dvec <- colMeans(x) 
if(short=="no"){ 
Amat <- cbind(rep(1,20), diag(20)) # the weights sum up to 1 
    bvec <- c(1, rep(0, 20)) # No short-selling 
} 
portfolio.out <-solve.QP(Dmat, dvec, Amat, bvec, meq=1, factorized=FALSE) 
portfolio.out$solution  #portfolio weights 
sum(portfolio.out$solution) #check whether sum up to 1 
portfolio.out$value   #portfolio variance 
eff.frontier <- function (dvec, Dmat, alpha.min=0, alpha.max=1, nport=10, shorts=FALSE) 
eff.frontier$weights 

답변

1

잘 단지 등록 :

library(MASS) 
require(quadprog) 

#function to compute the EF 
eff.frontier <- function (eret,ermvp,dvec, Dmat, nport=10, shorts=FALSE){ 
    range.r <- seq(from = min(eret), to = max(eret)*ifelse(shorts,1.6,1), length.out = nport) 
    range.r <- sort(c(ermvp,range.r)) 
    uAmat=cbind(eret,Amat); # targetRet=range.r[1] 
    weigths <- t(sapply(range.r, function(targetRet) { 
    ubvec=c(targetRet,bvec) 
    round(solve.QP(Dmat, dvec, uAmat, ubvec, meq=1)$solution,6) 
    })) 
    colnames(weigths)=colnames(Dmat) 
    f.risk=sapply(1:length(range.r),function(ws)(weigths[ws,]%*%Dmat%*%weigths[ws,])^.5) 
    f.rets= weigths%*%eret 
    list(EF=data.frame(f.risk,f.rets),weigths=weigths) 
} 

# simulate returns 
periods=300 
na = 4 #number of assets 

set.seed(1234) 
Sigma <- matrix(runif(na*na,3,5),na,na) # to add some correlation 
diag(Sigma) <- runif(na,10,20) 
Sigma <- Sigma/100 
x=mvrnorm(n = periods, seq(0.015, .018, length.out=na), Sigma) #simulate returns 
colnames(x) <- sapply(1:na,function(z) 
    paste(sample(c(LETTERS,0:9),4, replace=TRUE),collapse="")) #random names 

#estimate parameters 
eret <- colMeans(x) #Expected returns 
Dmat <- cov(x) #covariance matrix 
na <- ncol(Dmat) #number of assets 
dvec <- rep(0,na) 
shorts=FALSE # short sales not considered 
if(!shorts) { 
    Amat <- diag(na) ; bvec <- rep(0, na) # No short-selling 
    Amat=cbind(Amat,rep(1,na),rep(-1,na)) #relax full investment 
    bvec=c(bvec,.9995,-1.02) # weights sum up approx 1 
} else {cat("Short sales not considered yet!!!")} 

#lets find the minimum variance portfolio 
portfolio.out <-solve.QP(Dmat, dvec, Amat, bvec, meq=1) 
(wgs=portfolio.out$solution) #portfolio weights 
wgs=wgs/sum(wgs) ;sum(wgs) #check whether sum up to 1 
portfolio.out$value*2  #minimum variance portfolio sol 
wgs%*%Dmat%*%wgs 
(wgs%*%Dmat%*%wgs)^.5 # risk = st dev 
(ermvp=wgs%*%eret) # min var expected return 

# find the EF 

efffront=eff.frontier(eret, ermvp, dvec, Dmat,nport=80) 
efffront$weigths 
efffront$EF #expected risk and return 
mvp=which.min(efffront$EF[,1]) 
cbind(efffront$EF,efffront$weigths)[mvp,] #min risk 

#plot the EF 
lims=apply(rbind(efffront$EF,cbind(f.risk=diag(Dmat)^.5,f.rets=eret)),2, 
      function(z) range(z, na.rm =TRUE)*c(0.98,1.02)) 
plot(efffront$EF, type ="p", col="darkgreen", 
    ylim = lims[,2], xlim = lims[,1], xlab=expression(sigma), 
    ylab = "E[r]", main = "Long only EF with solve.QP") 
lines(efffront$EF[mvp:length(efffront$EF[,1]),],col="blue",lwd=2) 
points(diag(Dmat)^.5,eret,pch=16,col=1:ncol(Dmat)) 
text(diag(Dmat)^.5,eret,colnames(x),col=1:ncol(Dmat),pos =4,cex=.6) 

enter image description here