使用r和solve.QP进行投资组合优化

时间:2012-12-04 19:26:31

标签: r optimization finance portfolio

我试图使用r来解决我的投资组合优化类的二次规划问题。我想将我的答案与书中的答案进行比较 这是问题所在:     min: t(c)%*%x + .5*t(x)%*%BigC%*%x
st: -x <=0, i=1...5
and: sum(x)=1

这是我的代码:

A = matrix( c( 1,1,1,1,1, -1,0,0,0,0, 0,-1,0,0,0, 0,0,-1,0,0, 0,0,0,-1,0, 0,0,0,0,-1), ncol=5, byrow=T)
b = matrix( c( 1,0,0,0,0,0), ncol=1)
c = matrix( c( 1,-2,3,-4,5), ncol=1)
BigC = matrix( c( 1,0,0,0,0,  0,2,0,0,0,  0,0,3,0,0,  0,0,0,4,0,  0,0,0,0,5), ncol=5, byrow=T)
x0 = matrix( c( 0.2,0.2,0.2,0.2,0.2), ncol=1)
n = 5
m = 5
q = 1
solve.QP( Dmat=BigC, dvec=t(c), Amat=t(A), bvec=t(b), meq=1)

但它会引发以下错误:

Error in solve.QP(Dmat = BigC, dvec = t(c), Amat = t(A), bvec = t(b),  : 
  constraints are inconsistent, no solution!

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

?solve.QP doc提及

  

具有约束A ^ T b> = b_0的形式min(-d ^ T b + 1/2 b ^ T D b)的问题。

所以你至少有两件事是错的:

  • A中用于表达x_i >= 0约束
  • 的符号
  • dvec应为-t(c)

我们还要提一下

  • 将来,重要的是你提到你正在使用quadprog包,
  • solve.QP采用向量,因此您无需创建矩阵并对其进行转置,
  • 你应该避免命名变量c,因为它是R中常用函数的名称,
  • 您的部分代码未被使用,因此与问题无关,
  • 方便的diag功能。

考虑到所有这些,这就是你要找的东西:

library(quadprog)

A    <- rbind(rep(1, 5), diag(5))
b    <- c( 1,0,0,0,0,0)
tc   <- c( 1,-2,3,-4,5)
BigC <- diag(1:5)

solve.QP(Dmat = BigC, dvec = -tc, Amat = t(A), bvec = b, meq = 1)