Mirando tu código, parece que estás mezclando el minimización del riesgo formulación del problema de la media-varianza con la aversión al riesgo formulación. Ambas formulaciones incluyen la restricción de "presupuesto", que la suma de las ponderaciones sea igual a 1, y pueden requerir que cada una de las ponderaciones sea mayor que cero, las restricciones de desigualdad "sólo a largo plazo". En el problema de minimización del riesgo, se encuentran las ponderaciones que minimizan la varianza de la cartera sujeta a la restricción de que el rendimiento de la cartera sea igual a un rendimiento objetivo.
argmin
donde Q es la matriz de covarianza y r_p es la rentabilidad de la cartera objetivo. En el aversión al riesgo forma, se encuentran las ponderaciones que maximizan la rentabilidad menos un coeficiente de aversión al riesgo multiplicado por la varianza de la cartera, tal y como afirmas en tu post.
\underset{w}{\arg \max} \quad w'r - \lambda w' Q w \quad \text{s.t} \sum_i w_i=1, \quad w_i \geq 0\quad
donde \lambda es el coeficiente de aversión al riesgo. Obsérvese que en la formulación de la aversión al riesgo no hay ninguna restricción sobre la rentabilidad de la cartera.
En su código, la segunda restricción es una restricción de desigualdad en los rendimientos que requiere que el rendimiento de la cartera sea \geq r_p . Con esta restricción, su solución cambia de un modelo de aversión al riesgo a un modelo de minimización del riesgo cuando la rentabilidad cae por debajo de la rentabilidad objetivo. Este es un modelo posible, pero no parece ser lo que usted pretende.
Aunque hay muchas variaciones de optimización de carteras que utilizan diferentes métodos para calcular el riesgo y la rentabilidad, una vez que se ha elegido un método, sólo hay una frontera eficiente. El código siguiente es una modificación de su código que muestra cómo varían el riesgo y la rentabilidad para disminuir el valor de \lambda y que ésta es sólo una forma alternativa de trazar la frontera eficiente dado este conjunto de riesgos y rendimientos.
library(quadprog)
efficientPortfolio <- function(er,cov.mat,aversion=3, target_return=NULL, method= c("risk_min","risk_aver","mixed","min_var") ){
n_asset <- length(er)
# quad problem
if(method %in% c("risk_min", "min_var")){
aversion = 1
Dmat <- cov.mat
dvec <- rep(0, n_asset)
meq <- ifelse(method == "min_var", 1, 2)}
else {
Dmat <- aversion*cov.mat
dvec <- er
meq <- 1}
# constraint eqns
if(method %in% c("risk_aver","min_var")) {
bvec <- c(1, rep(0,n_asset))
Amat <- matrix( c(rep(1,n_asset), diag(nrow=n_asset)), nrow=n_asset) }
else {
bvec <- c(1, target_return, rep(0,n_asset))
Amat <- matrix( c(rep(1,n_asset), er, diag(nrow=n_asset)), nrow=n_asset) }
sol<-solve.QP(Dmat, dvec,Amat, bvec=bvec, meq=meq)
weights<-sol$solution
exp.ret <- t(er)%*%weights
std.dev <- sqrt(weights %*% cov.mat %*% weights)
ret <- list(er = as.vector(exp.ret),
sd = as.vector(std.dev),
weights = weights,
lagrange_mults=sol$Lagrangian )
}
efficientFrontier <- function(er,cov.mat, nport=20, lambda_min = .1, lambda_max=2, lambda = 1,
target_return = NULL, method = c("risk_min","risk_aver","mixed") ) {
# if method = risk_min, input sequence of target_returns or use defaults; input target_returns < min_var return are not used
# = risk_aver, input upper and lower bounds of risk aversion coefficients lambda or use defaults
# = mixed, input single value of risk aversion coefficient lambda and seq of target_returns or use default
n_asset <- length(er)
method <- method[1]
lambda <- if(method == "risk_min"){
nport <- ifelse(is.null(target_return), nport, length(target_return))
rep(NA_real_,nport) }
else if(method == "mixed") rep(lambda, nport)
else seq(lambda_max, lambda_min, (lambda_min-lambda_max)/(nport-1))
ef <- list(Efficient_Frontier_method = method, sol=matrix(0, nrow=nport, ncol=3, dimnames=list(NULL, c("lambda", "sd", "return")) ),
weights= matrix(0, nrow=nport, ncol=n_asset),
lagrange_mults=matrix(0, nrow=nport, ncol=ifelse(method=="risk_aver", 1, 2) +n_asset) )
colnames(ef$lagrange_mults) <- if(method == "risk_aver") c("budget",rep("",n_asset)) else c("budget","target_return",rep("", n_asset))
# calculate minimum variance portfolio
port_min_var <- efficientPortfolio(er,cov.mat,target_return=NULL, aversion=NULL, method="min_var")
cat("Mininum Variance Portfolio\n sd return\n")
cat(sd=port_min_var$sd, return=port_min_var$er,"\n\n")
target_return <- if(is.null(target_return)) seq(port_min_var$er, max(er), length.out=nport)
else {
target_return[target_return < port_min_var$er] <- port_min_var$er
target_return
}
for (i in 1:nport) {
port <- efficientPortfolio(er,cov.mat,aversion=lambda[i], target_return=target_return[i], method=method)
ef$sol[i,"lambda"] <- lambda[i]
ef$sol[i,"sd"] <- port$sd
ef$sol[i,"return"] <- port$er
ef$weights[i,] <- port$weights
ef$lagrange_mults[i,] <- port$lagrange_mults
}
return(ef)
}
EDITAR
La respuesta corta a su pregunta en el comentario es sí. Como la relación entre las diferentes formulaciones de riesgo puede ser de interés, he actualizado el código de arriba para calcular las fronteras eficientes utilizando ambos métodos de minimización de riesgo (método = "risk_min") y aversión al riesgo (método="risk_aver"). También tratará su caso cuando los dos casos sean mixtos (method="mixed"). El código ahora también informa de los multiplicadores de lagrange para los puntos de la frontera eficiente.
En particular, para su caso mixto, que utiliza una restricción de desigualdad en el rendimiento de la cartera, puede ver el cambio de la solución de riesgo adverso a la solución de minimización del riesgo. Para los valores más pequeños de la rentabilidad objetivo en los que la restricción de desigualdad de la rentabilidad no está activa, la solución de la cartera es la misma para diferentes valores de la rentabilidad objetivo, ya que nada ha cambiado y el multiplicador de Lagrange para la desigualdad de la rentabilidad es cero. A medida que la rentabilidad objetivo aumenta, la restricción de rentabilidad de la cartera se activa y determina la solución, y el multiplicador de Lagrange asociado toma valores distintos de cero. La solución ha pasado al caso de minimización del riesgo. Se puede demostrar que la inversa del multiplicador de Lagrange de la rentabilidad de la cartera cuando es distinta de cero es igual al coeficiente de aversión al riesgo. En un documento de MSCI se ofrece un análisis exhaustivo de la optimización de carteras mediante métodos de aversión al riesgo Los efectos de la aversión al riesgo en la optimización especialmente en su sección B.6 donde la relación entre los multiplicadores de Lagrange ( sus variables duales \pi_3 y \pi_4 ) y se demuestra el coeficiente de aversión al riesgo.