期權定價
如何模擬Poisson和復合Poisson過程
有人知道,也許是網站/部落格,我可以在其中找到提示(最好是現成的程式碼)來模擬流程的軌跡?到目前為止,我只需要 Poisson 過程和復合 Poisson 過程,但我也想學習模擬更高級的過程,所以我會感謝每個來源
編輯:我從 anserws 編輯程式碼一點:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.stats import poisson mu = 3 num_events_simulated = 5 def generate_poisson_process(mu, num_events): time_intervals = -np.log(np.random.random(num_events)) / mu total_events = time_intervals.cumsum() events = pd.DataFrame(np.ones(num_events), index=total_events) events[0] = events[0].cumsum() return events plt.plot(generate_poisson_process(mu, num_events_simulated), marker='o', drawstyle='steps-post') plt.title("Sample Poisson Process") plt.xlabel("time") plt.ylabel("events")
但軌跡從第一次跳躍開始。如何將軌跡從零開始並從 0 到 1 跳躍的片段添加到圖表中?
Poisson分佈中兩個事件之間的時間呈指數分佈,因此最簡單的方法是模擬一系列呈指數分佈的變數,並將其用作事件之間的時間,如本入門中所述。
為了模擬給定均勻 RNG 的變數,我們需要分佈的反向 CDF,它將均勻分佈映射到我們選擇的分佈
對於指數分佈,這只是 $$ \begin{align} F^{-1}(x) = {\frac {-\log(1-x)} {\lambda}} \end{align} $$ 在哪裡 $ \lambda $ 是Poisson參數
我們可以使用
numpy
如下方式進行模擬import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.stats import poisson mu = 15 num_events_simulated = 50 def generate_poisson_process(mu, num_events): time_intervals = -np.log(np.random.random(num_events)) / mu total_events = time_intervals.cumsum() events = pd.DataFrame(np.ones(num_events), index=total_events) events[0] = events[0].cumsum() return events plt.plot(generate_poisson_process(mu, num_events_simulated), marker='o', linestyle='none') plt.title("Sample Poisson Process") plt.xlabel("time") plt.ylabel("events") plt.legend()
這會產生
到目前為止,一切都很好,但我們如何證明這是一個Poisson過程?那麼,對於Poisson過程,一段時間內的事件數 $ \tau $ 分佈為 $ Poi(\tau\lambda) $ ,並且
numpy
可以直接生成這些供我們比較。在這裡,我們生成 100,000 個程序並比較其中的事件數 $ \tau = 1 $ 直接生成變數的結果:
results = [] for x in range(100000): process = generate_poisson_process(mu, num_events_simulated) results.append(process[:1][0].iloc[-1]) plt.hist(results, bins=np.linspace(0, 35, 36), alpha=0.5, label='simulated poisson', ec='black') r = poisson.rvs(mu, size=100000) plt.hist(r, bins=np.linspace(0, 35, 36), alpha=0.5, label='counting process', ec='black') plt.title("Poisson-Distributed Variables") plt.ylabel("Count") plt.xlabel("X") plt.legend()
這會產生
匹配非常好,所以我們對路徑生成過程很滿意!
複合Poisson過程就是對這個的簡單擴展,只要你知道要使用哪個二次分佈,就可以生成根據它分佈的變數。這是使用二項式生成的複合Poisson過程的範例 $ X ~ B(10,0.5) $ 作為次要分佈:
def binomial_generator(num_events): return np.random.binomial(10, 0.5, num_events) def generate_compound_poisson_process(mu, num_events, generator): time_intervals = -np.log(np.random.random(num_events)) / mu total_events = time_intervals.cumsum() events = pd.DataFrame(generator(num_events), index=total_events) events[0] = events[0].cumsum() return events plt.plot(generate_compound_poisson_process(mu, num_events_simulated, binomial_generator), marker='o', linestyle='none') plt.title("Sample Compound Poisson Process (Binomial)") plt.xlabel("time") plt.ylabel("events") plt.legend()
這會產生