作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚开始使用 R 和投资组合优化。我正在尝试优化包含 7 种 Assets 的投资组合,使得 Assets 号 3 和 4 的最小权重均为 0.35,并且所有 7 种 Assets 的总和等于 1。以下是我尝试过的代码:
library(quadprog)
dmat <- cov(dr) #dr stores the daily return of the 7 assets and is a timeSeries object
dvec <- colMeans(dr)
c1 <- c(0,0,1,0,0,0,0)
c2 <- c(0,0,0,1,0,0,0)
amat <- t(rbind(matrix(1, ncol = ncol(dmat)), c1, c2)) #used transpose because earlier when I didn't use the transpose I got an error saying amat and dvec are not compatible
bvec <- matrix(c(1,0.35, 0.35), nrow =3)
meq <- 1
sol <- solve.QP(dmat, dvec, amat, bvec, meq)
这是我从上面的代码中得到的答案:
$solution
[1] -0.01619018 -2.10640140 0.35000000 0.35000000 -0.82522310 1.27499728 1.97281741
$value
[1] -0.0007364101
$unconstrained.solution
[1] 0.026872891 12.595238193 -0.256430652 0.008918392 0.743618974 2.212816019 3.749097189
$iterations
[1] 4 0
$Lagrangian
[1] 0.0002874682 0.0002846590 0.0003015167
$iact
[1] 1 3 2
由于该解决方案的 2 个 Assets 的权重超过 1 个,因此我一定在 Amat 或 bvec 或 meq 中犯了错误。但是,我无法弄清楚这个错误是什么。
有人可以指导我如何构建这些矩阵来解决这个问题吗?预先感谢您的帮助。
最佳答案
您的答案总和为 1,但允许某些权重大于 1 的原因是您没有将权重限制为正数。如果这就是您想要的,您需要为每个变量添加一个约束。这有效:
dr <- matrix(runif(100*7), 100, 7) # made up data for this example
n <- ncol(dmat)
dmat <- cov(dr)
dvec <- colMeans(dr)
c1 <- c(0,0,1,0,0,0,0)
c2 <- c(0,0,0,1,0,0,0)
amat <- t(rbind(matrix(1, ncol = n), c1, c2, diag(n)))
bvec <- c(1, 0.35, 0.35, rep(0, n))
meq <- 1
solve.QP(dmat, dvec, amat, bvec, meq)
# $solution
# [1] 0.0000000 0.0291363 0.3500000 0.4011211 0.0000000
# [6] 0.0000000 0.2197425
# [...]
根据您对短路可能性的评论,现在听起来您的变量应该以 -1 和 1 为界。然后使用:
amat <- t(rbind(matrix(1, ncol = n), c1, c2, diag(n), -diag(n)))
bvec <- c(1, 0.35, 0.35, rep(-1, n), -rep(1, n))
solve.QP(dmat, dvec, amat, bvec, meq)
# $solution
# [1] -0.51612776 0.30663800 0.35000000 0.54045253 -0.14679397
# [6] 0.02342572 0.44240548
# [...]
关于r - 使用 R 中的 Quadprog 包进行投资组合优化中的权重约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16562379/
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我是一名优秀的程序员,十分优秀!