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