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.
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)
attached base packages:
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.
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)
attached base packages:
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