创建有效边界时的 PortfolioAnalytics 错误
PortfolioAnalytics error while creating efficient frontier
我正在尝试 运行 投资组合优化问题,一切都 运行 很顺利,除非我尝试创建有效边界。
我试图弄乱所有函数参数,我已经安装了文档推荐的所有包和插件。但即使我尝试 运行 包的 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))
如有任何帮助,我们将不胜感激!
谢谢!
我们可以追溯错误,找出导致错误的原因。根据您的错误消息,导致此错误的函数是 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))
solver
参数作为 "glpk" 传递。通过连接字符串 "ROI.plugin." 和 "glpk"(保存在 solver
中),对象 plugin
被保存为字符串。 search()
函数returns附包,形式为"package:PerformanceAnalytics"。这就是为什么在 stopifnot()
调用中,"package:" 与插件中的字符串连接,从而给出字符串 "package:ROI.plugin.glpk"。然后检查此字符串是否在 search()
返回的字符串中,它还会尝试使用 || requireNamespace(plugin, quietly = TRUE))
附加包。如果该字符串不在附加包中,它会使用该字符串来附加包。如果这两个都失败,则该功能将停止。
因此,您需要安装ROI.plugin.glpk
包。您还应该安装 ROI.plugin.quadprog
。我安装了两个,示例有效边界对我有用。这是一个冗长的答案,但希望您以后可以使用上述逻辑学习如何调试错误。
我正在尝试 运行 投资组合优化问题,一切都 运行 很顺利,除非我尝试创建有效边界。
我试图弄乱所有函数参数,我已经安装了文档推荐的所有包和插件。但即使我尝试 运行 包的 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))
如有任何帮助,我们将不胜感激! 谢谢!
我们可以追溯错误,找出导致错误的原因。根据您的错误消息,导致此错误的函数是 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))
solver
参数作为 "glpk" 传递。通过连接字符串 "ROI.plugin." 和 "glpk"(保存在 solver
中),对象 plugin
被保存为字符串。 search()
函数returns附包,形式为"package:PerformanceAnalytics"。这就是为什么在 stopifnot()
调用中,"package:" 与插件中的字符串连接,从而给出字符串 "package:ROI.plugin.glpk"。然后检查此字符串是否在 search()
返回的字符串中,它还会尝试使用 || requireNamespace(plugin, quietly = TRUE))
附加包。如果该字符串不在附加包中,它会使用该字符串来附加包。如果这两个都失败,则该功能将停止。
因此,您需要安装ROI.plugin.glpk
包。您还应该安装 ROI.plugin.quadprog
。我安装了两个,示例有效边界对我有用。这是一个冗长的答案,但希望您以后可以使用上述逻辑学习如何调试错误。