我有我的输入参数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 <- 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
答案 0 :(得分:0)
设置Amat
:
na <- 5 ## number of assets
我仅使用5种资产,最大权重为40%,因此我可以显示所得矩阵:
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)
。
因此,这将是一个完整的示例:
library("quadprog")
library("NMOF")
我首先为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
好的做法是在循环之前初始化数据结构, 而不是“成长”他们。 (即使在此示例中没有太大关系。)
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位。
weights <- round(weights, 8)
barplot(weights)