1

我需要在安装了 Intel TBB 和 MKL 且只有 1GB 内存的 VS2010 中使用 C++ 进行蒙特卡罗模拟来找到导数的默认概率。

令 S(t) 表示衍生品在时间 t 的价格。当前价格为 S(0) = 100。

为简单起见,导数定义为(实数导数更复杂): 概率为 99% S(t+1) = S(t) * exp(X),其中 X ~ N(mu=0, sigma =0.01) 导数以 1% 的概率下降到 S(t+1) = S(t) * 0.4

如果衍生品在 0 < t <=250 的某处低于 10,则会发生以下情况:ha 概率为 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
    }
}

如何并行化代码?随机数生成的最佳策略是什么?我无法先验生成双精度类型的随机数,因为 10mn * 250 * 2(至少)= 500mn 随机数 * 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
        }
    }
}

任何帮助将不胜感激......马特

4

0 回答 0