Пуассоновские случайные величины с QuantLib - PullRequest
0 голосов
/ 16 марта 2012

Здравствуйте, кто-нибудь может сказать, есть ли генератор случайных чисел для распределенных по Пуассону случайных величин, реализованный в QuantLib? Если да, где я могу найти код для этого? Я пытаюсь смоделировать Jump-Diffusionобрабатывать и нужно количество переходов между шагами во времени (т. е. для каждого временного интервала [t_ (i-1); t_i [.. Есть ли способ сделать это непосредственно в QuantLib или мне нужно использовать библиотеку наддува? Спасибо вadvance!

ps Или вы бы порекомендовали использовать фактическое время прибытия прыжка, вместо этого генерируя экспоненциально распределенные числа?

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Наиболее близким в настоящее время в QuantLib является шаблон класса InverseCumulativeRng вместе с классом InverseCumulativePoisson;что-то вроде

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

даст вам генератор Пуассона.Имейте в виду, что он будет возвращать выборки в виде двойных, а не целых чисел: они будут целыми числами, но представлены в неправильном типе.

Кроме того, по какой-то причине InverseCumulativeRng не предоставляет конструктор, принимающийфункция.Странно, что мы это упустили ... В любом случае, вам придется редактироватьи добавь это;когда вы закончите, отправьте патч в список рассылки QuantLib, и я добавлю его в репозиторий.

0 голосов
/ 16 марта 2012

Моделируете ли вы время прыжка или плотность прыжка или нет, зависит от того, как вы пишете диффузионный цикл. ИМХО, симуляция плотности чище, потому что для симуляции требуется меньше состояний, которые будут перенесены через симуляцию.

Я не знаю, найдете ли вы что-нибудь уже написанное в 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;

Это основано на выборке обратного преобразования . Есть несколько других техник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...