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
- 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
1 Answer
Reset to default 2In 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