2012-03-16 4 views
0

안녕하세요, 혹시 포아송 분산 랜덤 변수가 QuantLib에 구현되어 있는지 알려주시겠습니까? 그렇다면이 코드는 어디에서 찾을 수 있습니까? Jump-Diffusion 프로세스를 시뮬레이트하고 시간 간격 (즉, 각 시간 간격 [t_ (i-1); t_i]에서 점프 수를 필요로합니다. QuantLib에서 직접이를 수행하는 방법이 있습니까? ! 사전에?QuantLib로 포아송 무작위 변수

PS를 감사 라이브러리를 향상 또는 대신 기하 급수적으로 분산 번호를 생성하여 실제 점프 도착 시간을 사용하는 것이 좋습니다?

답변

0

을 당신이 광주를 시뮬레이션 여부 mp 시간 또는 점프 밀도는 확산 루프를 작성하는 방법에 따라 다릅니다. 이모 (IMHO), 밀도 시뮬레이션은 더 깨끗합니다. 왜냐하면 시뮬레이션을 통해 이월 될 상태가 더 적기 때문입니다.

Boost 또는 QuantLib에 이미 기록 된 것을 찾을 수 있는지 알 수 없습니다. 그러나 이미 균일 한 RNG를 가지고 있다면 Poisson 분포를 샘플링하는 것은 실제로 매우 간단합니다. 예 (의사 코드)의 경우 :

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을 기반으로합니다. 거기에 몇 가지 다른 기술이 있습니다.

+0

필자는 피하려고했지만 그래도 이걸 사용해야 할 수도 있습니다. Stack Overflow에서 이전에 몇 가지 질문을 던지며이 접근법에 수치적인 문제가있을 수 있음을 읽었습니다. 나는 sth를 찾고있다 \t BigInteger seed = 12324; \t MersenneTwisterUniformRng unifMt (seed); \t BoxMullerGaussianRng bmGauss (unifMt); 그러나 포아송은 r.v. – sunshine

+0

@ sunshine : 숫자 문제가있는 경우 그 내용이 확실하지 않습니다. 알아 낸 점에 대해 감사하게 생각합니다. –

+0

funnily 정도로 나는 실을 찾을 수가 없어! 만약 내가 다시 그것을 가로 질러 여기에 게시됩니다. – sunshine

0

현재 QuantLib에서 가장 가까운 것은 InverseCumulativePoisson 클래스와 함께 InverseCumulativeRng 클래스 템플릿입니다.

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

처럼 푸 아송 생성기를 제공합니다. int가 아닌 double을 샘플로 반환합니다. 정수가되지만 잘못된 형식으로 표현됩니다.

또한 InverseCumulativeRng은 어떤 이유로 인해 함수를 사용하는 생성자를 제공하지 않습니다. 이상하게도 간과 해 버렸습니다 ... 어쨌든 <ql/math/randomnumbers/inversecumulativerng.hpp>을 편집하여 추가해야합니다. 작업이 끝나면 패치를 QuantLib 메일 링리스트에 보내 주시면 저장소에 추가하겠습니다.

+0

hehe 나는 he 'd가 불행하게도 그것을 좋아하는 방법을 전혀 모르고있다. .. 나는 내가 그 다음 밀어 올림 rng에 달라 붙을 것이다라고 생각한다. 고맙습니다! – sunshine

+0

유형 IC의 두 번째 인수를 취하여 ICND_ 데이터 멤버에 복사하는 다른 생성자를 추가하기 만하면됩니다. –