Générer des valeurs aléatoires multivariées à partir de données empiriques

10

Je travaille sur une fonction Monte Carlo pour évaluer plusieurs actifs avec des rendements partiellement corrélés. Actuellement, je viens de générer une matrice de covariance et d'alimenter la rmvnorm()fonction dans R. (Génère des valeurs aléatoires corrélées.)

Cependant, si l'on regarde les distributions des rendements d'un actif, il n'est pas normalement distribué.

C'est vraiment une question en deux parties:
1) Comment puis-je estimer une sorte de PDF ou de CDF alors que je n'ai que des données du monde réel sans distribution connue?

2) Comment puis-je générer des valeurs corrélées comme rmvnorm, mais pour cette distribution inconnue (et non normale)?

Merci!


Les distributions ne semblent correspondre à aucune distribution connue. Je pense qu'il serait très dangereux de supposer un paramétrique et de l'utiliser ensuite pour l'estimation de monte carlo.

N'y a-t-il pas une sorte de bootstrap ou de méthode "empirique de monte-carlo" que je puisse étudier?

Noé
la source

Réponses:

2

(1) C'est le CDF dont vous aurez besoin pour générer votre série temporelle simulée. Pour le construire, commencez par histogrammer vos changements / retours de prix. Prenez une somme cumulée de la population de bacs en commençant par votre bac le plus à gauche. Normalisez votre nouvelle fonction en divisant par la population totale de bacs. Ce qui vous reste est un CDF. Voici du code numpy qui fait l'affaire:

# 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) Pour générer des choix corrélés, utilisez une copule. Voir cette réponse à ma question précédente sur la génération de séries chronologiques corrélées.

Pete
la source
4

Concernant la première question, vous pourriez envisager de rééchantillonner vos données. Il y aurait un problème au cas où vos données seraient corrélées dans le temps (plutôt que corrélées simultanément), auquel cas vous auriez besoin de quelque chose comme un bootstrap de bloc. Mais pour les données de retour, un simple bootstrap est probablement bien.

Je suppose que la réponse à la deuxième question dépend beaucoup de la distribution cible.

F. Tusell
la source
3

La réponse à la première question est que vous construisez un modèle. Dans votre cas, cela signifie choisir une distribution et estimer ses paramètres.

Lorsque vous avez la distribution, vous pouvez en échantillonner à l'aide des algorithmes Gibbs ou Metropolis.

D'un autre côté, avez-vous vraiment besoin d'échantillonner à partir de cette distribution? Habituellement, l'intérêt porte sur une caractéristique de la distribution. Vous pouvez l'estimer en utilisant la distribution empirique via bootstrap, ou encore construire un modèle pour cette caractéristique.

mpiktas
la source
Je souhaite échantillonner les retours possibles pour un actif donné. Étant donné que la distribution n'est pas normale ET que les actifs sont corrélés dans le temps, cela crée un défi dans le choix d'une distribution. J'explore les méthodes de Monte Carlo pour l'optimisation de portefeuille.
Noah
1
@Noah, avez-vous envisagé différents modèles de volatilité stochastique, tels que GARCH?
mpiktas
J'ai regardé les modèles GARCH. Cependant, GARCH ne résoudrait pas ce problème. Je cherche à générer des échantillons aléatoires corrélés à partir de plusieurs séries chronologiques. Travail d'échantillonnage de norme aléatoire à plusieurs variables, mais ils nécessitent l'hypothèse que les rendements sont normalement distribués et dans ce cas, ils ne le sont pas.
Noah
1
@Noah, que diriez-vous de GARCH multivarié? Chaque série individuelle est GARCH avec des innovations de la normale multivariée avec une matrice de covariance non diagonale. Les rendements n'auront alors pas de distribution normale, mais ils seront corrélés.
mpiktas
3

Je suis avec @mpiktas en ce sens que je pense aussi que vous avez besoin d'un modèle.

Je pense que la méthode standard ici serait d'estimer une copule pour capturer la structure de dépendance entre les différents actifs et utiliser, par exemple, des distributions marginales asymétriques-normales ou t-distribuées pour les différents actifs. Cela vous donne une classe de modèle très générale (plus générale qu'en supposant par exemple une distribution t multivariée) qui est à peu près la norme pour votre type de tâche (par exemple, je pense que Bâle II oblige les institutions financières à utiliser des méthodes de copules pour estimer leur VaR) . Il y a un copulapaquet pour R.

fabians
la source
1

Une réponse possible à la première partie de la question en utilisant R ... en utilisant la ecdf()fonction

# 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
la source
1
Cela ne s'applique qu'aux données univariées.
Stéphane Laurent