我正在尝试使用循环内的优化来最小化 3 个股票投资组合的方差。我所做的是计算从 1980 年 1 月 1 日到 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 权重和相应的值)。有没有简单的方法来做到这一点?