期權定價

如何模擬Poisson和復合Poisson過程

  • August 10, 2020

有人知道,也許是網站/部落格,我可以在其中找到提示(最好是現成的程式碼)來模擬流程的軌跡?到目前為止,我只需要 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過程?那麼,對於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過程的計數

匹配非常好,所以我們對路徑生成過程很滿意!

複合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()

這會產生

在此處輸入圖像描述

引用自:https://quant.stackexchange.com/questions/57225