首页 > 编程语言 >使用 Python 模拟布朗运动(和股票价格)

使用 Python 模拟布朗运动(和股票价格)

时间:2024-04-03 15:58:05浏览次数:35  
标签:Python random range 布朗运动 steps np import 股票价格 nsteps

一、说明

        本文先介绍布朗运动的概念,紧接着应用布朗方程到股票的随机斩落模型。进而用python实现,并给出各种各样的条件模型。从中烘托出股票模型的规律所在。

二、什么是布朗运动?

        布朗运动以罗伯特·布朗的名字命名,他是第一个在通过显微镜观察悬浮在水中的花粉粒看似随机且连续的运动时对这一现象发表评论的人之一。

        布朗运动的数学模型是由阿尔伯特·爱因斯坦 (Albert Einstein) 于 1905 年提出的(这一年是他奇迹般的一年,他还发表了相对论论文)。他将花粉颗粒的运动建模为不断受到水分子的轰击,导致随机运动。

三、随机游走

        布朗运动的基础是随机游走。一维随机游走定义如下:

  • 一维中的简单随机游走是指向前迈出一步(+d 距离)的概率为 p,向后退一步(-d 距离)的概率为 q = 1 — p
  • 使用与一维情况相同的逻辑,可以很容易地将其扩展到多个维度

        随机游走是马尔可夫过程的一个例子,其中未来的行为独立于过去的历史

import random
import numpy as np
import plotly.express as px

def simulate_1d_rw(nsteps=1000, p=0.5, stepsize=1):
    steps = [ 1*stepsize if random.random() < p else -1*stepsize for i in range(nsteps) ]
    y = np.cumsum(steps)
    x = list(range(len(y)))

    return x, list(y)

simulation_data = {}
nsims = 5
for i in range(nsims):
    x, y = simulate_1d_rw()
    simulation_data['x'] = x
    simulation_data['y{col}'.format(col=i)] = y

ycols = [ 'y{col}'.format(col=i) for i in range(nsims) ]
fig = px.line(simulation_data, x='x', y=ycols)
fig.show()

        一维随机游走的多重模拟

import random
import numpy as np
import plotly.express as px

def simulate_2d(nsteps=10000, stepsize=1):

    deltas = [ (0,-1*stepsize), (-1*stepsize,0), (0,1*stepsize), (1*stepsize,0) ]

    steps = [ list(random.choice(deltas)) for i in range(nsteps) ]
    steps = np.array(steps)
    steps = np.cumsum(steps,axis=0)
    y = list(steps[:,1])
    x = list(steps[:,0])

    return x, y

x, y = simulate_2d()
fig = px.line({ 'x' : x, 'y' : y }, x='x', y='y')
fig.show()

        10K 步的二维随机游走模拟

import random
import numpy as np
import plotly.express as px

def simulate_3d_rw(nsteps=10000, stepsize=1):

    deltas = [ (0,0,-1*stepsize), (0,-1*stepsize,0), (-1*stepsize,0,0),\
               (0,0,1*stepsize), (0,1*stepsize,0), (1*stepsize,0,0) ]

    steps = [ list(random.choice(deltas)) for i in range(nsteps) ]
    steps = np.array(steps)
    steps = np.cumsum(steps,axis=0)
    z = list(steps[:,2])
    y = list(steps[:,1])
    x = list(steps[:,0])

    return x, y, z

x, y, z = simulate_3d_rw()
fig = px.line_3d({ 'x' : x, 'y' : y, 'z' : z }, x='x', y='y', z='z')
fig.show()

        10K 步的 3-D 随机游走模拟

四、布朗运动

        维纳过程是生成布朗运动的基础随机过程。维纳过程的性质如下:

        这里 X(t) 是布朗运动所经过的路径,D(t) 是布朗运动中的“步数”。通常 σ 在标准布朗运动中是常数。

        当步长减小到零且时间变得连续时,布朗运动可以导出为随机游走的极限

import random
import numpy as np
import plotly.express as px

def simulate_1d_bm(nsteps=1000, t=0.01):
    steps = [ np.random.randn()*np.sqrt(t) for i in range(nsteps) ]
    y = np.cumsum(steps)
    x = [ t*i for i in range(nsteps) ]
    return x, y

nsims = 5
simulation_data = {}
for i in range(nsims):
    x, y = simulate_1d_bm()
    simulation_data['y{col}'.format(col=i)] = y
    simulation_data['x'] = x

