```html
Estoy trabajando en una optimización de cartera que me requiere restringir el número de activos utilizados, por ejemplo del S&P500 construir una cartera de 20 activos que sea factible. Después de hacer algunas investigaciones, llegué a la conclusión de que no hay solucionadores no comerciales disponibles de forma gratuita que puedan manejar problemas mixtos enteros y cuadráticos (probablemente también necesite SOCP). Así que pensé en un paso de preoptimización, es decir, usar un solucionador MIP para obtener esos 20 activos que luego puedo usar en CVXOPT después. O cualquier enfoque heurístico como la programación genética. Tal vez vale la pena mencionar que me gustaría mantenerlo lo más simple posible como primer paso.
Ahora mi pregunta es, ¿alguien tiene experiencia en cómo se implementa esto generalmente? ¿Es el enfoque MIP viable? ¿O puedo hacer algo así como un análisis de PCA primero y elegir los 20 activos no correlacionados principales?
Si la programación entera mixta es el camino a seguir, ¿alguien tiene un ejemplo breve en Python donde pueda tener una idea de cómo se puede implementar?
gracias
EDICIÓN: Implementación de la sugerencia de LASSO de David usando cvxpy
import numpy as np
import cvxpy as cvx
np.random.seed(1)
n = 100
mu = np.abs(np.random.randn(n, 1))
Sigma = np.random.randn(n, n)
Sigma = Sigma.T.dot(Sigma)
w = cvx.Variable(n)
lambda_ = cvx.Parameter(sign="positive")
range_ = np.arange(0,100,1)
ret = mu.T*w
risk = cvx.quad_form(w, Sigma)
objetivo = cvx.Minimize(risk + lambda_*cvx.norm(w,1))
restricciones = [cvx.sum_entries(w) == 1, w >= 0]
prob = cvx.Problem(objetivo, restricciones)
weights_count = []
for lambda_vals in range_:
print 'Lambda : ',lambda_vals
lambda_.value = lambda_vals
prob.solve(verbose=False)
print prob.status
output = []
for i in range(len(w.value)):
output.append(round(w[i].value,2))
weights_count.append(sum(1 for i in output if i > 0))
print weights_count
```
0 votos
¿Has echado un vistazo a este documento y paquete de Python NCVX? arxiv.org/pdf/1601.07277.pdf