Tengo problemas para encontrar una función que optimice los pesos para que sean lo más iguales posible.
Es una cartera long-short con 6 posiciones las ponderaciones son una variable cvx: [largo, largo, corto, corto, largo/corto, largo/corto]
Hay algunas limitaciones, como que la exposición bruta no puede ser superior a 2, la longitud bruta no puede ser superior a 1,5.
Para conseguir que las ponderaciones de la cartera se acerquen lo más posible a la igualdad de peso, una forma es minimizar la varianza del valor absoluto de las ponderaciones.
cvxpy.Minimize(cvx.sum_squares(cvx.sum(cvx.abs(weights)) - cvx.abs(weights)/6))
Pero este lanzamiento "no sigue las reglas del DCP".
¿Cuál es el problema en esta línea que provoca la violación de las normas DCP?
Y lo que es más importante, cualquier idea sobre cómo escribir una función objetivo para empujar los pesos a un peso tan igual como sea posible ?
Gracias.
Aclaración sobre mi pregunta:
Este es el problema que necesito resolver:
Tengo una cartera con 6 acciones, con la siguiente beta: [0.7, 1.5, 0.4, 0.8, 0.5, 1]
Restricciones:
-
las dos primeras deben ser largas, las dos segundas deben ser cortas, la 5ª y 6ª acción pueden ser largas y cortas.
-
la exposición bruta no puede superar el 2
-
la exposición larga apalancada no puede superar el 1,5
-
la exposición neta larga o corta ajustada a la beta no puede superar el 0,5
-
Objetivo: cartera lo más cercana posible a la igualdad de peso.
Código
betas = [0.7, 1.5, 0.4, 0.8, 0.5, 1]
weight_longs = cvx.Variable(2)
weight_shorts = cvx.Variable(2)
weight_longorshort = cvx.Variable(2)
weights = cvx.hstack([weight_longs, weight_shorts, weight_longorshort])
# Constraints:
bounds = [w_longs>=0.0, w_shorts<=-0.0]
gross_exp = [cvx.sum(cvx.abs(weights)) <=2]
lev_long = [cvx.sum(w_longs) + cvx.sum(cvx.pos(w_longorshort)) <= 1.5]
beta_net_exp = [cvx.abs(cvx.sum(np.array(betas) * weights)) <= 0.5]
constraints = bounds + gross_exp + lev_long + beta_net_exp
# Minimize the variance of absolute value of weights to achieve close to equal weight
obj_func = cvx.sum_squares(cvx.abs(weights) - cvs.abs(weights/6))
cvx.Problem(obj_func, constraints)