我正在尝试在 R 中执行投资组合优化(均值方差)。但是,我收到以下错误:
“solve.QP(Dmat, dvec, Amat, bvec, meq = 2) 中的错误:二次函数中的矩阵 D 不是正定的!”
我有四个约束:
- 预期回报率为 4.8%
- 权重加起来为 1
- 无短路
- 单项重量 <0.7
下面是我的代码:
library(quadprog)
library(readxl)
#Input data
rnd_m <- read_excel("AssetData.xlsx", sheet = "Tabelle3")
ast_nr <- ncol(rnd_m) #number of assets
#Covariance Matrix
Dmat <- cov(rnd_m)
#Expected Returns Vector used for optimization
dvec <- matrix(colMeans(rnd_m), nrow=ast_nr, ncol=1)
#Constraints of optimization
A.Equality <- matrix(rep(1,ast_nr), ncol=1)
Amat <- cbind(A.Equality, dvec, diag(ast_nr), -diag(ast_nr))
bvec <- c(1, 4.8, rep(0, ast_nr), rep(-0.7, ast_nr))
qp <- solve.QP(Dmat, dvec, Amat, bvec, meq=2)
输入数据是data.frame
10,000 行(返回数据)和 10 列(资产)。
非常感谢您的帮助!!!
编辑:由于我不能使用solve.QP,我用ipop(kernlab)尝试了它,但我在正确设置参数时遇到了困难。我仍然需要 l、u 和 r。
#Input data
rnd_m <- read_excel("AssetData.xlsx", sheet = "Tabelle3")
ast_nr <- ncol(rnd_m)
#Covariance Matrix
H <- cov(rnd_m)
#Expected Returns Vector
c <- colMeans(rnd_m)
#Constraints
A.Equality <- matrix(rep(1,ast_nr), ncol=1)
A <- cbind(A.Equality, c, diag(ast_nr), -diag(ast_nr))
b <- c(1, 1, rep(0, ast_nr), rep(-0.7, ast_nr))
qp <- ipop(c, H, A, b)