Genera valori multivariati casuali da dati empirici


10

Sto lavorando a una funzione Monte Carlo per valutare diverse attività con rendimenti parzialmente correlati. Attualmente, ho appena generato una matrice di covarianza e mi sono nutrito con la rmvnorm()funzione in R. (Genera valori casuali correlati).

Tuttavia, osservando le distribuzioni dei rendimenti di un'attività, non viene normalmente distribuita.

Questa è davvero una domanda in due parti:
1) Come posso stimare un tipo di PDF o CDF quando tutto ciò che ho sono alcuni dati del mondo reale senza una distribuzione nota?

2) Come posso generare valori correlati come rmvnorm, ma per questa distribuzione sconosciuta (e non normale)?

Grazie!


Le distribuzioni non sembrano adattarsi a nessuna distribuzione nota. Penso che sarebbe molto pericoloso assumere un parametro e quindi usarlo per la stima di Monte Carlo.

Non c'è una specie di bootstrap o metodo "empirical monte carlo" che posso vedere?

Risposte:


2

(1) È il CDF necessario per generare le serie temporali simulate. Per costruirlo, prima istogramma le variazioni / i rendimenti dei prezzi. Prendi una somma cumulativa della popolazione del cestino a partire dal cestino più popolato a sinistra. Normalizza la tua nuova funzione dividendo per la popolazione totale del cestino. Ciò che ti rimane è un CDF. Ecco qualche codice intorpidito che fa il trucco:

# 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) Per generare scelte correlate, utilizzare una copula. Vedi questa risposta alla mia domanda precedente sulla generazione di serie temporali correlate.


4

Per quanto riguarda la prima domanda, potresti prendere in considerazione la possibilità di ricampionare i tuoi dati. Ci sarebbe un problema nel caso in cui i tuoi dati fossero correlati nel tempo (piuttosto che contemporaneamente correlati), nel qual caso avresti bisogno di qualcosa come un blocco bootstrap. Ma per i dati di restituzione, probabilmente un semplice bootstrap va bene.

Immagino che la risposta alla seconda domanda dipenda molto dalla distribuzione del target.


3

La risposta alla prima domanda è che costruisci un modello. Nel tuo caso questo significa scegliere una distribuzione e stimarne i parametri.

Quando hai la distribuzione, puoi campionarla usando gli algoritmi Gibbs o Metropolis.

Nella nota a margine, hai davvero bisogno di campionare da questa distribuzione? Di solito l'interesse è per alcune caratteristiche della distribuzione. Puoi stimarlo usando la distribuzione empirica tramite bootstrap o creare nuovamente un modello per questa caratteristica.


Sono interessato a campionare i possibili rendimenti per un determinato bene. Poiché la distribuzione non è normale E le risorse sono correlate nel tempo, ciò crea una sfida nella scelta di una distribuzione. Sto esplorando i metodi Monte Carlo per l'ottimizzazione del portafoglio.
Noah,

1
@Noah, hai preso in considerazione vari modelli di volatilità stocastica, come GARCH?
mpiktas,

Ho esaminato i modelli GARCH. Tuttavia, GARCH non risolverebbe questo problema. Sto cercando di generare campioni casuali correlati da più serie temporali. Il campione casuale a norma multi-variabile funziona, ma richiedono l'assunto che i rendimenti siano normalmente distribuiti e in questo caso non lo sono.
Noè, il

1
@Noah, che ne dici di GARCH multivariato? Ogni singola serie è GARCH con innovazioni dalla multivariata normale con matrice di covarianza non diagonale. Quindi i rendimenti non avranno una distribuzione normale, ma saranno correlati.
mpiktas,

3

Sono con @mpiktas in quanto penso anche tu abbia bisogno di un modello.

Penso che il metodo standard qui sarebbe quello di stimare una copula per catturare la struttura di dipendenza tra i diversi asset e usare ad esempio distribuzioni marginali skew-normal- o t-distribuite per i diversi asset. Questo ti dà una classe di modello molto generale (più generale che assumere ad esempio una distribuzione t multivariata) che è praticamente lo standard per il tuo tipo di attività (ad esempio, penso che Basilea II richieda agli istituti finanziari di usare metodi di copula per stimare il loro VaR) . C'è un copulapacchetto per R.


1

Una possibile risposta alla prima parte della domanda usando R ... usando la ecdf()funzione

# 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')

1
Questo vale solo per i dati univariati.
Stéphane Laurent,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.