Generieren Sie zufällige multivariate Werte aus empirischen Daten

10

Ich arbeite an einer Monte-Carlo-Funktion zur Bewertung mehrerer Vermögenswerte mit teilweise korrelierten Renditen. Derzeit generiere ich nur eine Kovarianzmatrix und speise die rmvnorm()Funktion in R ein. (Erzeugt korrelierte Zufallswerte.)

Betrachtet man jedoch die Verteilung der Renditen eines Vermögenswerts, so wird dieser normalerweise nicht verteilt.

Dies ist wirklich eine zweiteilige Frage:
1) Wie kann ich eine Art PDF oder CDF schätzen, wenn ich nur reale Daten ohne bekannte Verteilung habe?

2) Wie kann ich korrelierte Werte wie rmvnorm generieren, aber für diese unbekannte (und nicht normale) Verteilung?

Vielen Dank!


Die Verteilungen scheinen nicht zu einer bekannten Verteilung zu passen. Ich denke, es wäre sehr gefährlich, einen Parameter anzunehmen und diesen dann für die Monte-Carlo-Schätzung zu verwenden.

Gibt es nicht eine Art Bootstrap oder "empirische Monte Carlo" -Methode, die ich mir ansehen kann?

Noah
quelle

Antworten:

2

(1) Es ist die CDF, die Sie benötigen, um Ihre simulierten Zeitreihen zu generieren. Um es zu erstellen, histogrammieren Sie zuerst Ihre Preisänderungen / -renditen. Nehmen Sie eine kumulative Summe der Behälterpopulation, beginnend mit Ihrem am weitesten links befindlichen Behälter. Normalisieren Sie Ihre neue Funktion, indem Sie sie durch die Gesamtmenge der Behälter dividieren. Was Ihnen bleibt, ist eine CDF. Hier ist ein numpy Code, der den Trick macht:

# 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) Verwenden Sie eine Kopula, um korrelierte Picks zu generieren. Siehe diese Antwort auf meine vorherige Frage zum Generieren korrelierter Zeitreihen.

Pete
quelle
4

In Bezug auf die erste Frage können Sie eine erneute Abtastung Ihrer Daten in Betracht ziehen. Es würde ein Problem geben, wenn Ihre Daten im Laufe der Zeit korreliert würden (und nicht gleichzeitig korreliert). In diesem Fall würden Sie so etwas wie einen Block-Bootstrap benötigen. Für die Rückgabe von Daten ist ein einfacher Bootstrap wahrscheinlich in Ordnung.

Ich denke, die Antwort auf die zweite Frage hängt sehr stark von der Zielverteilung ab.

F. Tusell
quelle
3

Die Antwort auf die erste Frage lautet, dass Sie ein Modell erstellen. In Ihrem Fall bedeutet dies, eine Verteilung auszuwählen und ihre Parameter zu schätzen.

Wenn Sie die Distribution haben, können Sie sie mit Gibbs- oder Metropolis-Algorithmen abtasten.

Müssen Sie wirklich von dieser Distribution probieren? Normalerweise liegt das Interesse an einem Merkmal der Verteilung. Sie können es mithilfe der empirischen Verteilung über Bootstrap schätzen oder erneut ein Modell für dieses Merkmal erstellen.

mpiktas
quelle
Ich bin daran interessiert, mögliche Renditen für einen bestimmten Vermögenswert zu ermitteln. Da die Verteilung nicht normal ist UND die Assets im Laufe der Zeit korreliert sind, ist dies eine Herausforderung bei der Auswahl einer Verteilung. Ich untersuche Monte-Carlo-Methoden zur Portfoliooptimierung.
Noah
1
@Noah, haben Sie verschiedene stochastische Volatilitätsmodelle wie GARCH in Betracht gezogen?
mpiktas
Ich habe mir GARCH-Modelle angesehen. GARCH würde dieses Problem jedoch nicht lösen. Ich möchte korrelierte Zufallsstichproben aus mehreren Zeitreihen generieren. Zufällige Multi-Variate-Norm-Stichprobenarbeiten erfordern jedoch die Annahme, dass die Renditen normal verteilt sind, in diesem Fall jedoch nicht.
Noah
1
@Noah, wie wäre es mit multivariater GARCH? Jede einzelne Serie ist GARCH mit Innovationen aus der multivariaten Normalen mit nicht diagonaler Kovarianzmatrix. Dann haben die Renditen keine Normalverteilung, aber sie werden korreliert.
mpiktas
3

Ich bin mit @mpiktas darin, dass ich auch denke, dass Sie ein Modell brauchen.

Ich denke, die Standardmethode hier wäre, eine Kopula zu schätzen, um die Abhängigkeitsstruktur zwischen den verschiedenen Assets zu erfassen und z. B. schräg normal- oder t-verteilte Randverteilungen für die verschiedenen Assets zu verwenden. Das gibt Ihnen eine sehr allgemeine Modellklasse (allgemeiner als die Annahme einer z. B. einer multivariaten t-Verteilung), die so ziemlich der Standard für Ihre Art von Aufgabe ist (z. B. denke ich, dass Basel II von Finanzinstituten verlangt, Copula-Methoden zur Schätzung ihres VaR zu verwenden). . Es gibt ein copulaPaket für R.

Fabianer
quelle
1

Eine mögliche Antwort auf den ersten Teil der Frage mit R ... mit der ecdf()Funktion

# 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
quelle
1
Dies gilt nur für univariate Daten.
Stéphane Laurent