ycols = [ 'y{col}'.format(col=i) for i in range(nsims) ]
fig = px.line(simulation_data, x='x', y=ycols)
fig.show()

一维布朗运动的多重模拟

import random
import numpy as np
import plotly.express as px

def simulate_2d_bm(nsteps=1000, t=0.01):
    x = np.cumsum([ np.random.randn()*np.sqrt(t) for i in range(nsteps) ])
    y = np.cumsum([ np.random.randn()*np.sqrt(t) for i in range(nsteps) ])
    return list(x), list(y)

x, y = simulate_2d_bm()
fig = px.line({ 'x' : x, 'y' : y }, x='x', y='y')
fig.show()

二维布朗运动的模拟

import random
import numpy as np
import plotly.express as px

def simulate_3d_bm(nsteps=10000, t=0.01):
    x = np.cumsum([ np.random.randn()*np.sqrt(t) for i in range(nsteps) ])
    y = np.cumsum([ np.random.randn()*np.sqrt(t) for i in range(nsteps) ])
    z = np.cumsum([ np.random.randn()*np.sqrt(t) for i in range(nsteps) ])
    return list(x), list(y), list(z)

x, y, z = simulate_3d_bm()
fig = px.line_3d({ 'x' : x, 'y' : y, 'z' : z }, x='x', y='y', z='z')
fig.show()
 
     

        10K 步的 3-D 布朗运动模拟

4.1 带有漂移的布朗运动

        这是布朗运动的变体,其中存在漂移分量以及通常的随机分量。

        与带有随机噪声的 X(t) 一起是 μ*t,它是漂移

import random
import numpy as np
import plotly.express as px

def simulate_1d_bm_with_drift(nsteps=1000, t=0.01, mu=0.5):
    steps = [ mu*0.01 + np.random.randn()*np.sqrt(t) for i in range(nsteps) ]
    y = np.cumsum(steps)
    x = [ t*i for i in range(nsteps) ]
    return x, y

nsims = 5
simulation_data = {}
for i in range(nsims):
    x, y = simulate_1d_bm_with_drift()
    simulation_data['y{col}'.format(col=i)] = y
    simulation_data['x'] = x

ycols = [ 'y{col}'.format(col=i) for i in range(nsims) ]
fig = px.line(simulation_data, x='x', y=ycols)
fig.show()

        带漂移的一维布朗运动的多重模拟

五、几何布朗运动

        此过程通常用于对金融股票价格或人口增长进行建模,或用于测量值不能为负的其他情况。在金融领域,它构成了布莱克-斯科尔斯方程的基础,其中对股票价格的对数回报进行了建模:主要兴趣在于衍生品的期权定价。

        它的定义如下:

G(t) 不是布朗运动,但 log[G(t)] 是

import random
import numpy as np
import plotly.express as px

def simulate_1d_gbm(nsteps=1000, t=1, mu=0.0001, sigma=0.02):
    steps = [ (mu - (sigma**2)/2) + np.random.randn()*sigma for i in range(nsteps) ]
    y = np.exp(np.cumsum(steps))
    x = [ t*i for i in range(nsteps) ]
    return x, y

nsims = 5
simulation_data = {}
for i in range(nsims):
    x, y = simulate_1d_gbm()
    simulation_data['y{col}'.format(col=i)] = y
    simulation_data['x'] = x

ycols = [ 'y{col}'.format(col=i) for i in range(nsims) ]
fig = px.line(simulation_data, x='x', y=ycols)
fig.show()

        几何布朗运动的多重模拟

5.1 使用几何布朗运动模拟股票价格

        从上面的定义可以看出,我们可以使用实际股票价格数据来估计μ和σ,并使用参数来模拟股票价格。在下面的示例中,我们将查看 2022-01-01 和 2022-12-31 之间(即 2022 年)的道琼斯指数。我们将估计几何布朗运动的参数,并用它来模拟股票的价格指数。

import pandas_datareader.data as web
import numpy as np
import plotly.express as px
import random

def simulate_1d_gbm(nsteps=1000, t=1, mu=0.0001, sigma=0.02, start=1):
    steps = [ (mu - (sigma**2)/2) + np.random.randn()*sigma for i in range(nsteps) ]
    y = start*np.exp(np.cumsum(steps))
    x = [ t*i for i in range(nsteps) ]
    return x, y

