2012-03-16 4 views
0

まあこんにちは、誰も私に教えてくださいポアソン分布ランダム変数の乱数ジェネレータQuantLibで実装されていますか?はい、これはどこのコードを見つけるのですか? Jump-Diffusionプロセスをシミュレートし、時間間隔(つまり、各時間間隔[t_(i-1); t_i]の間にジャンプ数を必要とします。これはQuantLibで直接行う方法か、 ?事前に 感謝をライブラリを後押し!QuantLibでポアソンランダム変数

PSまたはあなたの代わりに指数分布の番号を生成することによって、実際のジャンプ到着時間を使用することをお勧めします?あなたは柱をシミュレートするかどうかは

答えて

0

mp時間かジャンプ密度は拡散ループをどのように書くかによって決まります。 IMHOでは、密度をシミュレートすることがよりクリーンです。なぜなら、シミュレーションを進めるために必要な状態が少なくて済むからです。

すでにBoostまたはQuantLibで書かれたものが見つかるかどうかわかりません。しかし、すでに均一なRNGを持っている場合は、ポアソン分布のサンプリングは実際には非常に簡単です。例えば(擬似コード):

p = exp(-lambda); 
F = p; % cumulative distribution function 
N = 0; 
U = rand(); 
while (U > F) 
    N = N + 1; 
    p = p*lambda/N; 
    F = F + p; 
end 
return N; 

はこれはinverse transform samplingに基づいています。そこにはいくつかの他のテクニックがあります。

+0

私は避けようとしていましたが、後でこれを使用する必要があるかもしれません。スタックオーバーフローに関するこれまでのいくつかの質問に私はつまずくと、このアプローチで数値的な問題があるかもしれないことを読みました。私はsthのように探しています\t BigIntegerシード= 12324; \t MersenneTwisterUniformRng unifMt(seed); \t BoxMullerGaussianRng bmGauss(unifMt);しかし、ポアソン分布のr.v. – sunshine

+0

@sunshine:数値的な問題がある場合、私はそれらが何であるか分からない。あなたが知っていれば、私はそれについて聞くことに感謝します。 –

+0

funnily十分に私はスレッドを見つけることができない!私がもう一度それを見つけたら、私はここに投稿します。 – sunshine

0

現在、QuantLibで最も近いのは、InverseCumulativePoissonクラスと共にInverseCumulativeRngクラステンプレートです。何かのように

MersenneTwisterUniformRng unifMt(seed); 
InverseCumulativePoisson f(lambda); 
InverseCumulativeRng<MersenneTwisterUniformRng, InverseCumulativePoisson> rng(unifMt, f); 

ポワソンジェネレータを与えるでしょう。サンプルは整数ではなく、倍精度で返されることに注意してください。整数になりますが、間違った型で表現されます。

また、何らかの理由でInverseCumulativeRngがその関数を受け取るコンストラクタを提供していないように見えます。奇妙なことに私たちは見落としてしまった...とにかく、<ql/math/randomnumbers/inversecumulativerng.hpp>を編集して追加する必要があります。完了したら、パッチをQuantLibメーリングリストに送ってください。それをリポジトリに追加します。

+0

hehe私は、残念なことに私は絶対にどのようにそれを行うのか考えていないことが大好きだ。私は私がブーストrngに固執すると思います。 – sunshine

+0

タイプICの2番目の引数をとり、それをICND_データメンバーにコピーする別のコンストラクタを追加するだけです。 –

関連する問題