2012-11-02 25 views
8

मैं पाइथन के लिए काफी नया हूं, लेकिन विश्वविद्यालय में एक पेपर के लिए मुझे अधिमानतः पायथन का उपयोग करके कुछ मॉडल लागू करने की आवश्यकता है। मैंने संलग्न कोड के साथ कुछ दिन बिताए, लेकिन मैं वास्तव में मदद नहीं कर सकता, क्या गलत है, यह एक यादृच्छिक प्रक्रिया नहीं बना रहा है जो बहाव के साथ मानक ब्राउनियन गति की तरह दिखता है। मेरे पैरामीटर जैसे म्यू और सिग्मा (अपेक्षित वापसी या बहाव और अस्थिरता) शोर प्रक्रिया की ढलान के अलावा कुछ भी नहीं बदलते हैं। यह मेरी समस्या है, यह सब शोर की तरह दिखता है। आशा है कि मेरी समस्या काफी विशेष है, यहाँ मेरी coode है:पायथन कोड: ज्यामितीय ब्राउनियन मोशन - क्या गलत है?

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) 

अब होना चाहिए, इन मैटलैब उदाहरण (here और here) के अनुसार, ऐसा लगता है

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

ओह ठीक है, साहित्य के अनुसार यह मेरा सूत्र था, लेकिन यह इस तरह से बहुत बेहतर दिखता है, बहुत बहुत धन्यवाद! क्या यह निरंतर गति की तरह दिखने के लिए कदम बढ़ाने का कोई तरीका है? यदि मैं केवल चरण बढ़ाता हूं तो एक्सप-फ़ंक्शनशन स्टॉक मूल्य –

0

गाऊसी कानून के parametrization का उपयोग कर एक अतिरिक्त कार्यान्वयन हालांकि सामान्य 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

संबंधित मुद्दे