基本的に、株式の超過リターン (R) と期待超過リターン (ER) を含む 2 つの行列があります。
R<-matrix(runif(47*78),ncol = 78)
ER<-matrix(runif(47*78),ncol = 78)
次に、これらを組み合わせて、R の最初の行を削除し、ER の最初の行を追加して、新しい行列 R1 を形成します。
次に、R2 に対してこれを行います。つまり、R の最初の 2 行を削除し、ER の最初の 2 行と rbind します。
R1 から R47 までの n-1 個の新しい行列ができるまで、これを行います。
次に、cov()、つまり Var-Cov1 から Var-Cov47 を使用して、各 Return 行列の Var-Cov 行列を見つけます。
n<-47
switch_matrices <- function(mat1, mat2, nrows){
rbind(mat1[(1+nrows):nrow(mat1),],mat2[1:nrows,])
}
l<-lapply(1:n-1, function(nrows) switch_matrices(R,ER, nrows))
list2env(setNames(l,paste0("R",seq_along(l))), envir = parent.frame())
b<-lapply(l, cov)
list2env(setNames(b,paste0("VarCov",seq_along(b))), envir = parent.frame())
現在、quadprog を使用して資産配分を見つけようとしています。たとえば、次のようになります。
D_mat <- 2*VarCov1
d_vec <- rep(0,78)
A_mat <- cbind(rep(1,78),diag(78))
b_vec <- c(1,d_vec)
library(quadprog)
output <- solve.QP(Dmat = D_mat, dvec = d_vec,Amat = A_mat, bvec = b_vec,meq =1)
# The asset allocation
(round(output$solution, 4))
Var-Cov 行列が見つかった状態で solve.QP を実行すると、何らかの理由で次のエラーが発生します。
Error in solve.QP(Dmat = D_mat, dvec = d_vec, Amat = A_mat, bvec = b_vec, :
matrix D in quadratic function is not positive definite!
私は何が間違っているのか、あるいはなぜこれが機能しないのかさえ疑問に思っています。