我试图在循环内使用优化来最小化3股票投资组合的方差。我所做的是计算从1980-01-01到1989-12-31之间的股票收益和cov矩阵,并使用solve.QP针对minvar投资组合进行优化。从这里开始,我想计算每年最新的2010-12-31的minvar投资组合,并将权重和最优值存储在一个向量中。我的代码如下:
library(quantmod)
library(FRAPO)
library(quadprog)
getSymbols(c("F","AA","IBM"),from="1980-01-01",to="2010-12-31")
port=cbind(F$F.Adjusted,AA$AA.Adjusted,IBM$IBM.Adjusted)
portret=returnseries(port,"discrete",trim=TRUE)
portret=data.frame(date=index(portret),coredata=portret)
colnames(portret)=c("time","F","AA","IBM")
#to determine where to end portA
which(portret=="1989-12-29",arr.ind=TRUE)
#row number 2527 references date 1989-12-29
portA=subset(portret,select=c("F","AA","IBM"),subset=portret[,1]<portret[2527,1])
portAcov=cov(portA)
Dmat=portAcov
dvec=c(0,0,0)
A=c(1,1,1)
B=diag(3)
portAmeans=colMeans(portA)
Amat=cbind(A,portAmeans,B)
bvec=c(1,0,0,0,0)
sol=solve.QP(Dmat,dvec,Amat,bvec,meq=1)
#this gives me my minvar port weights for up to year 1990
portB=subset(portret,select=c("F","AA","IBM"),subset=portret[,1]>=portret[2527,1])
w=matrix(0,nrow(portB),3)
w[1,1:3]=sol$solution
v[1]=sol$value
v=matrix(0,nrow(portB),1)
for(i in (which(portret=="1990-01-02",arr.ind=TRUE)[1]:
which(portret=="2010-12-31",arr.ind=TRUE)[1])){
Dmat=cov(subset(portret[,2:4],select=c("F","AA","IBM"),subset=portret[,1]
<portret[i,1]))
sol2=solve.QP(Dmat,dvec,Amat,bvec,meq=1)
for(j in 2:nrow(portB)){
w[j,1:3]=sol2$solution
v[j,]=sol2$value}}
由于某种原因,我的权重向量w和值向量v等于所有相同的数字。几天来我一直在处理这段代码而且无法弄明白。另外,我想要年度值和权重(即1990年,1991年,1992年...... 2010年的最佳minvar权重和相应的值)。有一个简单的方法吗?