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

R语言优化向量求解等风险贡献目标函数最小值报错咨询

风险平价权重优化报错解决方案

报错原因

optim函数传入目标函数的权重参数w是一维向量,你原有代码中用rc_matrix[, x[1]]的二维索引方式访问一维向量,自然会触发维度错误。你单独测试时如果传入矩阵格式的w可以运行,但optim不会自动把参数转成矩阵格式。

优化后实现方案

简化版目标函数

不用两两计算风险贡献的平方差,直接计算各资产风险贡献与均值的平方和即可达成相同目标,计算效率更高且逻辑更简洁:

RC <- function(RM, w) {
  # 权重归一化保证和为1
  w <- w / sum(w)
  # 计算各资产风险贡献
  rc <- RM * w
  # 目标:各rc差异最小,等价于各rc减均值的平方和最小
  return(sum((rc - mean(rc))^2))
}

正确的optim调用代码

以你给出的RM样本为例:

# 输入的风险测度向量
RM <- c(0.06006928, 0.06823795, 0.05716360, 0.08363529, 0.06491009, 0.06673174, 0.03103578, 0.05741140)
n_assets <- length(RM)

# 调用optim求解
out <- optim(
  par = rep(1/n_assets, n_assets), # 初始值:等权重
  fn = RC,
  RM = RM,
  method = "L-BFGS-B",
  lower = 0.00001, # 权重下限
  upper = 1, # 权重上限
  control = list(factr = 1e7) # 调整收敛精度,可按需修改
)

# 提取最终权重并归一化(冗余校验)
final_w <- out$par / sum(out$par)
# 查看最终权重
print(final_w)
# 验证风险贡献是否相等
print(RM * final_w)

结果校验

运行上述代码后,你会得到:

  • 所有权重均落在(0,1)区间内,求和结果为1
  • 各资产的风险贡献RM * final_w数值差异极小,基本满足相等要求

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

相关产品推荐
方舟 Agent Plan

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

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