2 votos

Cartera de varianza mínima en Python

Tengo un portafolio de $N$ activos en $t=10$ días.

import numpy as np
import pandas as pd
n= 10
A = pd.DataFrame([np.random.randn(5) for i in range(n)],columns=['a', 'b', 'c', 'd', 'e'])
A  

T = A.shape[0]
k = A.shape[1]
print(T,k)

La matriz de covarianza

 = A.cov().to_numpy()
Sigma = 
print(Sigma)

Quiero minimizar la varianza con optimización convexa en Python.

De hecho, quiero resolver

$$\min \quad (1/2) w^T \Sigma w$$ s.t $$w_{i}\geq 0,\sum_{i=1}^{n}w_{I} =1$$

Entonces hago:

import cvxpy as cp
w = cp.Variable(n)

# Definiendo objetivo de riesgo
riesgo = cp.quad_form(w,Sigma)
objetivo = cp.Minimize((1/2)*riesgo)

# Restricciones de presupuesto y pesos
restricciones = [cp.sum(w) == 1, 
                w >= 0]
# Solucionador
prob = cp.Problem(objetivo, restricciones)
prob.solve()

pero recibo un error:

Excepción: Dimensiones inválidas para los argumentos.

¿Cuál es mi error aquí? ¿Alguien?

0 votos

Ten cuidado en términos de 1. cuántos activos quieres negociar y 2. cuántas observaciones de rendimiento tienes para dichos activos para estimar la matriz de covarianza.

0voto

John Rennie Puntos 6821

Su matriz Sigma es de 5x5 y no de 10x10, prueba esto

A = pd.DataFrame(
      [np.random.randn(n) for i in range(5*n)],
      columns=[chr(65+i) for i in range(n)]
   )

funcionará.

[ADICIÓN después de un comentario] Asumí que esperabas que la cartera fuera de dimensión 10 (porque escribes n=10;w = cp.Variable(n)), por lo tanto, tu matriz de covarianza debería tener la dimensión de la cartera, es decir, 10.

0 votos

Trabajó, pero me pregunto: la matriz de varianza covarianza es $n \times n$, así que debe ser $5 \times 5$. ¿Por qué $10 \times 10$? (¿es $X^T X / (n-1)$ en cálculos de dimensiones hay $5 \times 10 @ 10 \times 5 = 5 \times 5$)

0 votos

@HungryHomer mi respuesta en mi respuesta ;{)}

0 votos

Muchas gracias. No me di cuenta de eso

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