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