RiskPortfolios包求解maxdiv最优组合出现近0权重问题求助
极小权重出现的原因
- 数值计算层面:你看到的
e-21级别的数值是二次规划求解过程中产生的浮点误差,本质上对应优化结果里的0权重,属于数值计算的正常现象,不是代码逻辑错误。 - 组合优化逻辑层面:当前求解的是最大分散化(maxdiv)组合,仅做多约束下,优化目标会自动筛掉对提升组合分散度没有贡献的资产。你使用的10个行业收益率数据中,第3、5、10个行业的协方差特征无法为组合带来分散化增益,因此被分配0权重,只残留了浮点误差级别的极小值。
解决方案
- 方案一:截断后归一化
如果可以接受部分资产权重为0,只需要剔除浮点误差的影响,对输出权重做截断处理后重新归一化即可保证权重和为1:
# 原有计算逻辑 library("RiskPortfolios") data("Industry_10") rets = Industry_10 Sigma = covEstimation(rets) w = optimalPortfolio(Sigma = Sigma, control = list(type = 'maxdiv', constraint = 'lo')) # 新增后处理逻辑 w[w < 1e-6] <- 0 w <- w / sum(w)
- 方案二:设置最低权重约束
如果要求所有资产都必须配置一定比例,可以在优化参数中添加lw参数设置每个资产的最低权重,如下示例要求每个资产至少配置1%:
w = optimalPortfolio(Sigma = Sigma, control = list(type = 'maxdiv', constraint = 'lo', lw = rep(0.01, ncol(Sigma))))
运行后所有资产的权重都会≥1%,不会出现接近0的情况。
内容的提问来源于stack exchange,提问作者GT213
相关产品推荐
相关产品推荐

