我需要在安装了英特尔TBB和MKL且只有1GB内存的VS2010中通过使用C ++的蒙特卡罗模拟找到导数的默认概率。
设p(t)表示时间t的导数价格。目前的价格是S(0)= 100.为简单起见,导数定义为(实数导数更复杂): 概率为99%S(t + 1)= S(t)* exp(X),X~N(μ= 0,sigma = 0.01) 以1%的概率,导数跳跃到S(t + 1)= S(t)* 0.4
如果导数在0 <0的某处低于10。 t <= 250,发生以下情况: 如果概率为80%,则S(t)处的导数价格设定为1.5 * S(t)或概率为10%,我们将有违约。
假设我需要运行至少1000万次此衍生物的模拟并计算所有损失。 然后我模拟的默认概率是#defaults / 10mn。序列代码看起来像:
for j = 1 to #simulation/{
for t = 1 to 250{
generate S(t+1)
check if S(t+1) defaults
}
}
如何并行化代码? 随机数生成的最佳策略是什么?我不能生成double a priori类型的随机数,因为10mn * 250 * 2(至少)= 500m随机数* 8Byte = 4GB。
将模拟数量划分为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
}
}
}
任何帮助将不胜感激...... 马特