2 votos

Simulación de matrices de covarianza con correlación no nula

¿Cómo simularía una matriz de covarianza de 1.000 acciones en la que cada par tiene una correlación distinta de cero?

No tengo ni idea de cómo empezar con esto.

¿Alguna sugerencia?

6voto

Marc Puntos 892

¿Qué significa "simular una matriz de covarianza"?

  • Si la pregunta se refiere a generar una matriz de correlación arbitraria para 1000 acciones, entonces podemos elegir cualquier matriz simétrica con todos los 1s en la diagonal, siempre que cada elemento esté entre -1 y 1 y la matriz sea semidefinido positivo . El gran tamaño de la matriz significa que poner valores aleatorios en cada celda fallará casi con toda seguridad la prueba de semidefinición positiva, así que yo empezaría con una matriz de identidad de 1000*1000 y añadiría una pequeña cantidad aleatoria positiva o negativa a una celda aleatoria (y su reflejo) y comprobaría si la nueva matriz pasa la prueba, luego repetiría este proceso para construir gradualmente una matriz válida. A continuación, la transformamos en una matriz de correlación en una matriz de covarianza multiplicando cada entrada por el producto de las raíces cuadradas de las varianzas de las dos series de precios correspondientes

  • Si la pregunta nos pide entonces que simulemos precios de acciones que obedezcan a la matriz de correlación dada, tenemos que generar series de precios no correlacionadas, y luego hacer un Descomposición Cholesky en la matriz de correlación y aplicarlo para transformar los precios no correlacionados (en realidad, probablemente en la matriz de covarianza, pero debería ser sencillo traducir entre los dos como se describió anteriormente ...)

  • Si la pregunta nos pide simplemente que calculemos la matriz de covarianza de 1.000 acciones dadas sus historias de precios, es sólo un caso de calcular cada covarianza por pares y ponerlas en una matriz (hasta cuestiones como si los precios de las acciones se muestrean en los mismos momentos...)

3voto

David Radcliffe Puntos 136

Sólo voy a aclarar el punto 2 de la excelente respuesta de StackG. (En realidad es un comentario, pero es demasiado largo y tiene demasiados símbolos matemáticos para que quepa en el campo de comentarios).

Supongamos que nos dan una matriz de covarianza $C$ para los rendimientos de $n$ activos. (1000 $\times$ 1000 es 1 millón de entradas - no debería ser demasiado grande para los ordenadores modernos, pero tenga en cuenta sus necesidades de memoria).

Se desea simular los rendimientos de los activos que serían consistentes con las volatilidades y correlaciones en $C$ . Se supone una distribución normal para el rendimiento de cada activo $N(\mu,\sigma^2)$ .

$f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{\frac{(x-\mu)^2}{2\sigma}}$ , donde $\mu$ es la media, que se supondrá que es 0, y $\sigma$ es la desviación estándar (en $C$ de la diagonal).

Usted calcula $n\times n$ matriz $H$ tal que $H \times H^T = C$ . Un método numérico conveniente para hacerlo es la descomposición de Choleski. Sin embargo, Choleski requiere $C$ sea positiva definida. En la práctica, se puede tener algún activo que sea una combinación lineal de otros activos; o se puede tener ruido numérico; o algunas series temporales históricas más cortas que otras. Si $C$ no lo es, pero no está muy lejos de ser definida positiva, entonces hay métodos para retocarla un poco y obtener una matriz definida positiva, de modo que se pueda utilizar Choleski.

Usted genera $Z$ de $n$ números aleatorios normalmente distribuidos. Puedes hacerlo generando primero números aleatorios uniformemente distribuidos usando tu generador de números pseudoaleatorios favorito y luego usando la transformación de Box-Muller. Observe que $Z$ tiene una distribución normal con media 0 y sin correlación.

Entonces sólo hay que multiplicar $Y=HZ$ . Cada escenario $Y$ se distribuye normalmente con media 0 y covarianza $C$ Porque..:

$\overline{Y} = H\overline{Z} = 0.$

$C_Y = \overline{(Y-\overline{Y})(Y-\overline{Y})^T} = \overline{(HZ)(HZ)^T} = \overline{HZZ^TH^T} = H \overline{ZZ^T} H^T = HIH^T = HH^T = C.$

0voto

Laurence Puntos 121

Yo usaría Numpy (una biblioteca de Python) para hacerlo. Hay una función llamada numpy.random.multivariate_normal. Toma 2 argumentos principales, un array de medias (rendimientos esperados de las acciones) y un array (matriz) de covarianzas de las acciones.

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