2014-06-06 95 views
8

我試圖用solve.QP解決組合優化問題(二次問題)的R - 投資組合優化 - solve.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) 

艾買提被約束矩陣

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

約束甲^ T B> = B_0,B矢量

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

毫當量= 2,因爲有兩個等式約束,第一和第二約束是平等

然後我運行函數solve.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! 

我不知道,我沒有錯。

回答

9

有與您發佈的代碼的兩個問題:

  • 張貼的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%的回報率有關。