Skip to content

Commit 160ff17

Browse files
committed
EQS objective
1 parent 44eaa6b commit 160ff17

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

R/optimize.portfolio.R

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2813,7 +2813,7 @@ optimize.portfolio <- optimize.portfolio_v2 <- function(
28132813
alpha <- 0.05
28142814
lambda <- 1
28152815

2816-
valid_objnames <- c("mean", "var", "sd", "StdDev", "ES", "CVaR", "ETL", "CSM", "HHI", "hhi")
2816+
valid_objnames <- c("mean", "var", "sd", "StdDev", "ES", "CVaR", "ETL", "CSM", "HHI", "hhi", "EQS")
28172817
for (objective in portfolio$objectives) {
28182818
if (objective$enabled) {
28192819
if (!(objective$name %in% valid_objnames)) {
@@ -2832,6 +2832,7 @@ optimize.portfolio <- optimize.portfolio_v2 <- function(
28322832
risk <- ifelse(objective$name %in% valid_objnames[2:4], TRUE, risk)
28332833
risk_ES <- ifelse(objective$name %in% valid_objnames[5:7], TRUE, risk_ES)
28342834
risk_CSM <- ifelse(objective$name %in% valid_objnames[8:8], TRUE, risk_CSM)
2835+
risk_EQS <- ifelse(objective$name %in% valid_objnames[11:11], TRUE, risk_EQS)
28352836
if(objective$name %in% valid_objnames[9:11]){
28362837
risk_HHI <- TRUE
28372838
lambda_hhi <- objective$conc_aversion
@@ -2852,22 +2853,22 @@ optimize.portfolio <- optimize.portfolio_v2 <- function(
28522853
return_target <- portfolio$objectives[[mean_idx]]$target
28532854
} else return_target=NULL
28542855

2855-
if(reward & !risk & !risk_ES & !risk_CSM & !risk_HHI){
2856+
if(reward & !risk & !risk_ES & !risk_CSM & !risk_HHI & !risk_EQS){
28562857
# max return
28572858
obj <- -t(mean_value) %*% wts
28582859
constraints_cvxr = list()
28592860
tmpname = "mean"
2860-
} else if(!reward & risk & !risk_ES & !risk_CSM & !risk_HHI){
2861+
} else if(!reward & risk & !risk_ES & !risk_CSM & !risk_HHI & !risk_EQS){
28612862
# min var/std
28622863
obj <- CVXR::quad_form(wts, sigma_value)
28632864
constraints_cvxr = list()
28642865
tmpname = "StdDev"
2865-
} else if(!reward & risk & !risk_ES & !risk_CSM & risk_HHI){
2866+
} else if(!reward & risk & !risk_ES & !risk_CSM & risk_HHI & !risk_EQS){
28662867
# min HHI
28672868
obj <- CVXR::quad_form(wts, sigma_value) + lambda_hhi * CVXR::cvxr_norm(wts, 2) **2
28682869
constraints_cvxr = list()
28692870
tmpname = "HHI"
2870-
} else if(reward & risk & !risk_ES & !risk_CSM & !risk_HHI){
2871+
} else if(reward & risk & !risk_ES & !risk_CSM & !risk_HHI & !risk_EQS){
28712872
# mean-var/sharpe ratio
28722873
if(hasArg(maxSR)) maxSR=match.call(expand.dots=TRUE)$maxSR
28732874

@@ -2882,7 +2883,7 @@ optimize.portfolio <- optimize.portfolio_v2 <- function(
28822883
constraints_cvxr = list(t(mean_value) %*% wts == 1, sum(wts) >= 0)
28832884
tmpname = "Sharpe Ratio"
28842885
}
2885-
} else if(risk_ES & !risk_CSM){
2886+
} else if(risk_ES & !risk_CSM & !risk_EQS){
28862887
# ES objectives
28872888
if(reward){
28882889
if(hasArg(maxSTARR)) maxSTARR=match.call(expand.dots=TRUE)$maxSTARR else maxSTARR=TRUE
@@ -2902,7 +2903,7 @@ optimize.portfolio <- optimize.portfolio_v2 <- function(
29022903
constraints_cvxr = list(z >= 0, z >= -X %*% wts - zeta)
29032904
tmpname = "ES"
29042905
}
2905-
} else if(!risk_ES & risk_CSM){
2906+
} else if(!risk_ES & risk_CSM & !risk_EQS){
29062907
# CSM objectives
29072908
if(reward){
29082909
if(hasArg(CSMratio)) CSMratio=match.call(expand.dots=TRUE)$CSMratio else CSMratio=TRUE
@@ -2923,6 +2924,22 @@ optimize.portfolio <- optimize.portfolio_v2 <- function(
29232924
t >= CVXR::p_norm(z, p=2))
29242925
tmpname = "CSM"
29252926
}
2927+
} else if(!risk_ES & !risk_CSM & risk_EQS){
2928+
# EQS objectives
2929+
if(reward){
2930+
if(hasArg(EQSratio)) EQSratio=match.call(expand.dots=TRUE)$EQSratio else EQSratio=TRUE
2931+
}
2932+
if(EQSratio){
2933+
# max EQS ratio
2934+
obj <- zeta + (1/(alpha * T)) * sum(pos(square(pos(X %*% wts)) - zeta))
2935+
constraints_cvxr = list(t(mean_value) %*% wts == 1, sum(wts) >= 0)
2936+
tmpname = "EQS ratio"
2937+
} else {
2938+
# min EQS
2939+
obj <- zeta + (1/(alpha * T)) * sum(pos(square(pos(X %*% wts)) - zeta))
2940+
constraints_cvxr <- list()
2941+
tmpname = "EQS"
2942+
}
29262943
} else {
29272944
# wrong objective
29282945
stop("Wrong multiple objectives. CVXR only solves mean, var, or simple ES/CSM type business objectives, please reorganize the objectives.")

0 commit comments

Comments
 (0)