You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:15:06