使用 R 中的 quadprog 包对投资组合优化中的权重进行约束

Posted

技术标签:

【中文标题】使用 R 中的 quadprog 包对投资组合优化中的权重进行约束【英文标题】:Constraints on weight in portfolio optimization using quadprog package in R 【发布时间】:2013-05-09 20:49:01 【问题描述】:

我不熟悉使用 R 和投资组合优化。我正在尝试优化具有 7 种资产的投资组合,使资产编号 3 和 4 的最小权重分别为 0.35,并且所有 7 种资产的总和等于 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 个资产的权重超过 1,我一定是在 Amat 或 bvec 或 meq 中犯了错误。但是,我无法弄清楚那个错误是什么。

有人可以指导我如何构建这些矩阵来解决这个问题吗?提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您的答案总和为 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
# [...]

根据您的 cmets 关于做空的可能性,现在听起来您的变量应该以 -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
# [...]

【讨论】:

我该如何设置这个限制?我想要实现的是资产编号 3 和 4 至少为 0.35,这 7 种资产的总和 = 1。我想允许做空资产,因此所有其他资产在技术上的权重从 - 1 到 0.30(因为资产 3 和 4 的总和至少为 0.70)我无法为这些条件创建约束矩阵。 @Alok,请查看我的更新答案。它应该解决您的新限制。 非常感谢。我想,这给了我正确的结果。不过对 bvec 做了一点改动。 bvec &lt;- c(1, 0.35, 0.35, rep(-1, n), -0.3, -0.3, -0.35, -0.35, -0.3, -0.3, -0.3)再次感谢您的帮助!

以上是关于使用 R 中的 quadprog 包对投资组合优化中的权重进行约束的主要内容,如果未能解决你的问题,请参考以下文章

R语言解决最优化运营研究问题-线性优化(LP)问题

R语言使用caret包对GBM模型自定义参数调优:自定义优化参数网格可视化核心参数与评估指标关系Accuracy与树的深度个数的关系Kappa与树的深度个数的关系

如何在投资组合分析中以 5% 和最大回报自定义 VaR

R语言解决最优化运营研究问题-线性优化(LP)问题

拓端tecdat|python辅导基于粒子群优化的投资组合优化研究

R语言使用caret包对GBM模型参数调优SVM模型自定义参数调优RDF模型自定义参数调优(例如,ROC)重采样对多个模型的性能差异进行统计描述可视化多模型在多指标下的性能对比分析