2012-11-02 203 views
8

我對Python很新,但對於大學的論文,我需要應用一些模型,最好使用Python。我花了幾天的時間閱讀附加的代碼,但是我無法幫助,有什麼不對,它不會創建一個隨機過程,看起來像漂移的標準布朗運動。我的參數如mu和sigma(預期的回報或漂移和波動)往往只會改變噪音過程的斜率。這是我的問題,它看起來像噪音。希望我的問題是不夠具體,這是我coode:Python代碼:幾何布朗運動 - 出了什麼問題?

import math 
from matplotlib.pyplot import * 
from numpy import * 
from numpy.random import standard_normal 

''' 
geometric brownian motion with drift! 

Spezifikationen: 

    mu=drift factor [Annahme von Risikoneutralitaet] 
    sigma: volatility in % 
    T: time span 
    dt: lenght of steps 
    S0: Stock Price in t=0 
    W: Brownian Motion with Drift N[0,1] 
''' 

T=1 
mu=0.025 
sigma=0.1 
S0=20 
dt=0.01 

Steps=round(T/dt) 

t=(arange(0, Steps)) 
x=arange(0, Steps) 
W=(standard_normal(size=Steps)+mu*t)### standard brownian motion### 
X=(mu-0.5*sigma**2)*dt+(sigma*sqrt(dt)*W) ###geometric brownian motion#### 
y=S0*math.e**(X) 

plot(t,y) 

show() 
+0

嘗試使代碼可讀。 – Mikhail

+0

感謝編輯@RocketDonkey –

+0

沒問題的人:) – RocketDonkey

回答

15

Wikipedia

enter image description here

所以看來

X=(mu-0.5*sigma**2)*t+(sigma*W) ###geometric brownian motion#### 

而不是

X=(mu-0.5*sigma**2)*dt+(sigma*sqrt(dt)*W) 

由於T代表的時間跨度,我認爲t應該

t = np.linspace(0, T, N) 

現在,根據這些Matlab的例子(herehere),它出現

W = np.random.standard_normal(size = N) 
W = np.cumsum(W)*np.sqrt(dt) ### standard brownian motion ### 

不,

W=(standard_normal(size=Steps)+mu*t) 

請檢查數學,但是,我可能是錯的。


所以,把他們放在一起:

import matplotlib.pyplot as plt 
import numpy as np 

T = 2 
mu = 0.1 
sigma = 0.01 
S0 = 20 
dt = 0.01 
N = round(T/dt) 
t = np.linspace(0, T, N) 
W = np.random.standard_normal(size = N) 
W = np.cumsum(W)*np.sqrt(dt) ### standard brownian motion ### 
X = (mu-0.5*sigma**2)*t + sigma*W 
S = S0*np.exp(X) ### geometric brownian motion ### 
plt.plot(t, S) 
plt.show() 

產生

enter image description here

+0

男人,你研究比我更快:) +1 – RocketDonkey

+0

嘿,謝謝@RocketDonkey。 – unutbu

+0

哦,根據文獻,這是我的公式,但它看起來好多了,非常感謝!有沒有辦法增加步驟讓它看起來更像連續動作?如果我只是增加這個步驟,exp-funktion將爲股票價格創造巨大的價值 –

0

使用高斯定律的參數化的一個額外的實施雖然正常fonction(而不是standard_normal) ,稍微短一些。

import numpy as np 

T = 2 
mu = 0.1 
sigma = 0.01 
S0 = 20 
dt = 0.01 
N = round(T/dt) 
# reversely you can specify N and then compute dt, which is more common in financial litterature 

X = np.random.normal(mu * dt, sigma* np.sqrt(dt), N) 
X = np.cumsum(X) 
S = S0 * np.exp(X) 
+0

這是完全不清楚你在問什麼。請改善你的問題,以便不需要進行調查,找出你想知道的內容。 – Vroomfondel

+0

沒有問任何問題,只是提出另一種方式 – Thabris

+0

對不起,我給了我這個審查,我的印象是這是一個問題。我不明白,我正在審查一個答案*臉紅 - 再次抱歉,下次看兩次。 – Vroomfondel