2017-12-30 28 views
0

Ich habe 2 Dateien GBM_simulation.py und test_GBM.py.Das von IPython erstellte Diagramm ist nicht korrekt

GBM_simulation.py

import numpy as np 

# Return path as numpy array of length and step predefined 

# simulate exact GBM 

def GBM(n, dt, s0, r, sigma): 
    path = np.zeros(n) 
    s_old = s0 
    for i in range(n): 
     s_new = s_old*np.exp((r-sigma**2/2)*dt + sigma*(dt)**(1/2)*np.random.normal()) 
     path[i] = s_new 
     s_old = s_new 
     return path 

# simulate Euler scheme GBM: 

def Euler_GBM(n, dt, s0, r, sigma): 
    path = np.zeros(n) 
    s_old = s0 
    for i in range(n): 
     s_new = s_old*(1 + r*dt + sigma*(dt)**(1/2)*np.random.normal()) 
     path[i] = s_new 
     s_old = s_new 
     return path 

test_GBM.py

import matplotlib.pyplot as plt 
import GBM_simulation as sim 

s0 = 2 
n = 500 
r = 1 
sigma = 1 
dt = 0.001 

exact = sim.GBM(n, dt, s0, r, sigma) 
euler = sim.Euler_GBM(n, dt, s0, r, sigma) 

# Now plot 
plt.plot(exact, label = 'Exact') 
plt.plot(euler, label = 'Euler') 
plt.legend(loc = 'best') 
plt.show() 

Allerdings, wenn ich test_GBM.py auf IPython Konsole ausführen, der Graph ich nicht bekommen überhaupt richtig aussehen. Ich habe auf Jupyter Notebook getestet (mit ein paar kleinen Änderungen) und es hat richtig funktioniert. Warum passiert das?

enter image description here

Edit: das ist die grafische Darstellung I auf Jupyter Notebook bekam

enter image description here

+0

Was meinen Sie mit "es sieht nicht korrekt aus"? Auf Eclipse sieht es genauso aus. Was ist der Unterschied zu der Ausgabe in Jupyter Notebook? Und was waren diese "kleinen Modifikationen"? – MrT

+0

Ich habe das Diagramm auf Jupyter Notebook hinzugefügt. Was ich unter kleinen Änderungen verstehe, ist nur den Austausch von sim.GBM ... durch GBM, sim.Euler_GBM durch Euler_GBM und es gibt keine Zeile: importiere GBM_simulation als sim und lege diese 2 Dateien .py in ein Notebook. – SiXUlm

+1

Matplotlib zeichnet nur, was Sie sagen, um es zu plotten. Es gibt keine Möglichkeit, in beiden obigen Beispielen dieselben Datenpunkte zu zeichnen. Überprüfen Sie Ihren Code, Sie tun etwas anderes irgendwo ... Auch die Handlung, die Sie sagen, ist von Jupyter scheint mit Seaborn getan worden (die tatsächlich Matplotlib verwendet). – tiago

Antwort

1

Ich kann nicht glauben, dass ich das nicht sofort bemerkt haben. Einrückung zählt - Ihre Rückmeldung war in der Schleife. Die korrekte Funktion Definition ist natürlich:

import numpy as np 

# Return path as numpy array of length and step predefined 

# simulate exact GBM 

def GBM(n, dt, s0, r, sigma): 
    path = np.zeros(n) 
    s_old = s0 
    for i in range(n): 
     s_new = s_old*np.exp((r-sigma**2/2)*dt + sigma*(dt)**(1/2)*np.random.normal()) 
     path[i] = s_new 
     s_old = s_new 
    return path 

# simulate Euler scheme GBM: 

def Euler_GBM(n, dt, s0, r, sigma): 
    path = np.zeros(n) 
    s_old = s0 
    for i in range(n): 
     s_new = s_old*(1 + r*dt + sigma*(dt)**(1/2)*np.random.normal()) 
     path[i] = s_new 
     s_old = s_new 
    return path 

Für die Zukunft meiner Fehlerbeseitigungsverfahren - ich die Werte in der Funktion Schleife für jeden einzelnen Datenpunkt zu sehen ausgedruckt, warum die Werte fallen sofort auf Null. Et voilà - es wurde nur ein Datenpunkt berechnet, also muss etwas mit Ihrer Loop-Definition falsch gewesen sein.

+0

Yessss. Was für ein dummer Fehler !!! Mir ist auch nicht aufgefallen, als ich den Code aus dem Notebook kopiert habe. – SiXUlm

Verwandte Themen