蒙特卡羅

幾何布朗運動的分佈

  • July 8, 2016

請讓我知道我在哪裡弄錯了!

讓GBM滿足SDE $ S(t) $ 是

$$ \frac{dS(t)}{S(t)} = \mu dt + \sigma dW(t). $$ 然後,底層BM $ X(t) $ 會滿足

$$ dX(t) = \left( \mu - \frac{1}{2} \sigma^2 \right)dt + \sigma dW(t). $$ 多次模擬GBM $ t_0 < t_1 < \ldots < t_n $ , 產生 $ n $ 獨立同居 $ \mathcal{N}(0,1) $ 房車, $ Z_i $ , $ \quad i = 1,2,\ldots, n $ 並設置

$$ S(t_{i+1}) = S(t_i)\exp\left(\left( \mu - \frac{1}{2} \sigma^2 \right)(t_{i+1} -t_i) + \sigma \sqrt{t_{i+1} - t_i} Z_{i+1} \right). $$ 然後 $$ \frac{S(t)}{S(0)} = \exp\left(\underbrace{\left(\mu - \frac{1}{2} \sigma^2\right) t + \sigma \sqrt{t}Z}_{\mathcal{N}\left(\left(\mu - \frac{\sigma^2}{2}\right)t, \sigma^2 t\right)} \right) $$ 所以 $$ \log \frac{S(t)}{S(0)} \sim \mathcal{N}\left(\left(\mu - \frac{\sigma^2}{2}\right)t, \sigma^2 t\right). $$ 我想我遺漏了一些東西,因為當我使用這個均值和變異數(在上面的等式中)來測試對數返回的正態性時( $ \log \frac{S(t)}{S(0)} $ ),我得到荒謬的答案。

具體來說,與 $ S_0 = 20 $ , $ \mu = 2 $ , $ \sigma^2 = 1 $ 和分區 $ [0,1] $ 分成 100 個子區間,在這 100 個點生成 GBM 給出的值範圍為 15.399 到 97.1384 $ S(t_i) $ . 然後日誌返回, $ \log S(t_i)/S_0 $ ,範圍從 -0.26143 到 1.5804。我為每個人使用的手段 $ \log S(t_i)/S_0 $ 是(按遞增順序 $ i $ ) $ 0.015, 0.03, 0.045, \ldots, 1.5 $ 變異數是 $ 0.01,0.02, \ldots, 1 $ 因為這些是如上所述的假定正態分佈中的參數。最後,當這些對數返回使用這個均值和變異數進行正規化時,它們的值範圍從 -2.7643 到 0.080404,這顯然不是 $ \mathcal{N}(0,1) $ -分散式。

提前致謝!

更新:我用來測試正態性的測試(Anderson-Darling)依賴於(假設的)正態分佈的獨立樣本,正如一些人在評論中指出的那樣, $ \log S(t_i)/S_0 $ 取決於 $ \log S(t_{i-1})/S_0 $ . 確實,更改為測試表單的返回 $ \log S(t_i)/S(t_{i-1}) $ 導致 Anderon-Darling 測試“通過”(給出 $ A^2 = 0.244 $ 對於那些熟悉的)。

總的來說,您沒有弄錯,儘管值得在您的問題中重新審視幾個步驟。

我們猜測 $ S $ 遵循 SDE

$$ \dfrac{dS}{S} = \mu:dt+ \sigma:dW^\mathbb{P}(t) $$ 在物理測量下 $ \mathbb{P} $ . 如果我們改為風險中性度量 $ \mathbb{Q} $ (使用 Girsanov 定理)然後 $ \mu \to r $ 我們有以下 SDE $$ \dfrac{dS}{S} = r:dt+ \sigma:dW^\mathbb{Q}(t). $$ 在 Black-Scholes 模型下,我們假設 $ r $ , $ \mu $ , 和 $ \sigma $ 是常數(與 $ \sigma > 0 $ ) 我們可以將 SDE 整合到範圍內 $ [t,T] $ 發現 $$ S(T) = S(t)\exp\left(\left(\mu - \dfrac{\sigma^2}{2}\right)(T-t) + \sigma \left(W^\mathbb{Q}(T) - W^\mathbb{Q}(t)\right)\right). $$ 現在要模擬這個過程,我們只需要採樣 $ \left(W^\mathbb{Q}(T) - W^\mathbb{Q}(t)\right) $ 這是通過計算實現的 $ \sqrt{T-t:}Z $ 在哪裡 $ Z\sim N(0,1) $ . 按照這種方法,您會發現 $ \log \left(\dfrac{S(T)}{S(t)}\right) $ 具有所需的正態分佈。 您似乎已經實施的替代方法是為 $ S $ 在這種情況下這是不必要的。但是,如果我們需要知道中間時間的路徑(例如,對於亞洲期權等奇異衍生品),這將是必要的。此時有很多方法可以模擬路徑,最簡單的(您已經實現)是 Euler-Maruyama 方法(替代方案可能包括 Milstein 方法),其中

$$ S(t + \Delta t) = S(t) + S(t)\times\left(\mu \Delta t + \sigma \sqrt{\Delta t:}Z\right) $$ 並將涉及迭代地實現這一點。這計算起來要昂貴得多,因此應盡可能避免,並給出 $ O(\Delta t) $ 收斂於 $ S(T) $ . 我在 Python2.7.10 中給出了以下 2 行實現

import numpy as np
import scipy.stats as stats
s_0, mu, sigma, T, paths, path_steps = [20.0, 2.0, 1.0, 1.0,  100, 100]
s_T = s_0 * np.exp((mu-0.5*(sigma**2))*T + sigma*np.sqrt(T)*np.random.normal(0.0, 1.0, 1000))
print("\"True\" Mean: \t" + str((mu-0.5*(sigma**2))*T))
print("Computed Mean: \t" + str(np.log(s_T/s_0).mean()))
print("\"True\" Standard Deviation: \t\t" + str(sigma*np.sqrt(T)))
print("Computed Standard Deviation: \t" + str(np.log(s_T/s_0).std()))
print("Shaprio-Wilk Normality test, p-value: \t" + str(stats.shapiro(np.log(s_T/s_0))[0]))
print("Anderson-Darling Test:")
print("\t" + str(stats.anderson(np.log(s_T/s_0), dist="norm")))

它具有以下輸出:

"True" Mean:    1.5
Computed Mean:  1.48206641711
"True" Standard Deviation:      1.0
Computed Standard Deviation:    0.983089657019
Shaprio-Wilk Normality test, p-value:   0.998949408531
Anderson-Darling Test:
   AndersonResult(statistic=0.26799531674055288, critical_values=array([ 0.574,  0.653,  0.784,  0.914,  1.088]), significance_level=array([ 15. ,  10. ,   5. ,   2.5,   1. ]))

Shapiro-Wilk 檢驗的高 p 值支持結果呈正態分佈的 Null 假設。我不熟悉 Anderson-Darling 測試,因此請查看包說明並自行解釋結果。

我希望這有幫助。

您缺少的是錯誤的總和。雖然總和是 iid 但如果你想匹配你的數字,那麼你需要正確地對它們求和。sqrt(ti+1 - ti)zi + sqrt(ti - ti-1)zi-1 不等於 sqrt(ti+1 - ti-1)(zi-zi-1)。仍然熟悉數學符號,但我想你明白了。Log(St/S0) 絕對是正常的,但要進行數值比較,您需要考慮正確的錯誤總和。

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