2014-06-06 43 views
8

Ich versuche solve.QP zu verwenden, um ein Portfolio Optimierungsproblem (quadratisches Problem)r - Portfolio-Optimierung - solve.QP - Constraints sind inkonsistente

Insgesamt 3 Vermögenswerte zu lösen

Es gibt 4 Einschränkungen:

  1. Summe der Gewichte gleich 1
  2. Portfolio erwartete Rendite beträgt 5,2%
  3. jedes Asset Gewicht von mehr als 0
  4. jedes Asset Gewicht kleiner als .5

DMAT die Kovarianzmatrix

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 jeder

erwarteten Ertrag des Vermögenswerts ist
dvec <- matrix(c(9.33, 3.33, 9.07), nrow=3, ncol=1) 

Amat wird die Beschränkungsmatrix

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

Constraint A^T b> = B_0, b Vektor

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

meq = 2, da es zwei Gleichheitsbedingungen, erste und zweite Randbedingungen sind Gleichheit

Dann führen die Funktion I solve.QP

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

Aber es gibt den Fehler

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

ich bin nicht sicher, wo ich falsch gemacht habe.

Antwort

9

gab es zwei Probleme mit dem Code, den Sie geschrieben:

  • Die entsandte Dmat ist eigentlich nicht symmetrisch; Sie haben versehentlich den Wert 212.31581 anstelle von 12.31581
  • eingegeben. Die Option meq=2 bedeutet, dass Ihre ersten beiden Bedingungen bei Gleichheit gehalten werden, was bedeutet, dass Ihre Gewichte zu 1 addiert werden und Ihre Rendite genau 5,2% beträgt. Die zweite Einschränkung ist anscheinend diejenige, die die Unmöglichkeit verursacht; Es scheint, dass es keine gültigen Portfolios gibt, die genau 5,2% entsprechen, wenn Sie andere Einschränkungen beachten. In der Tat, da nicht mehr als die Hälfte des Portfolios eine Rendite von 3,33% haben kann und der Rest eine Rendite von mindestens 9,07% haben muss, muss die Rendite 6,2% oder höher betragen. Daher sollten Sie dies auf eine> = Einschränkung reduzieren, indem Sie meq=1 einstellen.

Hier ist der Arbeitscode:

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 

Die optimale Lösung ist eigentlich mit einer 6,3% Rendite verbunden.