首先让我说我是 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 行表示每个单独的权重必须 <= 1
优化运行不会引发错误,但(并非总是)强制执行杠杆约束
> 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,length(dvec[dvec>0])),rep(1, length(dvec[dvec<0]))), 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])