问题描述
首先让我说我是 Stack Exchange 网站的新手,如果这是一个低质量的问题,我深表歉意。
我正在尝试使用 R 中的 Solve.QP 运行均值方差投资组合优化,并在 Stack Overflow 上查看了之前的几个与此相关的问题,以找出如何正确执行此操作但没有运气。
我想要的约束如下:
- 多头/空头投资组合:权重可能为负
- 市场中性:权重总和 = 0
- 无杠杆:每个权重都在 -1 和 1 之间 + 所有正权重的总和 = 1 和所有负权重之和 = -1
我正在运行这个优化大约。 100 个资产,所以为了演示目的,我用 5 个资产(使用假数据)复制了代码的优化部分。完整代码见文末。
假设我的 5 项资产有以下 5 项预期回报
> dvec
[1] 1.0791124 0.9088370 0.0992847 -0.2028962 -1.1632315
预计有两项资产会出现负面表现,而 3 项资产预计会产生正回报。
Amat 和 bvec 看起来像这样
> cbind(amat,bvec)
bvec
[1,] 1 1 1 1 1 0
[2,] 1 1 1 0 0 1
[3,] 0 0 0 1 1 -1
[4,] 1 0 0 0 0 -1
[5,] 0 1 0 0 0 -1
[6,] 0 0 1 0 0 -1
[7,] 0 0 0 1 0 -1
[8,] 0 0 0 0 1 -1
[9,] -1 0 0 0 0 -1
[10,] 0 -1 0 0 0 -1
[11,] 0 0 -1 0 0 -1
[12,] 0 0 0 -1 0 -1
[13,] 0 0 0 0 -1 -1
- 第一行表示市场中性约束
- 第二行表示投资组合的长边必须具有加为 1 的权重
- 第三行表示短腿的权重必须加到 -1
- 接下来的 5 行表示每个单独的权重必须 >= -1
- 最后 5 行表示每个单独的权重必须
优化运行不会引发错误,但杠杆约束(并非总是)被强制执行
> sum(w_opt[w_opt>0])
[1] 1.22445
> sum(w_opt[w_opt<0])
[1] -1.22445
其中 w_opt
包含优化的权重。
> w_opt
[1] 0.73304775 0.49140239 -0.22445014 -0.01629763 -0.98370237
我已经设置了 meq=3
来指定前三个约束是等式。
library(quadprog)
omega <- cov(data.frame(x=rnorm(200),y=rnorm(200),z=rnorm(200),p=rnorm(200),q=rnorm(200)))
N <- 5
maxw <- 1
minw <- -1
dvec <- rnorm(N)
dvec <- sort(dvec,decreasing=TRUE)
dmat <- omega
amat <- rbind(1,c(rep(1,length(dvec[dvec>0])),rep(0,length(dvec[dvec<0]))),c(rep(0,rep(1,diag(N),-diag(N))
bvec <- c(0,1,-1,rep(minw,N),-rep(maxw,N))
meq <- 3
w_opt <- solve.QP(Dmat=dmat,dvec=dvec,Amat=t(amat),bvec=bvec,meq=meq)$solution
sum(w_opt[w_opt>0])
sum(w_opt[w_opt<0])
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)