如何在R中数值求解带约束的市场中性投资组合权重优化问题
解法说明
你这个需求属于带线性约束的线性优化问题,完全不需要遍历权重,用R的lpSolve包就能快速求解,代码写法非常简洁,不需要手动搭建复杂矩阵。
步骤1:安装加载依赖包
# 安装包(首次使用执行) install.packages("lpSolve") # 加载包 library(lpSolve)
步骤2:代入已知数据定义参数
# 你的原始数据 betas <- c(0.6118876,0.7376193,0.8401905,0.9746638,1.022843,1.097142,1.166615,1.274656,1.389989,1.604495) returns <- c(1.103170e-01,1.054401e-01,1.140598e-01,1.243254e-01,1.100530e-01,1.188003e-01,1.008402e-01,1.215204e-01,1.040005e-01,9.985965e-02) w1 <- 2 w10 <- -1
步骤3:定义优化规则求解
我们的优化变量是w2到w9共8个值,目标是最大化组合收益,两个线性约束可以直接传入求解:
# 目标函数系数:w2到w9对应的收益率(固定权重的收益是常数,不影响优化结果) obj_coef <- returns[2:9] # 约束矩阵:第一行是beta约束的系数,第二行是权重和约束的系数 con_mat <- rbind( betas[2:9], # beta中性约束的变量系数 rep(1, 8) # 权重和约束的变量系数 ) # 约束方向:两个都是等式约束 con_dir <- c("==", "==") # 约束右侧的值:把固定项移到等式右侧计算得到 con_rhs <- c( betas[10] - w1 * betas[1], # beta中性约束右侧:b10 - 2*b1 1 - w1 - w10 # 权重和约束右侧:总权重1减去固定权重的和 ) # 求解,这里已经加上了你要求的w2-w9取值-10到10的限制 result <- lp( direction = "max", objective.in = obj_coef, const.mat = con_mat, const.dir = con_dir, const.rhs = con_rhs, lower = rep(-10, 8), upper = rep(10, 8) )
步骤4:提取结果验证
# 最优的w2到w9权重 w2_w9 <- result$solution names(w2_w9) <- paste0("w", 2:9) print(w2_w9) # 验证beta中性 calc_beta <- w1*betas[1] + sum(w2_w9 * betas[2:9]) + w10*betas[10] cat("组合beta值:", round(calc_beta, 10), "\n") # 验证权重和 calc_weight_sum <- w1 + sum(w2_w9) + w10 cat("组合总权重:", round(calc_weight_sum, 10), "\n") # 最优组合收益率 opt_return <- w1*returns[1] + sum(w2_w9 * returns[2:9]) + w10*returns[10] cat("最优组合收益率:", opt_return, "\n")
额外说明
线性规划求解得到的是全局最优解,比遍历权重的效率高几个数量级,也不会出现遍历步长太大漏掉最优值的问题。
内容的提问来源于stack exchange,提问作者jx21
相关产品推荐
相关产品推荐

