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

Rmosek锥形式求解Markowitz投资组合优化的错误排查

Rmosek锥形式求解Markowitz问题结果不一致的常见错误排查

以下是锥形式实现中最容易出错的几个点,逐一核对你的代码:

1. 二阶锥约束的构造错误

将$x^T\Sigma x \leq t$转化为二阶锥约束时,必须构造向量$\begin{bmatrix}t \ \Sigma^{1/2}x\end{bmatrix}$并声明其属于二阶锥(SOC)。常见错误包括:

  • 未正确计算$\Sigma$的Cholesky分解:$\Sigma$是半正定矩阵,需确保分解出的矩阵$L$满足$\Sigma = LL^T$,若$\Sigma$接近奇异,需添加小正则项(如Sigma + 1e-8*diag(n))保证正定。
  • 锥约束的变量顺序错误:必须把t放在向量的第一个位置,后续是$Lx$的所有元素,顺序颠倒会导致求解器无法识别正确的锥结构。

2. 变量边界设置遗漏

t作为$x^T\Sigma x$的上界,必须满足t ≥ 0,若代码中未给t设置非负下界(blx对应位置设为0),Mosek可能允许t取负值,直接导致优化目标偏离。

3. 投资组合约束不一致

检查锥形式代码中的约束是否与二次规划、CVXR版本完全一致:

  • 是否包含$\sum x_i = 1$的预算约束?
  • 是否设置了相同的权重上下界(如禁止卖空则$x_i ≥ 0$)?
  • 有没有遗漏或多添加约束条件?

4. 目标函数定义错误

锥形式的优化目标是仅最小化t,需确保目标函数系数向量中,t对应的系数为1,所有x变量的系数为0。若误给x变量添加非零系数,会彻底改变优化目标。

5. 锥约束类型指定错误

在Rmosek中添加二阶锥约束时,需指定正确的锥类型(如type="QUAD"),若错误指定为线性约束或其他锥类型,求解器无法正确处理二次项约束,导致结果错误。

正确代码片段参考

library(Rmosek)

# 示例协方差矩阵(正定)
Sigma <- matrix(c(0.06, 0.03, 0.03, 0.04), nrow=2)
L <- chol(Sigma)  # Cholesky分解得到Σ = L^TL
n_assets <- nrow(Sigma)

# 初始化问题
prob <- list(sense = "min")

# 目标函数:min t(t是第1个变量,x是第2到n+1个变量)
prob$c <- c(1, rep(0, n_assets))

# 预算约束:sum(x) = 1
prob$A <- Matrix(c(0, rep(1, n_assets)), nrow=1, sparse=TRUE)
prob$bc <- rbind(blc = 1, buc = 1)

# 变量边界:t≥0,x无限制(若禁止卖空则设blx=c(0, rep(0, n_assets)))
prob$bx <- rbind(blx = c(0, rep(-Inf, n_assets)), 
                 bux = c(Inf, rep(Inf, n_assets)))

# 构造二阶锥约束:[t; Lx] ∈ SOC
# F矩阵:第一行取t,后续行取Lx
prob$F <- rbind(c(1, rep(0, n_assets)), 
                cbind(rep(0, n_assets), t(L)))  # 注意chol返回上三角,转置为下三角
prob$g <- rep(0, n_assets + 1)
prob$cones <- list(list(type = "QUAD", sub = 1:(n_assets + 1)))

# 求解问题
res <- mosek(prob)
x_opt <- res$sol$itr$xx[2:(n_assets + 1)]
t_opt <- res$sol$itr$xx[1]

内容的提问来源于stack exchange,提问作者leu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:11:27