@@ -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