Este es un problema común en la estimación de matrices de covarianza, con varias posibles soluciones. Una de las más simples implica dos pasos:
(1) Se calcula cada elemento de la matriz de covarianza de la mejor manera posible, lo que significa que se toma la covarianza de las dos series temporales involucradas después de ELIMINAR cualquier par de datos con un valor N/A. (Tenga en cuenta que esto significa que cada elemento de la matriz se basará en un número diferente de observaciones, lo que significa que la matriz resultante no es una matriz de covarianza estándar, por ejemplo, puede que no sea definitivamente positiva). Supongo que para cualquier par de series temporales hay al menos algunas observaciones en común, de lo contrario, es un problema mal planteado como señaló Matthew Gunn.
(2) Se "masajea" la matriz resultante para hacerla definitivamente positiva (y por lo tanto aceptable para usar como matriz de covarianza) utilizando el procedimiento nearPD que está disponible en R enlace
[Incluso después de todo este trabajo, una gran matriz de covarianza será muy 'ruidosa' y de mala calidad. Debería considerar pasos adicionales como 'encogimiento' enlace antes de utilizar los resultados para encontrar una cartera óptima].
2 votos
Parece que la "matriz de covarianza" no es definitivamente positiva, es decir, no es una matriz de covarianza. ¿De dónde proviene cov_matrix?
0 votos
¿Obtienes valores NaN para los pesos de tu cartera? ¿O durante la computación de la matriz de covarianza? Estoy confundido. No veo ningún NaN en el vector de pesos de la cartera $\mathbf{w}$. ¿Estás diciendo que $\mathbf{w}' \Sigma \mathbf{w}$ te da un NaN pero que $\Sigma$ no tiene un NaN y $\mathbf{w}$ no tiene un NaN?
0 votos
@MatthewGunn Sí, w'w me da un NaN pero no tiene un NaN y w no tiene un NaN? Y solo sucede a medida que aumenta el número de activos.
0 votos
@noob2 Tenía varias series temporales de retornos de activos de panda y calculé con
cov_matrix = returns.cov()
0 votos
@PedroRio ¿Hay algún
inf
en algún lugar? ¿Números absurdamente grandes o pequeños? Estoy teniendo dificultades para ver cómo puedes obtener unnan
de la multiplicación de matrices excepto a través de algo como(-np.inf) + np.inf
. Verificaw.min()
,w.max()
. Si no tomas la raíz cuadrada, ¿cuál es el valor que obtienes para la varianza de la cartera? Si tu matriz de covarianza tiene un rango deficiente y no es positiva semi-definida, ¿quizás $\mathbf{w}' \Sigma \mathbf{w}$ sea de alguna manera negativa? Esas son algunas ideas pero tendrás que rastrear qué es lo que está saliendo mal.0 votos
@MatthewGunn El problema es cuando calculo
np.dot(cov_matrix*252, weights)
pero cuando multiplico el valor mínimo de la cov_matrix y el valor mínimo de los pesos obtengo un número y no 'nan'. Lo mismo sucede cuando lo hago con los máximos. Voy a investigar más, pero gracias por las ideas.0 votos
@MatthewGunn Supuse que la cov_matrix no tenía valores 'nan' pero en realidad tiene valores 'nan'. ¿Cuál es el procedimiento estándar para esto? Si sustituyo los valores 'nan' por 0, obtengo un resultado pero no sé si esa es la elección correcta.
0 votos
Definitivamente no es la elección correcta asumir que un NaN se reemplaza por cero correlación. Al calcular correlaciones, debes ignorar NaNs parejos. Tuve una pregunta similar sobre cómo calcular correlaciones ignorando NaNs (estaba usando matlab), pero podría ser útil para ti: stackoverflow.com/questions/29615002/…