【问题标题】:Python Code: Geometric Brownian Motion - what's wrong?Python 代码:几何布朗运动 - 怎么了?
【发布时间】:2012-10-23 13:24:43
【问题描述】:

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

【问题讨论】:

标签: python finance random-walk stochastic


【解决方案1】:

根据Wikipedia

看来

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 示例(herehere),它出现了

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

产量

【讨论】:

  • 伙计,你的研究速度比我快 :) +1
  • 哦,好吧,根据文献,这是我的公式,但这样看起来好多了,非常感谢!有没有办法增加步数,让它看起来更像一个连续的运动?如果我只是增加步骤,exp-funktion 将为股票价格创造巨大的价值
  • 感谢到目前为止的支持,现在看来我的最后一个问题是 W 的分布,随机变量内的跳跃对于股票价格变动的采样率很高,不同的尝试改变虽然分发并没有真正成功
  • 就是这样!非常感谢!!从步骤 W(t) 到 W(0) 的变化可以通过时间范围内所有随机变量的总和来显示,所以它在数学上也是正确的,你拯救了我的周末,我真的很感激! :-)
  • 你能证明它是错的吗?您的声明与我的帖子中链接的 Wikipedia 和 Matlab 实现相矛盾。
【解决方案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)

【讨论】:

  • 完全不清楚你在问什么。请改进您的问题,以便无需进行调查即可找出您想知道的内容。
  • 什么都不问,只是提出另一种做法
  • 抱歉,所以向我展示了这个以供审查,我的印象是这是一个问题。我不明白我正在审查一个答案 * 脸红了 * - 再次抱歉,下次会看两次。
猜你喜欢
  • 2011-08-12
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
相关资源
最近更新 更多