r - Оптимизация портфеля - решить.QP - Ограничения несовместимы

Я пытаюсь использовать resolve.QP для решения задачи оптимизации портфеля (квадратичной задачи)

Всего 3 актива

Есть 4 ограничения:

  1. сумма весов равна 1
  2. ожидаемая доходность портфеля составляет 5,2%
  3. вес каждого актива больше 0
  4. вес каждого актива меньше 0,5

Dmat - ковариационная матрица

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 - ожидаемая доходность каждого актива

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

Amat - матрица ограничений

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

ограничение A ^ T b> = b_0, b вектор

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

meq = 2, так как есть два ограничения равенства, первое и второе ограничения являются равенством

Затем я запускаю функцию resolve.QP

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

Но дает ошибку

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

Не знаю, где я ошибся.


person user3716379    schedule 06.06.2014    source источник


Ответы (1)


В опубликованном вами коде возникли две проблемы:

  • Опубликованный Dmat на самом деле не симметричен; вы случайно включили значение 212,31581 вместо 12,31581
  • Параметр meq=2 означает, что ваши первые два ограничения равны, то есть ваши веса в сумме равны 1, а ваша доходность составляет ровно 5,2%. Второе ограничение, по-видимому, является причиной невозможности; похоже, что нет действительных портфелей с доходностью, равной 5,2% с учетом других ваших ограничений. Действительно, поскольку не более половины портфеля может иметь доходность 3,33%, а остальная часть должна иметь доходность не менее 9,07%, доходность должна составлять 6,2% или больше. Следовательно, вы должны ослабить это до ограничения> =, установив meq=1.

Вот рабочий код:

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

Оптимальное решение фактически связано с доходностью 6,3%.

person josliber♦    schedule 06.06.2014