1

基本的に、株式の超過リターン (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!

私は何が間違っているのか、あるいはなぜこれが機能しないのかさえ疑問に思っています。

4

1 に答える 1

1

入力行列が正定値ではありません。これは、最適化アルゴリズムの必要条件です。

行列が正定でない理由は、特定のデータ (ランダムに生成された例ではなく、実際のデータ) に関係しており、統計的および主題固有の質問の両方になります。

ただし、プログラミングの観点からは回避策があります。パッケージから使用nearPDMatrixて、実行可能な代替手段として最も近い正定行列を見つけることができます。

# Data generated by code in the question using set.seed(123)
library(quadprog)
library(Matrix)
pd_D_mat <- nearPD(D_mat)

output <- solve.QP(Dmat = as.matrix(pd_D_mat$mat), 
                   dvec = d_vec,
                   Amat = A_mat, 
                   bvec = b_vec,
                   meq  = 1)

# The asset allocation
(round(output$solution, 4))

 [1] 0.0052 0.0000 0.0173 0.0739 0.0000 0.0248 0.0082 0.0180 0.0000 0.0217 0.0177 0.0000 0.0000 0.0053 0.0000 0.0173 0.0216 0.0000
[19] 0.0000 0.0049 0.0042 0.0546 0.0049 0.0088 0.0250 0.0272 0.0325 0.0298 0.0000 0.0160 0.0000 0.0064 0.0276 0.0145 0.0178 0.0000
[37] 0.0258 0.0000 0.0413 0.0000 0.0071 0.0000 0.0268 0.0095 0.0326 0.0112 0.0381 0.0172 0.0000 0.0179 0.0000 0.0292 0.0125 0.0000
[55] 0.0000 0.0000 0.0232 0.0058 0.0000 0.0000 0.0000 0.0143 0.0274 0.0160 0.0000 0.0287 0.0000 0.0000 0.0203 0.0226 0.0311 0.0345
[73] 0.0012 0.0004 0.0000 0.0000 0.0000 0.0000
于 2016-08-24T17:42:15.253 に答える