具有QuantLib的泊松随机变量

Poisson random variables with QuantLib

本文关键字:随机 变量 QuantLib 具有      更新时间:2023-10-16

你好,有人能告诉我是否有一个在QuantLib中实现的泊松分布随机变量的随机数生成器吗?如果是,我在哪里可以找到该代码?我试图模拟跳跃扩散过程,并需要时间上步骤之间的跳跃次数(即每个时间间隔[t_(I-1);t_I]。有没有方法直接在QuantLib中实现这一点,或者我需要使用boost库?提前感谢!

p.s.或者你会建议使用实际的跳跃到达时间来生成指数分布的数字吗?

是否模拟跳跃时间或跳跃密度取决于如何编写扩散循环。IMHO,模拟密度更干净,因为它需要更少的状态才能通过模拟进行。

我不知道你是否会发现一些已经在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;

这是基于逆变换采样。还有其他几种技术。

当前在QuantLib中最接近的是InverseCumulationRng类模板和InverseCuculationPoisson类;类似的东西

MersenneTwisterUniformRng unifMt(seed);
InverseCumulativePoisson f(lambda);
InverseCumulativeRng<MersenneTwisterUniformRng, InverseCumulativePoisson> rng(unifMt, f);

会给你一个泊松生成器。请注意,它将以双精度返回样本,而不是int:它们将是整数,但用错误的类型表示。

此外,由于某些原因,InverseCumulativeRng似乎没有提供接受该函数的构造函数。奇怪的是,我们忽略了这一点。。。无论如何,您必须编辑<ql/math/randomnumbers/inverseculationrng.hpp>并添加它;完成后,请将补丁发送到QuantLib邮件列表,我会将其添加到存储库中。