df = web.DataReader('^DJI', 'stooq')
mask = ( '2022-01-01' <= df.index ) & ( df.index <= '2022-12-31' )
df = df[mask]
prices = np.flip(df['Close'].values)

logprices = np.log(prices)
logreturns = logprices[1:] - logprices[:-1]
mu = np.mean(logreturns)
sigma = np.std(logreturns)
nsteps = logprices.shape[0]

x, y = simulate_1d_gbm(nsteps=nsteps, mu=mu, sigma=sigma, start=prices[0])

data = {}
data['x'] = x
data['Simulation'] = y
data['DowJonesIndex'] = prices

fig = px.line(data,x='x', y=['DowJonesIndex', 'Simulation'])
fig.show()

真实道琼斯指数与其模拟的比较。 x 轴是以天为单位的时间

标签:Python,random,range,布朗运动,steps,np,import,股票价格,nsteps
From: https://blog.csdn.net/gongdiwudu/article/details/137200774

相关文章

  • huggingface模型使用Python,智普清言,图生文,文本转语音
    完整代码fromtransformersimportpipelinefromzhipuaiimportZhipuAIclient=ZhipuAI(api_key='智普清言的API_KEY')importjsonimportrequestsdeftext2speech(message):headers={"Authorization":"Bearerhuggingface的token"}AP......
  • Python学习从0到1 day20 第二阶段 面向对象 ② 封装
    缘分朝生暮死犹如露水          ——24.4.1学习目标:1.理解封装的概念2.掌握私有成员的使用一、面向对象三大特性:面向对象编程,是许多编程语言都支持的一种编程思想简单理解是:基于模板(类)去创建实体(对象),使用对象完成功能开发面向对象包含三大主......
  • Python实现动态进度条
    ★进度条基本实现功能代码importsysimporttime#进度条-功能演示defprogress_bar_demo(title,symbol):forperinrange(1,101):print("\r",end="")print(f"【{title}】:{per}%:{symbol*(per//2)}",end=""......
  • mysql基于二次注入(基于时间)盲注,python脚本
    根据mysql二次注入原理,存储型注入利用,先注册,再登陆、再调用修改密码,完成自动时间盲注类型判断,实现脱裤借用:“孤桜懶契”大佬的脚本#--coding:UTF-8--#Author:孤桜懶契#Date:2021/8/10#blog:gylq.gitee.ioimportrequestsimporttimeflag=""#***************......
  • Python框架下的qt设计之JSON格式化转换小程序
    JSON转换小程序代码展示:主程序代码:fromPyQt6.QtWidgetsimport(QApplication,QDialog,QMessageBox)importsysimportjsonclassMyJsonFormatter(jsonui.Ui_jsonFormatter,QDialog):#jsonui是我qt界面py文件名def__init__(self):supe......
  • Python-脆弱性信息收集
    公司做系统集成,有搜集产品脆弱性需求,包括cisco,vmware,redhat,F5等厂家。如:SecurityAdvisories具体需求:1.每天定时搜集十来个网络设备厂家网站新发布的脆弱性2.根据产品和等级不同,邮件发给不同公司人员,内容包括:新脆弱性链接,脆弱性标题,CVE编号,发布时间等2.不能发送重复脆弱性......
  • python格式全部缩进?
    Python格式全部缩进是编写Python代码时需要注意的一个重要问题。从代码格式化的角度,缩进可以让代码更加易读和易于理解。从代码逻辑结构上讲,缩进可以帮助Python解释器识别代码块。违反了Python格式和规范的代码既不美观,也不易于维护。python格式全部缩进?Python程序块是通过缩进......
  • xgboost,一个超强的 Python 库!
    更多资料获取......
  • 帮忙看下这个题的Python代码咋写
    双11商品调配问题某电商企业有4个中心库、20个一级分拨中心。采购的商品分布到4个中心库,然后由中心库向一级分拨中心发货。为备战双11销售高峰。各中心库集中采购备货,备货量和各分拨中心订货量和各分拨中心到中心库的距离如下表:受天气影响,中心仓库4到分拨中心8-11无法调拨。......
  • 【华为OD】2024年华为OD机试C卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
    【华为OD】2024年C卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客 2024年华为OD机试C卷真题题集题库,有2种分数的题目列表分别是100分的列表、200分的列表需要订阅请看链接:C卷......