2014-06-06 14 views
8

Sto cercando di utilizzare solve.QP per risolvere un problema di ottimizzazione del portafoglio (problema quadratica)r - Portfolio Optimization - solve.QP - I vincoli sono incoerenti

Totale 3 Attività

Ci sono 4 vincoli:

  1. somma dei pesi pari a 1
  2. portafoglio rendimento atteso è pari al 5,2%
  3. ogni peso risorsa maggiore di 0
  4. ciascun peso risorsa più piccolo .5

DMAT è la matrice di covarianza

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 è rendimento atteso di ciascuna risorsa

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

Amat è la matrice dei vincoli

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

vincolo A^T b> = b_0, b vettore

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

meq = 2, poiché ci sono due vincoli di uguaglianza, primo e secondo sono vincoli parità

Poi corro la funzione solve.QP

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

Ma dà l'errore

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

non sono sicuro dove ho sbagliato.

risposta

9

C'erano due problemi con il codice che avete inviato:

  • Il postato Dmat in realtà non è simmetrica; hai accidentalmente incluso il valore 212.31581 invece di 12.31581
  • L'opzione meq=2 significa che i tuoi primi due vincoli sono tenuti all'uguaglianza, vale a dire che i tuoi pesi sono pari a 1 e il tuo rendimento è esattamente del 5,2%. Il secondo vincolo è apparentemente quello che causa l'infallibilità; sembra che non ci siano portafogli validi che hanno un rendimento esattamente uguale al 5,2%, dati i tuoi altri vincoli. Infatti, poiché non più della metà del portafoglio può avere un rendimento del 3,33% e il resto deve avere un rendimento di almeno il 9,07%, il rendimento deve essere del 6,2% o superiore. Pertanto, dovresti rilassarlo fino a un> = vincolo impostando meq=1.

Ecco il codice di lavoro:

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 

La soluzione ottimale è in realtà associato un rendimento del 6,3%.