2012-03-16 87 views
0

那麼你好,有誰能告訴我是否有一個隨機數發生器用於在QuantLib中實現的泊松分佈隨機變量嗎?如果是的話,我在哪裏可以找到這個代碼?模擬一個跳躍擴散過程,並且需要在時間步驟之間跳轉的次數(即對於每個時間間隔[t_(i-1); t_i [。是否有一種方法可以直接在QuantLib中執行此操作,還是需要使用Boost庫? 提前感謝!帶QuantLib的泊松隨機變量

PS或你會建議通過生成指數分佈的數字,而不是使用實際的跳躍到達時間?

回答

0

無論你模擬菊mp時間或跳轉密度取決於您如何編寫擴散循環。恕我直言,模擬密度更清潔,因爲它需要較少的狀態通過模擬進行。

我不知道您是否會發現已經用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; 

這是基於inverse transform sampling。那裏還有其他幾種技術。

+0

謝謝,我可能需要使用這個,儘管那是我試圖避免的。我偶然發現了Stack Overflow的一些以前提出的問題,並且讀到了這種方法可能存在數值問題。我正在尋找像\t BigInteger種子= 12324; \t MersenneTwisterUniformRng unifMt(seed); \t BoxMullerGaussianRng bmGauss(unifMt);但是對於一個泊松分佈式r.v. – sunshine 2012-03-16 10:37:25

+0

@ sunshine:如果有數字問題,我不確定它們是什麼。如果你發現,我會很高興聽到它。 – 2012-03-16 10:43:01

+0

有趣的我似乎無法找到線索!如果我再次遇到它,我會在這裏發佈。 – sunshine 2012-03-16 15:32:37

0

目前在QuantLib中最接近的是InverseCumulativeRng類模板和InverseCumulativePoisson類;像

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

會給你一個泊松發電機。請注意,它會將樣本作爲雙精度返回,而不是整數:它們將是整數,但用錯誤類型表示。

此外,它看起來像某些原因InverseCumulativeRng不提供一個構造函數接受函數。奇怪的是,我們忽略了...無論如何,你必須編輯<ql/math/randomnumbers/inversecumulativerng.hpp>並添加它;完成後,請將補丁發送到QuantLib郵件列表,然後將其添加到存儲庫。

+0

嘿嘿,我很樂意,不幸的是,我完全不知道該怎麼做。我想我會堅持提升rng然後。謝謝! – sunshine 2012-03-16 15:31:45

+0

只需添加另一個構造函數,它接受IC類型的第二個參數並將其複製到ICND_數據成員中。 – 2012-03-16 15:54:06