-1

我正在尝试在 R 中执行投资组合优化(均值方差)。但是,我收到以下错误:

“solve.QP(Dmat, dvec, Amat, bvec, meq = 2) 中的错误:二次函数中的矩阵 D 不是正定的!”

我有四个约束:

  1. 预期回报率为 4.8%
  2. 权重加起来为 1
  3. 无短路
  4. 单项重量 <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.frame10,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)
4

2 回答 2

0

首先是检查您的数据和协方差矩阵的特征值。

协方差矩阵不是半正定的很少见,但也有可能。我只在资产数量超过观察次数(链接)的情况下看到了这一点。在您的情况下,我可能会稍微扰乱协方差矩阵:在对角线上添加少量数字。一些求解器会自动执行此操作。

于 2018-08-04T01:46:38.540 回答
0

仍然找不到半正定矩阵,我推荐nearest_spd()函数,它可以找到最近的半正定矩阵。

于 2021-12-05T14:23:18.530 回答