我有名为dat
和res
的列表,每个列表包含33个数据集。 Iam使用for loop
运行全局最小方差投资组合,如下所示:
for(i in dat) {
N <- ncol(i)
Amat <- t(rbind( rep(1,N), diag(rep(1,N)), diag(rep(-1,N))))
bvec <- c(1 , rep(0,N), rep(-0.15,N))
Dmat <- cov.shrink(i) #from tawny package
dvec <- rep(0,N)
mvw <- solve.QP( Dmat, dvec, Amat, bvec, meq = 1 )$solution #from quadprog package
names(mvw) = colnames(i)
}
它的工作,但当然只保存最后一次迭代。我不知道如何保存它们。我需要将所有33个mvw
结果保存在列表中。我该怎么办?
之后,我必须使用等效的mvw
数据集评估res
的结果:
mvwreturns = res%*%matrix(mvw,ncol=1)
这个命令给我评估每个时期的投资组合。每个mvw
数据都与一个res
数据集匹配。我怎样才能做到这一点?我想知道是否必须再运行for loop
。
感谢任何帮助。抱歉我的英语很差。
答案 0 :(得分:1)
您可以执行以下操作:
在循环之前启动一个空列表mvw。然后将每个数据集添加为列表中的新元素:
mvw <- NULL #initiate list
counter <- 1
for(i in dat ) {
N <- ncol(i)
Amat <- t(rbind( rep(1,N), diag(rep(1,N)), diag(rep(-1,N))))
bvec <- c(1 , rep(0,N), rep(-0.15,N))
Dmat <- cov.shrink(i) #from tawny package
dvec <- rep(0,N)
mvw[[counter]] <- solve.QP( Dmat, dvec, Amat, bvec, meq = 1 )$solution) #from quadprog package
#for each iteration mvw will be stored as the i-th element in a list
names(mvw[[counter]]) = names(i)
counter <- counter + 1
}
然后以与以前相同的方式再做一个小循环,做你想做的事情:
mvwreturns <- NULL
for ( i in 1:length(mvw) {
mvwreturns[i] = res[i]%*%matrix(mvw[i],ncol=1)
}
抱歉,我没有任何数据来运行您的脚本,但您明白了。
希望它有所帮助。
答案 1 :(得分:0)
不要使用for循环,请查看mapply
。将要在每个条目上运行的代码保存到一个函数中,该函数返回mvw,将dat
和res
推送到具有所述函数的mapply调用中,并且它应该为每个函数拆分结果集的列表来自dat
和res
的元素。