Gere valores multivariados aleatórios a partir de dados empíricos

10

Estou trabalhando em uma função de Monte Carlo para avaliar vários ativos com retornos parcialmente correlacionados. Atualmente, eu apenas gero uma matriz de covariância e alimento a rmvnorm()função em R. (gera valores aleatórios correlacionados).

No entanto, observando as distribuições de retorno de um ativo, ele não é normalmente distribuído.

Esta é realmente uma questão de duas partes:
1) Como posso estimar algum tipo de PDF ou CDF quando tudo o que tenho são alguns dados do mundo real sem uma distribuição conhecida?

2) Como posso gerar valores correlatos como rmvnorm, mas para esta distribuição desconhecida (e não normal)?

Obrigado!


As distribuições não parecem se encaixar em nenhuma distribuição conhecida. Eu acho que seria muito perigoso assumir um parâmetro e depois usá-lo para a estimativa de monte carlo.

Não existe algum tipo de método de autoinicialização ou "empírico monte carlo" que eu possa olhar?

Noé
fonte

Respostas:

2

(1) É o CDF que você precisará para gerar suas séries temporais simuladas. Para construí-lo, primeiro histograma, seu preço é alterado / retornado. Pegue uma soma cumulativa da população do compartimento, começando com o compartimento mais à esquerda. Normalize sua nova função dividindo pela população total de posições. O que resta é um CDF. Aqui está um código numpy que faz o truque:

# 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) Para gerar escolhas correlatas, use uma cópula. Veja esta resposta à minha pergunta anterior sobre a geração de séries temporais correlacionadas.

Pete
fonte
4

Em relação à primeira pergunta, você pode considerar uma nova amostragem de seus dados. Haveria um problema caso seus dados fossem correlacionados ao longo do tempo (em vez de contemporâneos), caso em que você precisaria de algo como um bloco de inicialização. Mas para dados de retorno, uma simples inicialização é provavelmente boa.

Eu acho que a resposta para a segunda pergunta depende muito da distribuição de destino.

F. Tusell
fonte
3

A resposta para a primeira pergunta é que você constrói um modelo. No seu caso, isso significa escolher uma distribuição e estimar seus parâmetros.

Quando você tem a distribuição, pode fazer uma amostra usando os algoritmos Gibbs ou Metropolis.

Na nota lateral, você realmente precisa provar desta distribuição? Geralmente o interesse está em alguma característica da distribuição. Você pode estimar usando distribuição empírica via bootstrap ou criar novamente um modelo para essa característica.

mpiktas
fonte
Estou interessado em amostrar possíveis retornos para um determinado ativo. Como a distribuição não é normal E os ativos são correlacionados ao longo do tempo, isso cria um desafio na escolha de uma distribuição. Estou explorando métodos de Monte Carlo para otimização de portfólio.
No24
11
@Noah, você já considerou vários modelos de volatilidade estocástica, como GARCH?
mpiktas
Eu olhei para os modelos GARCH. No entanto, GARCH não resolveria esse problema. Eu estou olhando para gerar amostras aleatórias correlacionadas de várias séries temporais. Amostras aleatórias de normas multivariadas funcionam, mas requerem a suposição de que os retornos são normalmente distribuídos e, nesse caso, não são.
Noah
11
@Noah, que tal GARCH multivariada? Cada série individual é GARCH com inovações do normal multivariado com matriz de covariância não diagonal. Então os retornos não terão distribuição normal, mas serão correlacionados.
mpiktas
3

Estou com @mpiktas porque também acho que você precisa de um modelo.

Penso que o método padrão aqui seria estimar uma cópula para capturar a estrutura de dependência entre os diferentes ativos e usar, por exemplo, distribuições marginais enviesadas com distribuição normal ou t para os diferentes ativos. Isso fornece uma classe de modelo muito geral (mais geral, assumindo, por exemplo, uma distribuição t multivariada) que é praticamente o padrão para o seu tipo de tarefa (por exemplo, acho que Basileia II exige que as instituições financeiras usem métodos de cópula para estimar seu VaR) . Há um copulapacote para R.

fabianos
fonte
1

Uma possível resposta para a primeira parte da pergunta usando R ... usando a ecdf()função

# 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
fonte
11
Isso se aplica apenas a dados univariados.
Stéphane Laurent