Створити випадкові багатовимірні значення з емпіричних даних


10

Я працюю над функцією Монте-Карло для оцінки кількох активів з частково корельованою віддачею. В даний час я просто генерую коваріаційну матрицю і подаю на rmvnorm()функцію в Р. (Створює корельовані випадкові значення.)

Однак, дивлячись на розподіл прибутку активу, він зазвичай не розподіляється.

Це дійсно питання з двох частин:
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

Відповідь на перше питання полягає в тому, що ви будуєте модель. У вашому випадку це означає вибір розподілу та оцінку його параметрів.

Якщо у вас є дистрибутив, ви можете пробувати його з використанням алгоритмів Gibbs або Metropolis.

Зі сторони, чи справді вам потрібно зробити вибірку з цього розподілу? Зазвичай інтерес викликає деяка характеристика розподілу. Ви можете оцінити це за допомогою емпіричного розподілу за допомогою завантажувальної програми або знову створити модель для цієї характеристики.


Мене цікавить вибірка можливих доходів за певний актив. Оскільки розподіл не є нормальним, а активи з часом співвідносяться, це створює складність у виборі розподілу. Я вивчаю методи Монте Карло для оптимізації портфеля.
Ной

1
@Noah, чи розглядали ви різні стохастичні моделі волатильності, такі як GARCH?
mpiktas

Я переглянув моделі GARCH. Однак GARCH не вирішив би цю проблему. Я дивлюся на генерацію корельованих випадкових вибірок з декількох часових рядів. Випадкові вибіркові норми багатовимірної норми працюють, але вони вимагають припущення, що повернення зазвичай розподіляються, і в цьому випадку вони не є.
Ной

1
@Noah, а як щодо багатовимірного GARCH? Кожна окрема серія GARCH з інноваціями від багатоваріантної нормальної з недіагональною матрицею коваріації. Тоді прибутки не матимуть нормального розподілу, але вони будуть співвідноситись.
mpiktas

3

Я з @mpiktas, тому що я також думаю, що вам потрібна модель.

Я думаю, що стандартним методом було б оцінити копулу, щоб зафіксувати структуру залежності між різними активами та використовувати, наприклад, граничні розподіли коси або нормальні розподіли для різних активів. Це дає вам дуже загальний модельний клас (більш загальний, якщо припустити, наприклад, багатоваріантний t-розподіл), що майже є стандартом для вашого типу завдань (наприклад, я думаю, що Базель II вимагає від фінансових установ використовувати методи копули для оцінки їх VaR) . Є copulaпакет для Р.


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
Це стосується лише одновимірних даних.
Стефан Лоран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.