Generuj losowe wartości wielowymiarowe z danych empirycznych


10

Pracuję nad funkcją Monte Carlo do wyceny kilku aktywów o częściowo skorelowanych zwrotach. Obecnie właśnie generuję macierz kowariancji i przesyłam do rmvnorm()funkcji w R. (Generuje skorelowane wartości losowe).

Jednak patrząc na rozkłady zysków danego składnika aktywów, zwykle nie jest on rozkładany.

To jest naprawdę dwuczęściowe pytanie:
1) Jak mogę oszacować jakiś rodzaj pliku PDF lub CDF, gdy wszystko, co mam, to dane z prawdziwego świata bez znanej dystrybucji?

2) Jak mogę wygenerować skorelowane wartości, takie jak rmvnorm, ale dla tego nieznanego (i nienormalnego) rozkładu?

Dzięki!


Rozkłady nie wydają się pasować do żadnego znanego rozkładu. Myślę, że bardzo niebezpieczne byłoby przyjęcie parametru parametrycznego, a następnie użycie go do oszacowania Monte Carlo.

Czy nie jest jakiś rodzaj bootstrapu lub metoda „empirycznego monte carlo”, na którą mogę spojrzeć?

Odpowiedzi:


2

(1) Jest to CDF, którego potrzebujesz, aby wygenerować symulowane szeregi czasowe. Aby go zbudować, najpierw histogram zmian / zwrotów ceny. Weź łączną sumę populacji bin, zaczynając od kosza najbardziej zaludnionego po lewej stronie. Normalizuj nową funkcję, dzieląc ją przez całkowitą populację bin. Pozostaje ci CDF. Oto kod numpy, który działa:

# 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) Aby wygenerować skorelowane typy, użyj kopuły. Zobacz tę odpowiedź na moje poprzednie pytanie dotyczące generowania skorelowanych szeregów czasowych.


4

Jeśli chodzi o pierwsze pytanie, możesz rozważyć ponowne próbkowanie danych. Pojawiłby się problem, gdyby twoje dane były skorelowane w czasie (a nie jednocześnie), w którym to przypadku potrzebujesz czegoś takiego jak blokowy bootstrap. Ale w przypadku danych zwrotnych prosty ładowanie jest prawdopodobnie w porządku.

Wydaje mi się, że odpowiedź na drugie pytanie zależy w dużym stopniu od dystrybucji docelowej.


3

Odpowiedź na pierwsze pytanie brzmi: zbuduj model. W twoim przypadku oznacza to wybór rozkładu i oszacowanie jego parametrów.

Gdy masz rozkład, możesz z niego próbkować przy użyciu algorytmów Gibbs lub Metropolis.

Na marginesie, czy naprawdę musisz próbować z tej dystrybucji? Zwykle zainteresowanie leży w jakiejś charakterystyce rozkładu. Możesz to oszacować za pomocą rozkładu empirycznego za pomocą bootstrap lub ponownie zbudować model dla tej cechy.


Jestem zainteresowany próbkowaniem możliwych zwrotów dla danego zasobu. Ponieważ rozkład nie jest normalny ORAZ aktywa są skorelowane w czasie, stanowi to wyzwanie przy wyborze rozkładu. Badam metody Monte Carlo w celu optymalizacji portfela.
Noah

1
@ Nie, czy zastanawiałeś się nad różnymi modelami zmienności stochastycznej, takimi jak GARCH?
mpiktas,

Spojrzałem na modele GARCH. Jednak GARCH nie rozwiązałby tego problemu. Patrzę na generowanie skorelowanych losowych próbek z wielu szeregów czasowych. Próbki losowe z wieloma zmiennymi normami działają, ale wymagają założenia, że ​​zwroty są zwykle rozkładane, aw tym przypadku tak nie jest.
Noah

1
@ Nie, a może wielowymiarowy GARCH? Każda seria jest GARCH z innowacjami od wielowymiarowej normalnej z niediagonalną macierzą kowariancji. Wówczas zwroty nie będą miały rozkładu normalnego, ale będą skorelowane.
mpiktas

3

Jestem z @mpiktas, ponieważ myślę, że potrzebujesz modelu.

Myślę, że tutaj standardową metodą byłoby oszacowanie kopuły w celu uchwycenia struktury zależności między różnymi aktywami i zastosowanie np. Rozkładów skośnych normalnych lub rozkładów krańcowych dla różnych aktywów. To daje bardzo ogólną klasę modelu (bardziej ogólną niż zakładanie np. Wielowymiarowej dystrybucji t), która jest w zasadzie standardem dla twojego rodzaju zadania (np. Myślę, że Basel II wymaga od instytucji finansowych zastosowania metod kopuły do ​​oszacowania ich VaR) . Jest copulapaczka dla R.


1

Możliwa odpowiedź na pierwszą część pytania za pomocą R ... za pomocą ecdf()funkcji

# 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
Dotyczy to tylko danych jednowymiarowych.
Stéphane Laurent,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.