0

首先让我说我是 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 行表示每个单独的权重必须 <= 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])
4

0 回答 0