2016-08-24 11 views
1

Итак, у меня есть две матрицы, содержащие избыточные доходы запасов (R) и ожидаемый избыточный доход (ER).Ошибка в решении.QP

R<-matrix(runif(47*78),ncol = 78) 
ER<-matrix(runif(47*78),ncol = 78) 

я затем объединить их удаление первой строки R и добавление первого ряда ER, чтобы сформировать новую матрицу R1.

Затем я делаю это для R2, ​​то есть удаляя первые два ряда и R и переставляя его с помощью первых двух рядов ER.

Я делаю это, пока у меня нет n-1 новых матриц от R1 до R47.

Затем я нахожу матрицу Var-Cov каждой матрицы Return, используя cov(), то есть Var-Cov1, Var-Cov47.

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)) 

По какой-то причине при запуске solve.QP с любой матрицей Var-Cov нашел, что я получаю эту ошибку:

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! 

Я задаюсь вопросом, что я делаю неправильно или даже почему Это не работает.

ответ

1

Входная матрица не является positive definite, что является необходимым условием для алгоритма оптимизации.

Почему ваша матрица не является положительно определенной, будет связана с вашими конкретными данными (реальными данными, а не случайным образом сгенерированным примером) и будет представлять собой как статистический, так и предметный вопрос.

Однако с точки зрения программирования существует обходное решение. Мы можем использовать nearPD из Matrix пакета, чтобы найти ближайшую положительно определенную матрицу в качестве жизнеспособной альтернативы:

# 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