1 votos

Generar una matriz de covarianza aleatoria con varianzas en el rango

Me gustaría generar una matriz de covarianza aleatoria con varianzas en cierto rango.

¿Cómo se puede hacer? (En R si es posible)

He intentado generar una matriz triangular inferior $L$ donde la diagonal $D = \sqrt{V}$ , donde $V$ es el vector de varianzas. El problema radica en el resto de los valores que no se encuentran en la diagonal. No sé cómo generarlos para obtener al final una matriz de covarianza significativa. Por último, sólo haría $C = LL^T$ (Cholesky) para obtener una matriz definida positiva cuya diagonal es $V$ .

1 votos

¿cómo de grande quieres la matriz? generando random la matriz de covarianza no es tan fácil ya que es muy poco probable que una matriz aleatoria tenga propiedades de matriz de cov. (crece muy rápido en número de activos) (semidefinición positiva, etc...) aunque existen métodos.

0 votos

Tampoco está claro qué debería ser aleatorio en tu matriz de covarianzas: ¿las varianzas marginales (vector de varianzas) o la estructura de dependencia lineal (matriz de correlaciones)? De hecho, usted dice que quiere varianzas en un cierto rango, pero parece utilizar un vector fijo $V$ ?

3voto

BigCanOfTuna Puntos 210

Una descomposición útil es, en la notación matricial de R, V = S %*% C %*% S en el que S es una matriz con las desviaciones estándar en la diagonal principal y ceros en el resto, y C es la matriz de correlación. (Véase esta nota sobre Multiplicación de matrices con índices diagonales .)

Para obtener una V , es necesario tener C (semi)-definición positiva. Una forma sencilla de conseguirlo es hacer que la correlación sea una constante positiva.

n <- 5  ## number of assets
C <- array(0.5, dim = c(n, n))
diag(C) <- 1

Para obtener una mayor variación, un enfoque que he utilizado es correlaciones de muestra de un rango razonable. Entonces, por supuesto Por supuesto, no hay garantía de que C es positivo semidefinido, pero se puede reparar. Véase, por ejemplo la función repairMatrix en el paquete NMOF .

2voto

Kris Puntos 3781

No he oído hablar de un método para hacerlo a tu manera. Normalmente, se empieza con la matriz de covarianza y se hace Cholesky para poder generar extracciones aleatorias de la distribución normal multinomial con una matriz de covarianza dada. ¿Quizás es eso lo que quieres?

En cualquier caso, si necesita especificar con precisión las desviaciones, consulte:

Hirschberger, M., Y. Qi, & R. E. Steuer (2007): “Randomly generating portfolio-selection covariance matrices with specified distributional charac- teristics.” European Journal of Operational Research 177(3): pp. 1610–1625.

Pero tienen que ser bastante específicos y no fui capaz de hacer funcionar su algoritmo.

Pero creo que es más adecuado el PD más cercano de Higham (implementado en R en Matrix paquete, función nearPD .

Higham, N. J. (2002): “Computing the nearest correlation matrix—a problem from finance.” IMA journal of Numerical Analysis 22(3): pp. 329–343.

1voto

Lie Ryan Puntos 15629

No me queda del todo claro qué es lo que realmente quieres, pero el siguiente planteamiento podría ayudar.

Supongo que se pueden generar (muestras de) "varianzas en un rango determinado". Por lo tanto, dejemos que $\sigma_1^2,\ldots,\sigma_n^2$ sea una (instancia de) tales variantes.

Su problema entonces es encontrar una manera de generar matrices simétricas aleatorias con valores propios $\sigma_1^2,\ldots,\sigma_n^2$ . Según el teorema espectral una matriz real de n por n $C$ es positiva definida con tales valores propios si y sólo si permite la diagonalización ortogonal, es decir, la factorización

$$ C = Q D Q^T$$

donde $D=\text{diag}(\sigma_1^2,\ldots,\sigma_n^2)$ es una diagonal y $Q$ una matriz ortogonal de n por n.

Como sabes $D$ lo único que hay que hacer es probar las matrices ortogonales. Esto se puede hacer en R utilizando rortho del paquete pracma .

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