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

