1 votos

¿Cómo construir una cartera neutra para el mercado utilizando CVXPY?

Estoy tratando de implementar una simple optimización de cartera de varianza mínima con algunas restricciones simples:

  • cartera de inversión a largo plazo
  • totalmente invertido (suma a uno)
  • neutralidad del mercado, es decir, suma (betas) = 0.

No tengo mucha experiencia con cvxpy pero me gusta bastante y quiero implementar mis cosas con él en el futuro. Abajo hay un ejemplo (del sitio web de cvxpy), que utiliza

$$\min_x\;\; \frac{1}{2}x^T\Sigma x$$ Con las limitaciones $$x^T \mathbb{1}=1$$ $$\mu^Tx \geq \tau$$

Ahora quiero añadir $B^Tx=0$ , lo que garantizará que la beta de las carteras sea cero.

Este es el ejemplo:

from cvxpy import *
import numpy as np

np.random.seed(1)
n = 10
Sigma = np.random.randn(n, n)
Sigma = Sigma.T.dot(Sigma)

betas = [np.random.uniform(-1,1) for _ in range(10)]

w = Variable(n)

risk = quad_form(w, Sigma)
constraints = [sum_entries(w) == 1, w >= 0]
prob = Problem(Minimize(risk), constraints)

for i in range(100):
    prob.solve()

print('Weights :', w.value)

¿Cómo puedo definir la variable adicional para la beta y cómo se modifica la lista de restricciones?

Por el manual supongo que necesitamos algo en forma de quad_form() Pero, ¿tiene que definirse de forma similar a la variable de riesgo del ejemplo o dentro del objeto de restricciones? ¿Cómo se vincula con el vector de datos de las betas?

Habría hecho algo como

sum(quad_form(w, betas)) == 0 

dentro del objeto de las restricciones, lo que lamentablemente no funciona.

0 votos

Yo calcularía los Betas fuera de CVXOPT y los usaría como coeficientes en una restricción de igualdad lineal con 0 en el lado derecho... Como $1.01*x_1+0.95*x_2+\cdots+1.20*x_n=0$

0 votos

Obtengo las betas de una base de datos Sólo uso las calculadas aquí como ejemplo de trabajo

1voto

Joop Hox Puntos 116

La restricción puede implementarse simplemente creando la siguiente restricción

w.T*beta == 0

1voto

m0j0 Puntos 21

La restricción que sugieres es errónea ya que implica $x^T B x = 0$ que no es lo que quieres.

La forma correcta de expresar $B^T x = 0$ es w.T * beta == 0 y debe incluirlo en la lista de restricciones:

constraints = [sum_entries(w) == 1, w >= 0, w.T * beta == 0]

También las siguientes líneas se ven mal:

for i in range(100):
    prob.solve()

Parece que estás resolviendo cien veces tu problema. Una llamada debería ser suficiente.

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