2 votos

Portafolio 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.

En realidad quiero resolver

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

Así que hago :

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

# Definiendo el objetivo del riesgo
risk = 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 comerciar 2. cuántas observaciones de rendimientos 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 a raíz de un comentario] Supuse que esperabas que la cartera tuviera una dimensión de 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

Funcionó, pero me pregunto: la matriz de varianza covarianza es $n \times n$, por lo 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

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