2

我正在尝试解决投资组合优化问题,一切都运行顺利,除非我尝试创建有效边界。

我试图弄乱所有的函数参数,我已经安装了文档推荐的所有包和插件。但即使我尝试在包的 GitHub 存储库中运行有效前沿演示中的代码时,我也会收到相同的错误消息。我怀疑它是缺少插件或推荐的软件包安装中的错误。有人至少可以给我一个关于发生了什么的提示吗?

我拥有的代码非常简单,但我的主要结论是我没有任何问题,因为我在运行位于以下位置的代码时遇到了同样的错误:https ://github.com/R-Finance/PortfolioAnalytics/ blob/master/demo/demo_efficient_frontier.R

我的代码:

base_pf <- portfolio.spec(colnames(monthly_returns_with_rf[,-selic_col]))

base_pf <- add.constraint(portfolio = base_pf, type = 'full_investment')

base_pf <- add.constraint(portfolio = base_pf, type = 'long_only')

moments <- set.portfolio.moments(monthly_returns_with_rf[,-selic_col], portfolio = base_pf, method = 'boudt', k = 3)

base_pf <- add.constraint(portfolio = base_pf, type = 'box', min = 0, max = 0.4)

base_pf <- add.objective(portfolio = base_pf, type = 'return', name = 'mean')

base_pf <- add.objective(portfolio = base_pf, type = 'risk', name = 'var')

ef_fr <- create.EfficientFrontier(R=monthly_returns_with_rf[,-selic_col], portfolio=base_pf, type="mean-StdDev", match.col = 'StdDev')

opt_base <- optimize.portfolio(monthly_returns_with_rf[,- selic_col], portfolio = base_pf, optimize_method = 'ROI')
print(opt_base)

我得到的错误信息是:

Error in maxret_opt(R = R, constraints = constraints, moments = moments, : paste0("package:", plugin) %in% search() || requireNamespace(plugin,  .... is not TRUE
Traceback:

1. create.EfficientFrontier(R = monthly_returns_with_rf[, -selic_col], 
 .     portfolio = base_pf, type = "mean-StdDev", match.col = "StdDev")
2. meanvar.efficient.frontier(portfolio = portfolio, R = R, n.portfolios = n.portfolios, 
 .     risk_aversion = risk_aversion, ... = ...)
3. optimize.portfolio(R = R, portfolio = portfolio, optimize_method = "ROI", 
 .     ... = ...)
4. maxret_opt(R = R, constraints = constraints, moments = moments, 
 .     target = target, solver = solver, control = control)
5. stopifnot(paste0("package:", plugin) %in% search() || 
requireNamespace(plugin, 
 .     quietly = TRUE))

任何帮助将非常感激!谢谢!

4

1 回答 1

3

我们可以追溯错误以找出导致它的原因。从您的错误消息中,导致此错误的函数是maxret_opt()函数。这是一个由 调用的函数optimize.portfolio(),从步骤中可以看出,同样optimize.portfolio()由 调用meanvar.efficient.frontier(),本身由 调用create.EfficientFrontier(),它来自您的脚本。

现在到错误。查看maxret_opt()函数的源代码,我发现以下内容:

function (R, moments, constraints, target, solver = "glpk", 
  control = NULL) 
{
  stopifnot("package:ROI" %in% search() || requireNamespace("ROI", 
    quietly = TRUE))
  plugin <- paste0("ROI.plugin.", solver)
  stopifnot(paste0("package:", plugin) %in% search() || requireNamespace(plugin, 
    quietly = TRUE))

参数作为“ solverglpk”传递。通过连接字符串“ROI.plugin”将对象plugin保存为字符串。和“glpk”(保存在 中solver)。该search()函数以“package:PerformanceAnalytics”的形式返回附加的包。这就是为什么在stopifnot()调用中,“package:”与plugin 中的字符串连接,从而得到字符串“package:ROI.plugin.glpk”。然后检查此字符串是否在 . 返回的字符串中search(),它还尝试将包附加到|| requireNamespace(plugin, quietly = TRUE)). 如果字符串不在附加的包中,它会使用该字符串来附加包。如果这两个都失败,则停止该功能。

因此,您需要安装该ROI.plugin.glpk软件包。您还应该安装ROI.plugin.quadprog. 我安装了这两个,示例高效前沿对我有用。这是一个冗长的答案,但希望您将来可以学习如何使用上述逻辑调试错误。

于 2019-09-29T17:04:05.613 回答