0

こんにちは、QuantLibに実装されているポアソン分布確率変数の乱数ジェネレーターがあるかどうか教えてください。ある場合は、このコードはどこにありますか?ジャンプ拡散プロセスをシミュレートしようとしていますが、時間内のステップ間のジャンプの数(つまり、各時間間隔[t_(i-1); t_i [。QuantLibでこれを直接行う方法はありますか、それともブーストライブラリを使用する必要がありますか?よろしくお願いします。

psまたは、代わりに指数分布の数値を生成して、実際のジャンプ到着時間を使用することをお勧めしますか?

4

2 に答える 2

0

現在QuantLibで取得できる最も近いものは、InverseCumulativePoissonクラスと一緒のInverseCumulativeRngクラステンプレートです。何かのようなもの

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

ポアソンジェネレーターを提供します。サンプルはintではなくdoubleとして返されることに注意してください。整数になりますが、間違ったタイプで表現されます。

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

于 2012-03-16T13:50:25.523 に答える
0

ジャンプ時間またはジャンプ密度をシミュレートするかどうかは、拡散ループの作成方法によって異なります。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;

これは逆変換サンプリングに基づいています。他にもいくつかのテクニックがあります。

于 2012-03-16T10:22:50.160 に答える