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
相关产品推荐
相关产品推荐

