1

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
        }
    }
}

任意の助けをいただければ幸いです...マット

4

0 に答える 0