Intel TBB と MKL がインストールされ、メモリが 1GB しかない VS2010 で、C++ を使用したモンテカルロ シミュレーションを介して、導関数の既定の確率を見つける必要があります。
S(t) が時間 t におけるデリバティブの価格を表すとします。現在の価格は S(0) = 100 です。
簡単にするために、導関数は次のように定義されます (実際の導関数はより複雑です)。 =0.01) 1% の確率で、導関数は S(t+1) = S(t) * 0.4 にジャンプします。
デリバティブが 0 < t <=250 のどこかで 10 を下回った場合、次のことが起こります: ha 確率が 80 パーセントの場合、S(t) でのデリバティブの価格は 1.5 * S(t) に設定されるか、10 パーセントの確率で設定されます。デフォルトがあります。
このデリバティブのシミュレーションを少なくとも 1,000 万回実行し、すべての損失をカウントする必要があるとしましょう。次に、シミュレートされたデフォルト確率は #defaults / 10mn です。シリアルコードはどういうわけか次のようになります。
for j = 1 to #simulation/{
for t = 1 to 250{
generate S(t+1)
check if S(t+1) defaults
}
}
コードを並列化するにはどうすればよいですか? 乱数生成のための最良の戦略は何ですか? 10mn * 250 * 2 (少なくとも) = 500mn 乱数 * 8Byte = 4GB であるため、アプリオリに double 型の乱数を生成できません。
シミュレーションの数を 10 * プロセッサーの数のチャンクに分割することは良い考えですか?
VSLStreamStatePtr stream[10*#processors];
for i = 1 to 10*#processor{
vslNewStream( &stream[i], VSL_BRNG_MT2203+i, seed );
}
tbb_parallel_for i = 1 to 10*#processors{
use stream[i] for random number generation
generate 10mn / (10*#processor) * 250 random numbers ~ N(0, 0.01) and store them in a vector.
generate 10mn / (10*#processor) * 250 random numbers ~ Bernoulli(0.01) and store them in a vector.
generate 10mn / (10*#processor) * 250 random numbers ~ Bernoulli(0.01) and store them in a vector.
for j = 1 to #simulation/(10*#processors){
use
for t = 1 to 250{
generate S(t+1) using the vectors filled with random numbers
check if S(t+1) defaults
}
}
}
任意の助けをいただければ幸いです...マット