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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:06