2012-11-02 21 views
8

Jestem całkiem nowy w Pythonie, ale na papierze na uniwersytecie muszę zastosować kilka modeli, najlepiej Python. Spędziłem kilka dni z kodem, który dołączyłem, ale nie mogę naprawdę pomóc, co jest nie tak, to nie tworzy losowego procesu, który wygląda jak standardowe ruchy brwińskie z dryfem. Moje parametry, takie jak mu i sigma (oczekiwany zwrot lub dryf i zmienność), nie zmieniają nic poza nachyleniem procesu szumu. To mój problem, wszystko wygląda jak hałas. Nadzieję, że mój problem jest na tyle specyficzny, tu jest mój Coode:Kod Pythona: Geometryczne ruchy Browna - co jest nie tak?

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

Postaraj się, aby kod był czytelny. – Mikhail

+0

dziękuję za edycję @RocketDonkey –

+0

Żaden mężczyzna problem :) – RocketDonkey

Odpowiedz

15

Według Wikipedia,

enter image description here

pojawia się więc, że

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

zamiast

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

Od T reprezentuje horyzont czasowy, myślę t powinny być

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

Teraz, zgodnie z tymi przykładami Matlab (here i here), wydaje się,

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

,

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

Proszę sprawdzić matematykę, jednak mogę się mylić.


więc wprowadzenie go wszystkie razem:

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

daje

enter image description here

+0

Człowieku, badasz znacznie szybciej niż ja :) +1 – RocketDonkey

+0

Heh, dzięki @RocketDonkey. – unutbu

+0

No cóż, według literatury była to moja formuła, ale wygląda to o wiele lepiej w ten sposób, wielkie dzięki! Czy istnieje sposób na zwiększenie kroków, aby wyglądał bardziej jak ciągły ruch? Jeśli tylko zwiększę ten krok, funkcja exp wygeneruje ogromne wartości dla ceny akcji: –

0

dodatkowymi mechanizmami za pomocą parametryzacji prawa Gaussa chociaż normalny fonction (zamiast standard_normal) , nieco krótszy.

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

Nie jest jasne, o co pytasz. Popraw swoje pytanie, aby nie było wysiłku dochodzeniowego koniecznego, aby dowiedzieć się, co chcesz wiedzieć. – Vroomfondel

+0

nic nie pytając, po prostu proponując inny sposób działania – Thabris

+0

Niestety, SO przedstawił mi to do przeglądu i miałem wrażenie, że to było pytanie. Nie zrozumiałem, że przeglądam odpowiedź * rumieniącą się twarz * - przepraszam raz jeszcze, będę wyglądał dwa razy następnym razem. – Vroomfondel