Пуассоновские случайные величины с QuantLib
Ну, привет, кто-нибудь может сказать, если есть генератор случайных чисел для распределенных по Пуассону случайных величин, реализованный в QuantLib? Если да, где я могу найти код для этого? Я пытаюсь смоделировать процесс Jump-Diffusion и нужно количество переходов между шагами во времени (т.е. для каждого временного интервала [t_(i-1);t_i[.] Есть ли способ сделать это непосредственно в QuantLib или мне нужно использовать библиотеку наддува? Заранее спасибо!
ps Или вы бы порекомендовали использовать фактическое время прибытия прыжка, вместо этого генерируя экспоненциально распределенные числа?
2 ответа
Наиболее близким в настоящее время в QuantLib является шаблон класса InverseCumulativeRng вместе с классом InverseCumulativePoisson; что-то вроде
MersenneTwisterUniformRng unifMt(seed);
InverseCumulativePoisson f(lambda);
InverseCumulativeRng<MersenneTwisterUniformRng, InverseCumulativePoisson> rng(unifMt, f);
даст вам генератор Пуассона. Имейте в виду, что сэмплы будут возвращаться в виде двойных, а не целых чисел: они будут целыми числами, но представлены в неправильном виде
Кроме того, по некоторым причинам InverseCumulativeRng не предоставляет конструктор, принимающий функцию. Странно, что мы упустили это из виду... В любом случае вам придется отредактировать
Имитируете ли вы время прыжка или плотность прыжка или нет, зависит от того, как вы пишете диффузионную петлю. ИМХО, симуляция плотности чище, потому что для симуляции требуется меньше состояния, которое переносится вперед.
Я не знаю, найдете ли вы что-нибудь уже написанное в Boost или QuantLib. Но выборка распределения Пуассона на самом деле очень проста, если у вас уже есть однородный ГСЧ. Например (псевдокод):
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;
Это основано на выборке обратного преобразования. Есть несколько других техник.