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

r-投资组合优化-solve.QP-约束不一致,r,mathematical-optimization,portfolio,quadratic,R,Mathematical Optimization,Portfolio,Quadratic,我试图使用solve.QP来解决投资组合优化问题(二次问题) 共3项资产 有4个限制条件: 权重之和等于1 投资组合预期回报率等于5.2% 每个资产权重大于0 每个资产的权重小于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) 我不确定我哪里做错了。您发布的

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

共3项资产

有4个限制条件:

  • 权重之和等于1
  • 投资组合预期回报率等于5.2%
  • 每个资产权重大于0
  • 每个资产的权重小于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)
    

    我不确定我哪里做错了。

    您发布的代码有两个问题:

    • 发布的
      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
    
    库(quadprog)
    Dmat
    
    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))
    
    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!
    
    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