2012-11-02 57 views
8

Ich bin ziemlich neu in Python, aber für ein Papier in der Universität muss ich einige Modelle anwenden, vorzugsweise Python verwenden. Ich habe ein paar Tage mit dem Code verbracht, den ich angehängt habe, aber ich kann nicht wirklich helfen, was falsch ist, es erzeugt keinen zufälligen Prozess, der wie Standard-Brownian-Bewegungen mit Drift aussieht. Meine Parameter wie mu und sigma (erwarteter Return oder Drift und Volatilität) neigen dazu, nur die Steigung des Noise-Prozesses zu verändern. Das ist mein Problem, alles sieht nach Lärm aus. Hoffe, dass mein Problem ist spezifisch genug, hier ist mein Coode:Python Code: Geometrische Brownsche Bewegung - was ist los?

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

Versuchen Sie, den Code lesbar zu machen. – Mikhail

+0

danke für die Bearbeitung @RocketDonkey –

+0

Kein Problem Mann :) – RocketDonkey

Antwort

15

Nach Wikipedia,

enter image description here

So scheint es, dass

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

statt

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

Seit T stellt den Zeithorizont, denke ich t

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

Nun sollte nach diesen Matlab Beispiele (here und here), es

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

erscheint nicht ,

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

Bitte überprüfen Sie die Mathematik, aber ich könnte falsch liegen.


So setzen sie alle zusammen:

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

Mann, Sie forschen viel schneller als ich :) +1 – RocketDonkey

+0

Heh, danke @ RocketDonkey. – unutbu

+0

Naja, laut Literatur war es meine Formel, aber es sieht viel besser aus, vielen Dank! Gibt es eine Möglichkeit, die Schritte zu erhöhen, damit es eher wie eine kontinuierliche Bewegung aussieht? Wenn ich nur den Schritt vergrößere, erzeugt die exp-Funktion enorme Werte für den Aktienkurs. –

0

Eine zusätzliche Implementierung liefert die Parametrisierung des Gaußschen Gesetzes mit, obwohl die normale fonction (statt standard_normal) , ein bisschen kürzer.

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

Es ist völlig unklar, was Sie fragen. Bitte verbessern Sie Ihre Frage, so dass kein Ermittlungsaufwand notwendig ist, um herauszufinden, was Sie wissen möchten. – Vroomfondel

+0

nichts fragen, nur eine andere Möglichkeit vorzuschlagen – Thabris

+0

Entschuldigung, SO hat mir dies zur Überprüfung vorgelegt und ich hatte den Eindruck, dass dies eine Frage war. Ich habe nicht verstanden, dass ich eine Antwort reviewed * errötendes Gesicht * - Entschuldigung noch einmal, werde nächstes Mal zweimal schauen. – Vroomfondel