経験的データからランダムな多変量値を生成する


10

私は、部分的に相関関係のある収益を持ついくつかの資産を評価するためのモンテカルロ関数に取り組んでいます。現在、私は共分散行列をrmvnorm()生成し、R の関数にフィードするだけです(相関ランダム値を生成します)。

ただし、資産のリターンの分布を見ると、通常は分布していません。

これは実際には2つの部分からなる質問です
。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

最初の質問に関しては、データのリサンプリングを検討するかもしれません。データが(同時に相関されるのではなく)時間の経過とともに相関される場合、問題が発生します。その場合、ブロックブートストラップのようなものが必要になります。ただし、戻りデータの場合、単純なブートストラップでおそらく問題ありません。

2番目の質問に対する答えは、ターゲットの分布に大きく依存していると思います。


3

最初の質問に対する答えは、モデルを構築することです。あなたの場合、これは分布を選択し、そのパラメーターを推定することを意味します。

分布がある場合は、ギブスまたはメトロポリスアルゴリズムを使用して分布からサンプリングできます。

余談ですが、本当にこの分布からサンプリングする必要がありますか?通常、関心は分布のいくつかの特性にあります。ブートストラップによる経験的分布を使用してそれを推定するか、この特性のモデルを再度構築できます。


特定の資産の可能なリターンのサンプリングに興味があります。分布は正常ではなく、アセットは時間の経過とともに相関するため、分布の選択に課題が生じます。ポートフォリオの最適化のためにモンテカルロ法を模索しています。
2010

1
@ノア、GARCHなどのさまざまな確率的ボラティリティモデルを検討しましたか?
mpiktas 2010

私はGARCHモデルを見てきました。しかし、GARCHはこの問題を解決しません。複数の時系列から相関ランダムサンプルを生成することを検討しています。ランダムな多変量ノルムのサンプルは機能しますが、リターンは正規分布であるという前提が必要ですが、この場合はそうではありません。
ノア

1
@ノア、多変量GARCHはどうですか?個々のシリーズはGARCHであり、非対角共分散行列を使用した多変量正規分布からのイノベーションを備えています。そうすると、リターンは正規分布になりませんが、相関関係があります。
mpiktas 2010

3

@mpiktasを使用しているので、モデルも必要だと思います。

ここでの標準的な方法は、コピュラを推定してさまざまな資産間の依存構造をキャプチャし、たとえばさまざまな資産にスキュー正規分布またはt分布の周辺分布を使用することだと思います。これにより、非常に一般的なモデルクラス(たとえば、多変量t分布を想定するとより一般的)が、タスクの種類の標準にかなり近づきます(たとえば、バーゼルIIでは金融機関がコピュラ法を使用してVaRを推定する必要があると思います)。 。copulaR用のパッケージがあります。


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
これは一変量データにのみ適用されます。
ステファン・ローラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.