Quadprog 用于带约束的投资组合优化

问题描述

首先让我说我是 Stack Exchange 网站的新手,如果这是一个低质量的问题,我深表歉意。

我正在尝试使用 R 中的 Solve.QP 运行均值方差投资组合优化,并在 Stack Overflow 上查看了之前的几个与此相关的问题,以找出如何正确执行此操作但没有运气。

我想要的约束如下:

  1. 多头/空头投资组合:权重可能为负
  2. 市场中性:权重总和 = 0
  3. 无杠杆:每个权重都在 -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 (将#修改为@)