Код Python: геометрическое броуновское движение - что не так?

Я довольно плохо знаком с Python, но для статьи в университете мне нужно применить некоторые модели, предпочтительно с использованием Python. Я провел пару дней с кодом, который я приложил, но я могуне очень помогает, чтоэто неправильно, этоне создает случайный процесс, который выглядит как стандартные броуновские движения со сносом. Мои параметры, такие как mu и sigma (ожидаемая доходность или дрейф и изменчивость), имеют тенденцию ничего не менять, кроме наклона шумового процесса. Тот'С моей проблемой все выглядит как шум. Надеюсь, что моя проблема достаточно конкретна, вот мой куд:

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()
 Sebastian Schrön02 нояб. 2012 г., 22:12
спасибо за редактирование @RocketDonkey
 gliptak22 дек. 2012 г., 21:31
ссылка на сайтstackoverflow.com/questions/5774433/...
 RocketDonkey02 нояб. 2012 г., 22:14
Нет проблем, чувак :)
 Mikhail02 нояб. 2012 г., 22:03
Попробуйте сделать код читабельным.

Ответы на вопрос(2)

использующая параметризацию закона Гаусса, хотя обычная функция (вместо 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)
 Vroomfondel01 нояб. 2017 г., 13:44
Совершенно неясно, о чем вы спрашиваете. Пожалуйста, уточните свой вопрос, чтобы не было необходимости проводить расследование, чтобы выяснить, что вы хотите знать.
 Vroomfondel01 нояб. 2017 г., 19:07
Извините, ТАК представил мне это на рассмотрение, и у меня сложилось впечатление, что это был вопрос. Я не'Не понимаю, что я рассматривал ответ * покрасневшее лицо * - еще раз извините, в следующий раз посмотрю дважды.
 Thabris01 нояб. 2017 г., 15:51
ничего не спрашивая, просто предлагая другой способ сделать это
Решение Вопроса

Википедия,

Итак, похоже, что

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 (Вот а такжеВот), кажется

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

доходность

 Sebastian Schrön03 нояб. 2012 г., 00:45
Спасибо за поддержку до сих пор, теперь кажется, что моя последняя проблема - это распределение W, скачки внутри случайной переменной - путь к максимуму, чтобы определить движение цены акций, различные попытки изменить распределение не сделали 'хотя на самом деле это удается
 unutbu02 нояб. 2012 г., 23:05
Долженt диапазон от 0 доSteps? Или долженt диапазон от 0 до?T
 Sebastian Schrön02 нояб. 2012 г., 23:54
Хм, да, спасибо, я думаю, чтоs неправильно и должно быть t = linspace (0, T, Steps)
 unutbu13 нояб. 2013 г., 21:51
Можете ли вы предоставить доказательства того, что это неправильно? Ваше заявление противоречит Википедии и реализации Matlab, о которой говорится в моем посте.
 Sebastian Schrön02 нояб. 2012 г., 22:43
Кроме того, такие параметры, как сигма неt показать желаемые изменения на графике: /
 Sebastian Schrön03 нояб. 2012 г., 11:00
Тот'сидеть! Большое спасибо!! Изменения с шага W (t) на W (0) могут отображаться как сумма всех случайных величин за временной интервал, поэтомус математической точки зрения, ты спас мои выходные, яЯ очень благодарен! :-)
 unutbu02 нояб. 2012 г., 22:21
Хех, спасибо @RocketDonkey.
 horchler30 июл. 2013 г., 17:38
Один ниггер. Похоже, вы добавили шум к своему начальному состоянию, так чтоS(0) не являетсяS0, Важным свойством винеровского процесса является то, что.W(0) = 0
 RocketDonkey02 нояб. 2012 г., 22:20
Человек, вы исследуете намного быстрее, чем я :) +1
 Vadikus13 нояб. 2013 г., 21:41
В конечном коде: X = (mu-0.5 * сигма2) * т + сигмаW не так. Следует умножить на dt, а не на t. Итак, правильная строка X = (mu-0.5 * сигма2) * dt + sigmaW
 Sebastian Schrön02 нояб. 2012 г., 22:31
О, ну, согласно литературе, это была моя формула, но так выглядит намного лучше, большое спасибо! Есть ли способ увеличить шаги, чтобы это выглядело как непрерывное движение? Если я просто увеличу шаг, функция exp создаст огромные значения для цены акций.

Ваш ответ на вопрос