2 votos

Función objetivo: lo más cerca posible de la igualdad de peso

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:

  1. las dos primeras deben ser largas, las dos segundas deben ser cortas, la 5ª y 6ª acción pueden ser largas y cortas.

  2. la exposición bruta no puede superar el 2

  3. la exposición larga apalancada no puede superar el 1,5

  4. la exposición neta larga o corta ajustada a la beta no puede superar el 0,5

  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)

2voto

Daniel Sims Puntos 373

Sin conocer los datos exactos de su código, es difícil decir exactamente dónde puede estar el error. Sin embargo, los errores DCP parecen ser lanzados cuando la ecuación subyacente no es convexa - y por lo tanto incapaz de minimizar.

Aquí hay un gran recurso para la resolución de problemas. Recorre un ejemplo para descubrir si un problema específico es convexo y/o dónde rompe las reglas de DCP.

También hay una función que permite probar cada componente del problema:

Puede comprobar si un problema, objetivo, restricción o expresión satisface las reglas DCP llamando a object.is_dcp(). Si la función devuelve False, hay un error DCP en ese objeto.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X