Generar valores multivariados aleatorios a partir de datos empíricos.

10

Estoy trabajando en una función de Monte Carlo para valorar varios activos con rendimientos parcialmente correlacionados. Actualmente, acabo de generar una matriz de covarianza y alimentar la rmvnorm()función en R. (Genera valores aleatorios correlacionados).

Sin embargo, al observar las distribuciones de los rendimientos de un activo, normalmente no se distribuye.

Esta es realmente una pregunta de dos partes:
1) ¿Cómo puedo estimar algún tipo de PDF o CDF cuando todo lo que tengo son algunos datos del mundo real sin una distribución conocida?

2) ¿Cómo puedo generar valores correlacionados como rmvnorm, pero para esta distribución desconocida (y no normal)?

¡Gracias!


Las distribuciones no parecen ajustarse a ninguna distribución conocida. Creo que sería muy peligroso asumir un parámetro y luego usarlo para la estimación de Monte Carlo.

¿No hay algún tipo de método de arranque o "monte carlo empírico" que pueda ver?

Noé
fuente

Respuestas:

2

(1) Es el CDF que necesitará para generar sus series temporales simuladas. Para construirlo, primero histograma sus cambios de precio / devoluciones. Tome una suma acumulativa de la población de contenedores comenzando con su contenedor más poblado a la izquierda. Normalice su nueva función dividiéndola por la población total de contenedores. Lo que te queda es un CDF. Aquí hay un código numpy que hace el truco:

# Make a histogram of price changes

counts,bin_edges = np.histogram(deltas,numbins,normed=False) # numpy histogram

# Make a CDF of the price changes

n_counts,bin_edges2 = np.histogram(deltas,numbins,normed=True)
cdf = np.cumsum(n_counts)  # cdf not normalized, despite above
scale = 1.0/cdf[-1]
ncdf = scale * cdf

(2) Para generar selecciones correlacionadas, use una cópula. Vea esta respuesta a mi pregunta anterior sobre la generación de series de tiempo correlacionadas.

Pete
fuente
4

Con respecto a la primera pregunta, puede considerar volver a muestrear sus datos. Habría un problema en caso de que sus datos estuvieran correlacionados a lo largo del tiempo (en lugar de estar correlacionados simultáneamente), en cuyo caso necesitaría algo así como un bloque de arranque. Pero para los datos de devoluciones, un simple bootstrap probablemente esté bien.

Supongo que la respuesta a la segunda pregunta depende mucho de la distribución objetivo.

F. Tusell
fuente
3

La respuesta a la primera pregunta es que construyes un modelo. En su caso, esto significa elegir una distribución y estimar sus parámetros.

Cuando tenga la distribución, puede tomar muestras de ella utilizando los algoritmos de Gibbs o Metropolis.

En la nota al margen, ¿realmente necesita una muestra de esta distribución? Generalmente el interés está en alguna característica de la distribución. Puede estimarlo utilizando la distribución empírica a través de bootstrap, o nuevamente construir un modelo para esta característica.

mpiktas
fuente
Estoy interesado en probar posibles rendimientos para un activo determinado. Dado que la distribución no es normal Y los activos están correlacionados con el tiempo, eso crea un desafío al elegir una distribución. Estoy explorando los métodos de Monte Carlo para la optimización de la cartera.
Noah
1
@Noah, ¿ha considerado varios modelos de volatilidad estocástica, como GARCH?
mpiktas
He mirado los modelos GARCH. Sin embargo, GARCH no resolvería este problema. Estoy buscando generar muestras aleatorias correlacionadas de múltiples series de tiempo. El trabajo aleatorio de muestra de norma multivariante, pero requieren la suposición de que los retornos se distribuyen normalmente y, en este caso, no lo son.
Noah
1
@Noah, ¿qué tal el GARCH multivariante? Cada serie individual es GARCH con innovaciones de matriz multivariada normal con matriz de covarianza no diagonal. Entonces los retornos no tendrán una distribución normal, pero estarán correlacionados.
mpiktas
3

Estoy con @mpiktas porque también creo que necesitas un modelo.

Creo que el método estándar aquí sería estimar una cópula para capturar la estructura de dependencia entre los diferentes activos y usar, por ejemplo, distribuciones marginales distribuidas de forma oblicua o t para los diferentes activos. Eso le da una clase de modelo muy general (más general que suponiendo, por ejemplo, una distribución t multivariada) que es más o menos el estándar para su tipo de tarea (por ejemplo, creo que Basilea II requiere que las instituciones financieras utilicen métodos de cópula para estimar su VaR) . Hay un copulapaquete para R.

fabians
fuente
1

Una posible respuesta a la primera parte de la pregunta usando R ... usando la ecdf()función

# simulate some data...
N <- 1000
fdata <- c( rnorm(N %/% 2, mean=14), rnorm(N %/% 2, mean=35))

# here's the Empirical CDF of that data...
E1 <- ecdf(fdata)
plot(E1)

# now simulate 1000 numbers from this ECDF...
ns <- 1000
ans <- as.numeric(quantile(E1, runif(ns)))
hist(ans,pro=T,nclass=113,col='wheat2')
Sean
fuente
1
Esto solo se aplica a datos univariados.
Stéphane Laurent