r - CVXR Optimization Method Unexpectedly Fails in PortfolioAnalytics with EQS Objective - Stack Overflow

I have been using PortfolioAnalytics::optimize.portfolio() with optimize_method = "CVXR" for

I have been using PortfolioAnalytics::optimize.portfolio() with optimize_method = "CVXR" for six months without any issues. However, recently, the same command started failing with the error message:

Error in PortfolioAnalytics::optimize.portfolio(plnt_returns, plnt_EQSratio, : CVXR only solves mean, var/sd/StdDev and ETL/ES/CVaR/CSM/EQS type business objectives, choose a different optimize_method.

To Reproduce

library(PortfolioAnalytics)
library(CVXR)
library(xts)

set.seed(123)
dates <- seq(as.Date("2023-01-01"), by = "days", length.out = 200)
plnt_returns <- xts(matrix(rnorm(200 * 5), ncol = 5), order.by = dates)
colnames(plnt_returns) <- paste0("Asset", 1:5)
assets <- names(plnt_returns)

plnt_EQSratio <- portfolio.spec(assets = assets)
plnt_EQSratio <- add.constraint(plnt_EQSratio, type = "full_investment")
plnt_EQSratio <- add.constraint(plnt_EQSratio, type = "long_only")
plnt_EQSratio <-
  add.constraint(
    plnt_EQSratio,
    type = "box",
    min = rep(0, length(assets)),
    max = rep(0.5, 5)
  )
plnt_EQSratio <- add.objective(plnt_EQSratio, type = "return", name = "mean")
plnt_EQSratio <- add.objective(plnt_EQSratio, type = "risk", name = "EQS", arguments = list(p = 0.05))

opt_EQSratio <- PortfolioAnalytics::optimize.portfolio(plnt_returns, plnt_EQSratio, optimize_method = "CVXR", ESratio = TRUE)

Version

  • R version 4.4.3 (2025-02-28)
  • Platform: x86_64-pc-linux-gnu
  • Running under: Ubuntu 22.04.5 LTS

attached base packages:

  • tidyverse_2.0.0
  • CVXR_1.0-15
  • PortfolioAnalytics_2.1.0
  • xts_0.14.0

I have been using PortfolioAnalytics::optimize.portfolio() with optimize_method = "CVXR" for six months without any issues. However, recently, the same command started failing with the error message:

Error in PortfolioAnalytics::optimize.portfolio(plnt_returns, plnt_EQSratio, : CVXR only solves mean, var/sd/StdDev and ETL/ES/CVaR/CSM/EQS type business objectives, choose a different optimize_method.

To Reproduce

library(PortfolioAnalytics)
library(CVXR)
library(xts)

set.seed(123)
dates <- seq(as.Date("2023-01-01"), by = "days", length.out = 200)
plnt_returns <- xts(matrix(rnorm(200 * 5), ncol = 5), order.by = dates)
colnames(plnt_returns) <- paste0("Asset", 1:5)
assets <- names(plnt_returns)

plnt_EQSratio <- portfolio.spec(assets = assets)
plnt_EQSratio <- add.constraint(plnt_EQSratio, type = "full_investment")
plnt_EQSratio <- add.constraint(plnt_EQSratio, type = "long_only")
plnt_EQSratio <-
  add.constraint(
    plnt_EQSratio,
    type = "box",
    min = rep(0, length(assets)),
    max = rep(0.5, 5)
  )
plnt_EQSratio <- add.objective(plnt_EQSratio, type = "return", name = "mean")
plnt_EQSratio <- add.objective(plnt_EQSratio, type = "risk", name = "EQS", arguments = list(p = 0.05))

opt_EQSratio <- PortfolioAnalytics::optimize.portfolio(plnt_returns, plnt_EQSratio, optimize_method = "CVXR", ESratio = TRUE)

Version

  • R version 4.4.3 (2025-02-28)
  • Platform: x86_64-pc-linux-gnu
  • Running under: Ubuntu 22.04.5 LTS

attached base packages:

  • tidyverse_2.0.0
  • CVXR_1.0-15
  • PortfolioAnalytics_2.1.0
  • xts_0.14.0
Share Improve this question asked Mar 4 at 0:04 Shahab EinabadiShahab Einabadi 3425 silver badges17 bronze badges 1
  • Your code runs fine on PortfolioAnalytics_2.0.0. You can either revert to that version or contact the package author for advice (or wait here until someone figures it out). – Edward Commented Mar 4 at 2:10
Add a comment  | 

1 Answer 1

Reset to default 2

In version 2.1.0, there were some updates. See https://github/braverock/PortfolioAnalytics for details.

Notably, in your case, the following is relevant:

The 2.1 release also contains:

Extended functionalities for graphical displays of multiple efficient frontiers, and robust covariance estimator settings The term EQS for expected quadratic shortfall was replaced with CSM for coherent second moment risk. Updates to the vignettes cvxrPortfolioAnalytics and robustCovMatForPA, and their demo scripts.

Which suggests that you simply need to rename the "name" argument from EQS to CSM:

plnt_EQSratio <- add.objective(plnt_EQSratio, 
           type = "risk", 
           name = "CSM", # <--- HERE
           arguments = list(p = 0.05))

Then optimize:

optimize.portfolio(plnt_returns, 
                   plnt_EQSratio, 
                   optimize_method = "CVXR", 
                   ESratio = TRUE)

***********************************
PortfolioAnalytics Optimization
***********************************

Call:
optimize.portfolio(R = plnt_returns, portfolio = plnt_EQSratio, 
    optimize_method = "CVXR", ESratio = TRUE)

Optimal Weights:
 Asset1  Asset2  Asset3  Asset4  Asset5 
-0.0001  0.5001  0.4570 -0.0006  0.0436 

Objective Measures:
   mean 
0.03722 


 CSM 
1.58 


CSM ratio 
  0.02356 

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745066698a4609296.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信