我正在尝试从大量股票(890)构建最小方差投资组合,这也满足一些额外的外部约束。例如,我想检查结果投资组合是否符合某些行业权重限制,如果没有,则查找新的行业重量限制。
以下是我目前用于查找最小方差组合的代码(使用corpcor包中的cov.shrink和quadprog包中的solve.QP):
X <- as.matrix(LogReturn)
# Shrinkage estimator covariance matrix
covar <- cov.shrink(X)
N <- ncol(X)
zeros <- array(0, dim = c(N,1))
# Evaluate the optimization to generate minimum variance portfolio with no short selling and with max allocation of 0.05
aMat <- cbind(1, diag(N))
aMat <- cbind(aMat, -diag(N))
b0 <- c(1, rep(0, N))
b0 <- c(b0, rep(-0.05, N))
res <- solve.QP(covar, zeros, aMat, bvec=b0, meq = 1)
# Return portfolio attributes
y <- X %*% res$solution
port <- list(pw = round(res$solution,3), px = y, pm = mean(y), ps = sd(y))
port
以下是我计划用来检查拟议投资组合是否符合我的行业限制的代码:
Sedol <- cbind(SedolData, round(res$solution,3))
colnames(Sedol) <- c("SEDOL", "Sector", "Country", "Weight")
# Proposed sector data
L <- nrow(SectorKey)
Sector <- cbind(SectorKey, 0)
colnames(Sector) <- c("Name", "Key", "Parent", "Proposed")
bPass <- TRUE
for(i in 1:L){
for (x in 1:N){
if(Sedol[x,2] == Sector[i,2]){
Sector[i,4] <- Sector[i,4] + Sedol[x,4]
}
}
if(abs(Sector[i,3] - Sector[i,4])>0.05){
bPass <- FALSE
}
}
if(bPass == FALSE){
# add cost function?
}
我对r很新,我想知道是否有人可以建议我应该如何继续。我以为我会用某种成本函数迭代惩罚不满足我约束的投资组合,但我不知道如何在不使用solve.QP的情况下解决我的问题。我不知道如何解决这个问题。
LogReturns是我的890只股票的日志回报矩阵,有120次观察。 SedolData是每个股票所在行业的关键,用于查找每个行业的拟议投资组合的分配(第8列中每个行业的890个股票的矩阵)。 SectorKey是具有目标权重(容差5%)的扇区矩阵。
非常感谢任何帮助!