使用quadprog进行投资组合优化

使用quadprog进行投资组合优化,r,optimization,finance,portfolio,quadratic,R,Optimization,Finance,Portfolio,Quadratic,我有我的输入参数mu(平均向量μ)、Q(协方差矩阵Q)和tau(风险容忍度τ),我需要返回向量h(资产权重),该向量使以下效用函数U最大化,由以下公式定义: U(h)= −1/2h^T*Q*h + τ*h^T*μ 受限制: 0 ≤ h ≤ 0.1 for all h and sum of all h is equal to 1: h^T*e = 1 TAU包含从0到0.5的数字,步长为0.001。我如何为这个问题定义参数:Dmat、dvec、Amat和bvec?我知道财务概念,但不知道如何正

我有我的输入参数mu(平均向量μ)、Q(协方差矩阵Q)和tau(风险容忍度τ),我需要返回向量h(资产权重),该向量使以下效用函数U最大化,由以下公式定义:

U(h)= −1/2h^T*Q*h + τ*h^T*μ
受限制:

0 ≤ h ≤ 0.1 for all h
and sum of all h is equal to 1: h^T*e = 1
TAU包含从0到0.5的数字,步长为0.001。我如何为这个问题定义参数:Dmat、dvec、Amat和bvec?我知道财务概念,但不知道如何正确编程

多谢各位

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


frontieropti设置
Amat

na <- 5  ## number of assets
我首先为30个资产创建一些随机数据

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

na这些幻灯片展示了如何使用package
quadprog
进行均值-方差优化。参考代码位于。我很欣赏这些资料,但我已经有了幻灯片和类似的代码。我只是想寻找一些解决我问题的代码,以便我可以继续完成其他部分。比如非常明确的变量定义.等于或小于10%是什么让我感到困惑,以及如何在Amat中正确定义它。你是故意跳过所有的
i
?@Jan你能解释一下吗。
i
正在查看
TAU
,它是一个以0.001为增量从零到0.5的数字数组,或者,正如我所写的,是一个数组的不同行具有相同数字的矩阵。我只是在
TAU
矩阵中逐行进行,但我是否无意中跳过了所有的偶数???
for
循环负责增量本身。语句
感谢您的回答,我遵循您的想法,但有几个后续步骤。既然我有e二次函数第二项中包含的风险容忍度tau
τ*h^T*μ
。我为我的案例修改了你的代码(我有30项资产,最多10%,没有卖空)。此外,如果你的代码中有a,你说solve.QP只需要T(a)作为一个输入?谢谢你的帮助,这是一个如此大的矩阵没有帮助。我感谢你我在我的原始问题中包含了我的解决方案循环,但它仍然给我显示卖空的负权重。我已经添加到我的答案中。这一切都很好,我遵循你的逻辑,它似乎已经起作用。快速跟进但是,您是否只包含了
cbind(A,b)
在您第一次回答在一个输出中同时显示A和b时,我的印象是,Amat是定义约束的矩阵,在该约束下,我们希望最小化二次函数。那么,为什么bvec不是Amat的一部分?我试图区分为什么权重约束也不是Amat的一部分?此外,是否有办法使A和b最小化o区分最佳投资组合的预期收益和收益的标准偏差。根据您的逻辑,
results
存储循环每次迭代的每个解决方案。那么,这个结果矩阵的最大值是否就是具有最佳可能收益的投资组合及其相应权重?我正在尝试存储每个结果投资组合收益率和标准差,然后绘制有效边界。我对这些优化非常陌生,但我非常接近于理解。非常感谢
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
library("quadprog")
library("NMOF")
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
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
}
weights <- round(weights, 8)
barplot(weights)