首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用quadprog进行投资组合优化

使用quadprog进行投资组合优化
EN

Stack Overflow用户
提问于 2020-06-25 21:35:12
回答 1查看 483关注 0票数 2

我有我的输入参数µ(均值向量μ)、q(协方差矩阵Q)和tau (风险容忍度τ),并且我需要返回使以下效用函数U最大化的向量h(资产权重),其定义如下:

代码语言:javascript
复制
U(h)= −1/2h^T*Q*h + τ*h^T*μ

受约束:

代码语言:javascript
复制
0 ≤ h ≤ 0.1 for all h
and sum of all h is equal to 1: h^T*e = 1

TAU以0.001为步长包含从0到0.5的数字。我如何定义这个问题的参数: Dmat、dvec、Amat和bvec?我知道金融概念,但不知道如何正确编程。

谢谢

这不起作用,因为我仍然有负权重指示卖空:(

代码语言:javascript
复制
frontieropti <- c(NULL)
i <- 1
for (i in 1:nrow(TAU)){
  solQP <- solve.QP(Dmat,TAU[i]*mu, Amat, bvec, meq = 1, factorized = F)
  sol <- c(i,solQP$value)
  frontieropti <- rbind(frontieropti,sol)
  i <- i +1
}
solQP <- solve.QP(Dmat, TAU[1]*mu, Amat, bvec, meq = 1, factorized = F)
solQP
EN

回答 1

Stack Overflow用户

发布于 2020-06-25 23:28:18

设置Amat

代码语言:javascript
复制
na <- 5  ## number of assets

我只使用了5个资源和40%的最大权重,这样我就可以显示结果矩阵:

代码语言:javascript
复制
wmin <- 0
wmax <- 0.4
A <- rbind(1,-diag(na), diag(na))
bvec <- c(1, -rep(wmax, na), rep(wmin, na))
cbind(A, bvec)
##                      bvec
##  [1,]  1  1  1  1  1  1.0
##  [2,] -1  0  0  0  0 -0.4
##  [3,]  0 -1  0  0  0 -0.4
##  [4,]  0  0 -1  0  0 -0.4
##  [5,]  0  0  0 -1  0 -0.4
##  [6,]  0  0  0  0 -1 -0.4
##  [7,]  1  0  0  0  0  0.0
##  [8,]  0  1  0  0  0  0.0
##  [9,]  0  0  1  0  0  0.0
## [10,]  0  0  0  1  0  0.0
## [11,]  0  0  0  0  1  0.0

请注意,Amat的第一行用于预算约束,因此需要将参数meq设置为1。此外,solve.QP需要Amat的转置,即t(Amat)

下面是一个完整的例子:

代码语言:javascript
复制
library("quadprog")
library("NMOF")

我首先为30个资产创建一些随机数据。

代码语言:javascript
复制
na <- 30
R <- randomReturns(na = na, ns = 120, rho = 0.5, sd = 0.03)
mu <- colMeans(R)
V <- cov(R)


wmin <- 0
wmax <- 0.1
A <- rbind(1,-diag(na), diag(na))
b <- c(1, -rep(wmax, na), rep(wmin, na))

TAU <- seq(0, 0.5, by = 0.01) ## choose an appropriate stepsize

最好在循环之前初始化数据结构,而不是“增长”它们。(尽管在本例中这并不重要。)

代码语言:javascript
复制
results <- numeric(length(TAU))
weights <- array(NA, dim = c(na, length(TAU)))
for (i in seq_along(TAU)) {
    solQP <- solve.QP(Dmat = V,
                      dvec = TAU[i]*mu,
                      Amat = t(A),
                      bvec = b, meq = 1)

    ## an equivalent computation    
    ## NMOF::mvPortfolio(mu, V, wmax = 0.1, lambda = c(TAU[i], 0.5))

    results[i] <- solQP$value
    weights[, i] <- solQP$solution
}

请注意,由于舍入误差,某些结果可能为负。因此,假设将结果四舍五入到小数点后8位。

代码语言:javascript
复制
weights <- round(weights, 8)
barplot(weights)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62576639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档