Ошибка PortfolioAnalytics при создании эффективной границы - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь решить задачи оптимизации портфеля, все идет гладко, кроме случаев, когда я пытаюсь создать эффективную границу.

Я пытался возиться со всеми параметрами функции, я установил все пакеты и плагины, рекомендованные в документации.Но даже когда я пытаюсь запустить код в эффективной демоверсии в репозитории 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))

Любая помощь будет принята с благодарностью!Спасибо!

1 Ответ

1 голос
/ 29 сентября 2019

Мы можем отследить ошибку, чтобы найти причину.Из вашего сообщения об ошибке, функция, которая вызывает эту ошибку, является функцией 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".Объект plugin сохраняется как строка путем объединения строк «ROI.plugin».и "glpk" (сохранено в solver).Функция search() возвращает вложенные пакеты в форме «package: PerformanceAnalytics».Вот почему в вызове stopifnot() «пакет:» объединяется со строкой в ​​плагине, которая дает строку «пакет: ROI.plugin.glpk».Затем проверяется, находится ли эта строка среди строк, возвращаемых search(), она также пытается присоединить пакет с помощью || requireNamespace(plugin, quietly = TRUE)).Если строка отсутствует в прикрепленных пакетах, она использует строку для присоединения пакета.Если оба из них терпят неудачу, то функция останавливается.

Поэтому вам необходимо установить пакет ROI.plugin.glpk.Вам также следует установить ROI.plugin.quadprog.Я установил оба, и пример эффективной границы работает для меня.Это длинный ответ, но, надеюсь, вы сможете научиться отлаживать ошибки в будущем, используя приведенную выше логику.

...