2014-06-06 14 views
8

Próbuję użyć solve.QP do rozwiązania problemu optymalizacji portfela (kwadratowa problem)r - Optymalizacja portfela - solve.QP - Ograniczenia są niespójne

Razem aktywa 3

Istnieją 4 Ograniczenia:

  1. suma wag równe 1
  2. portfela oczekuje powrotu wynosi 5,2%
  3. każdy składnik masy większy niż 0
  4. każdy ciężar składnik mniejszy niż .5

Dmat jest macierzą kowariancji

Dmat <- matrix(c(356.25808, 12.31581, 261.8830, 212.31581, 27.24840, 18.50515, 261.88302, 18.50515,535.45960), nrow=3, ncol=3) 

dvec Oczekuje powrotu każdy zasób jest

dvec <- matrix(c(9.33, 3.33, 9.07), nrow=3, ncol=1) 

Amat macierz ograniczenie

A.Equality <- matrix(c(1,1,1), ncol=1) 
Amat <- cbind(A.Equality, dvec, diag(3), -diag(3)) 

ograniczenie a^t b> = b_0 b wektor

bvec <- c(1, 5.2, rep(0, 3), rep(-0.5, 3)) 

meq = 2, ponieważ istnieją dwa ograniczenia równości, pierwsze i drugie ograniczenia są równość

Potem uruchamiane funkcja solve.QP

library(quadprog) 
qp <- solve.QP(Dmat, dvec, Amat, bvec, meq=2) 

Ale daje błąd

Error in solve.QP(Dmat, dvec, Amat, bvec, meq = 2) : constraints are inconsistent, no solution! 

nie jestem pewien, gdzie zrobiłem źle.

Odpowiedz

9

Były dwie kwestie o kodzie Wysłany:

  • Oddelegowany Dmat rzeczywistości nie jest symetryczne; przypadkowo zawarłeś wartość 212,31581 zamiast 12,31581
  • Opcja meq=2 oznacza, że ​​twoje pierwsze dwa ograniczenia są utrzymywane na równi, co oznacza, że ​​twoje wagi sumują się do 1, a twój zwrot wynosi dokładnie 5,2%. Drugie ograniczenie jest najwyraźniej tym, które powoduje niewykonalność; wydaje się, że nie ma poprawnych portfeli, które zwracają dokładnie 5,2%, biorąc pod uwagę inne ograniczenia. Rzeczywiście, ponieważ nie więcej niż połowa portfela może mieć zwrot 3,33%, a reszta musi mieć zwrot co najmniej 9,07%, zwrot musi wynosić 6,2% lub więcej. Dlatego powinieneś rozluźnić to do ograniczenia> =, ustawiając meq=1.

Oto kod działa:

library(quadprog) 
Dmat <- matrix(c(356.25808, 12.31581, 261.88302, 12.31581, 27.24840, 18.50515, 261.88302, 18.50515,535.45960), nrow=3, ncol=3) 
dvec <- matrix(c(9.33, 3.33, 9.07), nrow=3, ncol=1) 
A.Equality <- matrix(c(1,1,1), ncol=1) 
Amat <- cbind(A.Equality, dvec, diag(3), -diag(3)) 
bvec <- c(1, 5.2, rep(0, 3), rep(-0.5, 3)) 
qp <- solve.QP(Dmat, dvec, Amat, bvec, meq=1) 
qp$solution 
# [1] 0.3808733 0.5000000 0.1191267 

Optymalnym rozwiązaniem jest faktycznie związana z powrotem 6,3%.

Powiązane problemy