r - 投资组合优化 - solve.QP - 约束条件不一致

时间:2014-06-06 20:20:47

标签: r mathematical-optimization portfolio quadratic

我正在尝试使用solve.QP来解决投资组合优化问题(二次问题)

总计3个资产

有4个限制因素:

  1. 权重之和等于1
  2. 投资组合预期收益率等于5.2%
  3. 每个资产权重大于0
  4. 每个资产权重小于.5
  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 vector

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

    meq = 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!
    

    我不确定我在哪里做错了。

1 个答案:

答案 0 :(得分:10)

您发布的代码存在两个问题:

  • 发布的Dmat实际上并不对称;你不小心包含了值212.31581而不是12.31581
  • meq=2选项意味着您的前两个约束保持相等,这意味着您的权重总和为1,而您的回报恰好为5.2%。第二个限制显然是造成不可行性的限制;考虑到你的其他限制,似乎没有有效投资组合的回报率完全等于5.2%。实际上,由于不超过一半的投资组合可以获得3.33%的回报,其余投资必须至少回报9.07%,因此回报必须为6.2%或更高。因此,您应该通过设置meq=1
  • 将其放宽到&gt; =约束

这是工作代码:

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%的回报相关联。