Ampirik verilerden rastgele çok değişkenli değerler üretin


10

Kısmen ilişkili getirileri olan birkaç varlığa değer vermek için Monte Carlo işlevi üzerinde çalışıyorum. Şu anda, sadece bir kovaryans matrisi üretiyorum ve rmvnorm()R'deki işleve besliyorum. (İlişkili rasgele değerler üretir.)

Ancak, bir varlığın getirilerinin dağılımına bakıldığında, normal olarak dağıtılmaz.

Bu gerçekten iki bölümden oluşan bir soru:
1) Tek bir PDF veya CDF'yi, bilinen bir dağılımı olmayan gerçek dünya verileri olduğunda nasıl tahmin edebilirim?

2) Bu bilinmeyen (ve normal olmayan) dağılım için rmvnorm gibi ilişkili değerleri nasıl oluşturabilirim?

Teşekkürler!


Dağılımlar bilinen herhangi bir dağılıma uymuyor gibi görünmektedir. Bence bir parametrik varsaymak ve bunu monte carlo tahmini için kullanmak çok tehlikeli olurdu.

Bakabileceğim bir çeşit bootstrap veya "ampirik monte carlo" yöntemi yok mu?

Yanıtlar:


2

(1) Simüle edilmiş zaman serilerinizi oluşturmak için ihtiyacınız olan CDF'dir. İnşa etmek için önce fiyatınız histogramda değişir / döner. En soldaki kalabalık bölgenizden başlayarak, toplam bin popülasyonu toplamını alın. Toplam depo popülasyonuna bölerek yeni işlevinizi normalleştirin. Yaptığınız şey bir CDF. İşte hile yapan bazı numpy kodu:

# 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) İlişkili seçimler oluşturmak için bir kopula kullanın. İlişkili zaman serileri oluşturma hakkındaki önceki sorumun bu cevabına bakın .


4

İlk soru ile ilgili olarak, verilerinizi yeniden örneklemeyi düşünebilirsiniz. Verilerinizin zamanla (çağdaş olarak ilişkilendirilmektense değil) ilişkilendirilmesi durumunda bir sorun olacaktır, bu durumda bir blok önyükleme gibi bir şeye ihtiyacınız olacaktır. Ancak geri dönüş verileri için basit bir önyükleme muhtemelen iyidir.

Sanırım ikinci sorunun cevabı hedef dağılımına çok bağlı.


3

İlk sorunun cevabı bir model inşa etmenizdir. Sizin durumunuzda bu, bir dağıtım seçmek ve parametrelerini tahmin etmek anlamına gelir.

Dağıtıma sahip olduğunuzda Gibbs veya Metropolis algoritmalarını kullanarak örnekleme yapabilirsiniz.

Yan notta, bu dağıtımdan gerçekten örneklemeniz gerekiyor mu? Genellikle ilgi dağılımın bazı özelliklerinde olur. Önyükleme yoluyla ampirik dağılımı kullanarak tahmin edebilir veya tekrar bu özellik için bir model oluşturabilirsiniz.


Belirli bir varlık için olası getirileri örneklemeyle ilgileniyorum. Dağıtım normal olmadığından VE varlıklar zamanla ilişkilendirildiğinden, dağıtımın seçilmesinde zorluk çıkar. Portföy optimizasyonu için monte carlo yöntemlerini araştırıyorum.
Noah

1
@Hayır, GARCH gibi çeşitli stokastik volatilite modellerini düşündünüz mü?
mpiktas

GARCH modellerine baktım. Ancak, GARCH bu sorunu çözmez. Birden fazla zaman serisinden ilişkili rasgele örnekler üretmeye bakıyorum. Rastgele çok değişkenli norm örnek çalışması, ancak iadelerin normal olarak dağıtıldığı varsayımını gerektirir ve bu durumda değildir.
Nuh

1
@Hayır, çok değişkenli GARCH'a ne dersin? Her bir seri, diyagonal olmayan kovaryans matrisi ile çok değişkenli normalden gelen yeniliklerle GARCH'tır. Daha sonra geri dönüşler normal dağılıma sahip olmayacak, ancak ilişkilendirileceklerdir.
mpiktas

3

@Mpiktas'la beraberim ki bir modele ihtiyacınız olduğunu düşünüyorum.

Buradaki standart yöntemin farklı varlıklar arasındaki bağımlılık yapısını yakalamak ve örneğin farklı varlıklar için eğriltme normal veya t dağıtılmış marjinal dağılımları kullanmak için bir kopula tahmin etmek olacağını düşünüyorum. Bu size çok genel bir model sınıfı verir (daha genel bir tür, örneğin göreviniz için standart olan çok değişkenli bir t-dağılımı varsayarsak) (örneğin, Basel II'nin finansal kurumların VaR'larını tahmin etmek için kopula yöntemleri kullanmasını gerektirdiğini düşünüyorum) . copulaR için bir paket var.


1

R ... ecdf()fonksiyonunu kullanarak sorunun ilk kısmına olası bir cevap

# 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
Bu yalnızca tek değişkenli veriler için geçerlidir.
Stéphane Laurent
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.