He utilizado un ejemplo del periódico: Una introducción a la estimación de la contracción de la Matriz de Covarianza: Una ilustración pedagógica
Pude obtener la misma matriz de contracción. He proporcionado la misma matriz que utilizan en su documento.
Espero que esto ayude
import numpy as np
import pandas
from math import pow
def get_shrunk_covariance_matrix(obs, c, zeros):
w_len=c.shape[0]
T=obs.shape[0]
print T, w_len
w=((T-1.0)/T)*c
sq_cov=c*c
sq_cov=sq_cov.as_matrix()
np.fill_diagonal(sq_cov, 0)
sq_cov=pandas.DataFrame(sq_cov).dropna()
frames =[]
for z in range(w_len):
LST=[]
for cc in range(T):
lst=[]
for ccc in range(w_len):
val = pow(obs.loc[cc][z]*obs.loc[cc][ccc]-w.loc[z][ccc],2)
lst.append(val)
LST.append(lst)
df=pandas.DataFrame(LST)
df[z]=0
frames.append(df)
result = pandas.concat(frames)
Sum_of_All_Estimated_Var=result.values.tolist()
sum1=0
for s in Sum_of_All_Estimated_Var: sum1+=sum(s)
a1=(T/pow((T-1),3))*sum1
Sum_of_All_S_ij_Squared=sq_cov.values.tolist()
a2=0
for s in Sum_of_All_S_ij_Squared: a2+=sum(s)
Optimal_Shrinkage_Intensity = a1/(a1+a2)
print Optimal_Shrinkage_Intensity
Shrinkage=(1-Optimal_Shrinkage_Intensity)*c + Optimal_Shrinkage_Intensity*zeros
print Shrinkage
if __name__=="__main__":
n=np.matrix([[10,12,9,-2,17,8,12], [-9,-11,2,-5,-7,2,-2], [16,5,8,5,18,8,9], [6,-3,6,-13,1,4,2], [1,4,-9,5,8,-16,-1], [12,-1,2,22,11,6,10]])
mean = n.mean(axis=0)
n=n-mean
frame = pandas.DataFrame(n).dropna()
c=pandas.DataFrame(np.cov(frame, rowvar=0), index=frame.columns, columns=frame.columns)
C=np.cov(frame, rowvar=0)
D=C.diagonal()
zeros = np.zeros((C.shape[0], C.shape[0]), float)
np.fill_diagonal(zeros, D)
get_shrunk_covariance_matrix(frame, c, zeros)
0 votos
Hay
rpy
yrpy2
para que puedas aprovechar las soluciones de R también en Python...0 votos
He utilizado rpy y rpy2, me gusta mucho. Hay mucha gente que utiliza y está contenta con este flujo en su trabajo: python -> r -> ejecución del modelo -> python.
1 votos
Supongo que usar R y el servidor rstudio es bastante difícil de superar.
3 votos
¿por qué se necesita una biblioteca para esto? Simplemente calcúlalo, yo lo hice una vez y sólo fueron unas pocas líneas de python. Sólo un bucle sobre todas las posibilidades con 0,1% de densidad y no tomó mucho tiempo para calcular. Cuando tienes muchos activos, usa distribuciones listas (en lugar de muchos bucles for internos) para matar el $x^{n}$ -Cálculo de la complejidad temporal -Problema. Es fácil. Hazme saber cómo lo has conseguido. Creo que estás haciendo este problema de una manera demasiado difícil, empezar fácilmente.
0 votos
Nada en Python coincide con Rmetrics, etc. Dicho esto, podría haber un montón de razones para hacer esto en Python, y algunos de los otros comentarios/respuestas ya abordan esto. La respuesta a "biblioteca de python para la optimización de carteras" no es R.
0 votos
@hhh ¿Podría explicar con más detalle cómo utilizar las distribuciones listas para reducir la complejidad del tiempo? Muchas gracias.
0 votos
@Roy lee esto aquí y esto aquí -- casos sencillos, entonces usa alguna distribución lista para matar esta parte
"mySet= [x/density for x in range(int(density))] points="" for (x,y,z) in [(x,y,z) for x,y,z in itertools.product(mySet, repeat=3) if abs(x+y+z-1)<delta]:"
(delta arregla el error de punto flotante), la distribución normal -aproximación para las combinaciones dio resultados bastante buenos, ¿ya está claro?