RiskPortfolios包optimalPortfolio函数'riskeff'类型报错求助
解决RiskPortfolios包optimalPortfolio函数'riskeff'类型下标越界问题
你遇到的Error in '[<-'(*tmp*, pos, i - 1, value = 1) : subscript out of bounds错误,大概率是因为type='riskeff'(风险有效组合)的调用参数不完整,或者函数在2资产+long-only约束的场景下存在索引处理问题。以下是具体解决方案:
解决方案1:补充期望收益参数mu
风险有效组合的构建需要结合收益与风险维度,optimalPortfolio的riskeff类型默认需要传入资产的期望收益向量。添加该参数后即可正常运行:
# 计算资产期望收益 mu <- colMeans(rets) # 重新调用最优组合函数 opt_w <- optimalPortfolio(mu = mu, Sigma = covmat, semiDev = semiDev, control = list(type = 'riskeff', constraint = 'lo')) %>% round(., 4) %>% setNames(colnames(rets)) %>% print(.)
解决方案2:移除semiDev参数(若无需半标准差约束)
如果你的风险度量不需要用到半标准差,仅用协方差矩阵即可构建风险有效组合,移除semiDev参数后也能避免报错:
opt_w <- optimalPortfolio(mu = mu, Sigma = covmat, control = list(type = 'riskeff', constraint = 'lo')) %>% round(., 4) %>% setNames(colnames(rets)) %>% print(.)
解决方案3:调整约束类型或增加资产数量
如果是2资产+long-only约束的场景触发了函数内部的索引bug,可以尝试两种方式绕过:
- 将约束改为允许卖空(
constraint='full'):
opt_w <- optimalPortfolio(Sigma = covmat, semiDev = semiDev, control = list(type = 'riskeff', constraint = 'full')) %>% round(., 4) %>% setNames(colnames(rets)) %>% print(.)
- 增加资产数量(比如恢复原代码中的4个资产),规避2资产场景的索引问题。
额外检查建议
- 验证
semidevEstimation的输出是否为长度等于资产数的向量:
print(semiDev) # 正常输出示例: # SPY TLT # 0.0123 0.0089
- 更新
RiskPortfolios包到最新版本,修复旧版本的已知bug:
install.packages("RiskPortfolios")
内容的提问来源于stack exchange,提问作者김태환
相关产品推荐
相关产品推荐

