在R中实现Ehling和Ramos(2006)均值方差效率测试的solve.QP报错解决
解决solve.QP中"Amat和dvec不兼容"错误
问题背景
正在复现Ehling和Ramos(2006)提出的企业投资组合与基准指数多样化收益对比测试:
- 基准为500家公司构成的等权(EW)指数
- 测试投资组合包含35家公司
- 优化目标:$\min w'\Sigma w - v$,约束条件为$w'1 = 1$、$w'\mu = \beta$,且不允许卖空($w_i \geq 0$)
错误原因
solve.QP函数对矩阵维度有严格要求:
Dmat需为$n \times n$矩阵($n$为资产数量,此处是35)dvec需为长度$n$的向量Amat需为$n \times m$矩阵($m$为约束总数),每一列对应一个约束,约束形式为$Amat^T w \geq bvec$- 你当前的
Amat是$2 \times 35$(行是约束,列是资产),维度完全颠倒,导致与dvec(长度35)不兼容。此外还未添加卖空约束。
修正后的代码
library(quadprog) # 基础数据计算 Sigma <- cov(returns) # 直接用cov返回的矩阵,无需再转成matrix mu <- colMeans(returns) v <- var(monthly_index$Return) beta <- mean(monthly_index$Return) gamma <- cov(returns, monthly_index$Return) # 二次规划参数准备 Dmat <- 2 * Sigma # solve.QP默认目标是0.5*w'Dmatw - dvec'w,所以这里用2*Sigma对应原目标w'Sigmaw dvec <- rep(0, length(mu)) # 1. 等式约束:w'mu = beta 和 w'1 = 1 eq_constraints <- rbind(mu, rep(1, length(mu))) # 2行35列,对应两个等式约束的系数 eq_constraints_t <- t(eq_constraints) # 转置为35行2列,符合solve.QP的Amat格式 # 2. 卖空约束:w_i >= 0,共35个不等式约束 no_short_constraints <- diag(length(mu)) # 35行35列的单位矩阵 # 合并所有约束矩阵 Amat <- cbind(eq_constraints_t, no_short_constraints) # 35行(2+35)=37列 # 对应bvec:等式约束的目标值 + 卖空约束的下界0 bvec <- c(beta, 1, rep(0, length(mu))) # meq=2:前2个约束为等式约束 solution <- solve.QP(Dmat, dvec, Amat, bvec, meq = 2) weights <- solution$solution
关键说明
- 转置等式约束矩阵,确保
Amat的行数等于资产数量(35),列数等于约束总数(37) - 添加单位矩阵作为卖空约束,保证每个资产权重非负
solve.QP的目标函数默认是$\min 0.5w^T Dmatw - dvec^T w$,因此用2*Sigma对应原目标中的$w^T \Sigma w$
内容的提问来源于stack exchange,提问作者Moataz
相关产品推荐
相关产品推荐

