Генерация случайных многомерных значений из эмпирических данных

10

Я работаю над функцией Монте-Карло для оценки нескольких активов с частично коррелированной доходностью. В настоящее время я просто генерирую ковариационную матрицу и подаю rmvnorm()функцию в R. (Генерирует коррелированные случайные значения.)

Однако, глядя на распределение доходности актива, он обычно не распределяется.

Это действительно вопрос, состоящий из двух частей:
1) Как я могу оценить какой-то PDF или CDF, когда у меня есть только реальные данные без известного распределения?

2) Как я могу генерировать коррелированные значения, такие как rmvnorm, но для этого неизвестного (и ненормального) распределения?

Спасибо!


Распределения не соответствуют ни одному из известных. Я думаю, что было бы очень опасно предполагать параметрическую и затем использовать ее для оценки Монте-Карло.

Разве я не могу взглянуть на какой-нибудь метод начальной загрузки или «эмпирический метод Монте-Карло»?

Ной
источник

Ответы:

2

(1) Это CDF, который вам понадобится для генерации вашего симулированного временного ряда. Чтобы построить его, сначала гистограмма изменения цены / доходности. Возьмите совокупную сумму совокупности бинов, начиная с самой левой из них. Нормализуйте вашу новую функцию путем деления на общую совокупность бинов. То, что у вас осталось, это CDF. Вот небольшой код, который делает свое дело:

# 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) Чтобы создать коррелированные пики, используйте связку. Посмотрите этот ответ на мой предыдущий вопрос о генерации коррелированных временных рядов.

Пит
источник
4

Что касается первого вопроса, вы можете рассмотреть возможность повторной выборки ваших данных. Возникла бы проблема, если бы ваши данные были коррелированы с течением времени (а не совмещены одновременно), и в этом случае вам понадобится что-то вроде начальной загрузки блока. Но для возвращаемых данных, вероятно, подойдет простой загрузчик.

Я предполагаю, что ответ на второй вопрос очень сильно зависит от целевого распределения.

Ф. Туселл
источник
3

Ответ на первый вопрос заключается в том, что вы строите модель. В вашем случае это означает выбор дистрибутива и оценку его параметров.

Если у вас есть дистрибутив, вы можете попробовать его с помощью алгоритмов Гиббса или Метрополиса.

Кстати, вам действительно нужно попробовать этот дистрибутив? Обычно интерес представляет некоторая характеристика распределения. Вы можете оценить его, используя эмпирическое распределение с помощью начальной загрузки, или снова построить модель для этой характеристики.

mpiktas
источник
Я заинтересован в выборке возможных доходов для данного актива. Поскольку распределение не является нормальным И активы со временем коррелируют, это создает проблему при выборе распределения. Я изучаю методы Монте-Карло для оптимизации портфеля.
Ноя
1
@ Нет, вы рассматривали различные модели стохастической волатильности, такие как GARCH?
mpiktas
Я посмотрел на модели GARCH. Тем не менее, GARCH не решит эту проблему. Я смотрю на генерацию коррелированных случайных выборок из нескольких временных рядов. Случайная выборка с многовариантной нормой работает, но для нее требуется допущение, что отдача обычно распределена, а в этом случае - нет.
Ноя
1
@ Нет, как насчет многомерного GARCH? Каждая отдельная серия представляет собой GARCH с инновациями из многомерной нормали с недиагональной ковариационной матрицей. Тогда возвраты не будут иметь нормального распределения, но они будут взаимосвязаны.
mpiktas
3

Я с @mpiktas в этом, я также думаю, что вам нужна модель.

Я думаю, что стандартный метод здесь должен был бы оценить связку, чтобы захватить структуру зависимости между различными активами и использовать, например, неравномерное нормальное или t-распределенное предельное распределение для различных активов. Это дает вам очень общий модельный класс (более общий, который предполагает, например, многомерное t-распределение), который в значительной степени является стандартом для ваших задач (например, я думаю, что Basel II требует, чтобы финансовые учреждения использовали методы связок для оценки своего VaR) , Есть copulaпакет для R.

фабианцы
источник
1

Возможный ответ на первую часть вопроса, используя R ... используя ecdf()функцию

# 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
Это относится только к одномерным данным.
Стефан Лоран