那么你好,有没有人可以告诉我,如果在QuantLib中实现Poisson分布随机变量的随机数生成器?如果是,我在哪里找到这个代码?我试图模拟跳跃扩散处理并需要时间步之间的跳转次数(即每个时间间隔[t_(i-1); t_i [。)有没有办法直接在QuantLib中执行此操作,还是需要使用boost库? 提前谢谢!
P.S。或者你会建议通过生成指数分布的数字来使用实际的跳转到达时间吗?
答案 0 :(得分:0)
您是否模拟跳跃时间或跳跃密度取决于您如何编写扩散环。恕我直言,模拟密度更清晰,因为它需要更少的状态来进行模拟。
我不知道你是否会找到已经用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;
这基于inverse transform sampling。还有其他一些技术。
答案 1 :(得分:0)
您目前在QuantLib中最接近的是InverseCumulativeRng类模板以及InverseCumulativePoisson类;
之类的东西MersenneTwisterUniformRng unifMt(seed);
InverseCumulativePoisson f(lambda);
InverseCumulativeRng<MersenneTwisterUniformRng, InverseCumulativePoisson> rng(unifMt, f);
会给你一个泊松发生器。请注意,它会将样本作为双精度返回,而不是整数:它们将是整数,但表示错误的类型。
此外,由于某种原因,InverseCumulativeRng似乎没有提供构造函数来获取该函数。奇怪的是我们忽略了......无论如何,你必须编辑&lt; ql / math / randomnumbers / inversecumulativerng.hpp&gt;并添加它;完成后,请将补丁发送到QuantLib邮件列表,然后将其添加到存储库中。