PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据

简介: PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据

原文链接:http://tecdat.cn/?p=27099 


介绍


金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机(与确定性相反)变量。

该项目分两部分完成:

  1. 第一部分涉及为几何布朗运动编写代码,并检查和验证它是否工作。这是使用 Python 中的几个函数完成的,并使用迭代设置将后续股票价格建模为马尔可夫链,给定初始起始价格 S0。验证过程包括运行多个模拟或随机游走样本,然后检查结果分布,以查看股票价格、收益和波动性是否满足某些属性和假设。
  2. 第二阶段涉及探索,将模型实际应用于实际股票价格,并使用耐克股票的真实股票数据进行回测。模拟是通过获取收益率 μ 和波动率 σ 的样本值并观察股票价格演变的模拟数据和真实数据之间的相关程度来完成的。

模拟需要大约 10-15 分钟才能完全运行。请注意,对模拟结果的所有解释都是通过解释价格水平和收益率的结果分布的均值和方差等参数来完成的。


假设


此项目中使用了以下变量和符号列表:

  1. S0 - 初始股票价格
  2. St - 时间的股票价格,t
  3. μ - 在特定时间段内平均的股票收益(漂移)率
  4. σ - 在特定时间段内平均的股票波动率(标准差)
  5. dt - 模拟的时间步长,对应于一天内股票价格采样的频率
  6. N - 模拟的总天数。
  7. r - 无风险利率,任何人都可以借/贷

还对股票市场/价格做出了以下假设。虽然这些假设确实有助于大大简化模型,但它们非常现实,有助于在理想情况下制定模型。

  1. 股票价格遵循马尔科夫过程,即是无记忆的,随后的股票价格仅取决于当前价值,而不取决于任何先前的价值。
  2. 与 N 相比,考虑的时间步长 dt 较短,即 Ndt>>1
  3. 市场完整高效,不存在套利机会。
  4. 没有股息、交易成本或税收考虑。


维纳过程和几何布朗运动


维纳过程(也称为布朗运动)是一个具有连续变量和连续时间的马尔可夫过程。对于随机变量 z,它有两个重要的性质:

  1. 所有的 Δz 都是统计独立的。
  2. dz = εdt

其中 ϵ 来自正态分布

通过将漂移项 a(x,t)dt 添加到随机过程 dz 上,可以将维纳过程进一步推广到 Ito 过程。

对于股票价格,上述方程是 Ito 过程,也称为几何布朗运动,描述了随时间的随机变化。请注意,μ 和 σ 分别是瞬时漂移和标准偏差率。S 遵循一个受乘性噪声影响的随机过程。这里还需要注意的是,几何布朗运动模型避免了负股票价格的问题。


为股票价格的解决方案建模


上述随机微分方程 (SDE) 具有以下形式的解析解:

请注意,在上述等式中,常数 μ 和 σ 分别对应于股票价格的百分比漂移(收益)和百分比波动(标准差)率。Wt 指的是由 dz=ϵdt 给出的维纳过程,如上所述。该解方程用于以下列方式迭代计算每个时间步的 St:

这里,t 是计算的时间步长,每个 St 仅取决于之前的起始价格 St−1,这是布朗运动模型所要求的,因为它是一个马尔可夫过程。请注意,通过选择一个小的时间步长,我们可以接近连续时间的极限。

因此,给定某个时间步长,随后的每个股票价格 St 完全由三个参数描述:

  1. 初始“开始”价格,St−1
  2. 百分比收益(漂移)率,μ
  3. 波动率或标准偏差率,σ

下面的代码实现了上面描述的迭代过程。时间步长由 dt 给出,对应于对股票价格进行采样的频率,N 是模拟运行的总天数。

#几何布朗运动模型#使用mu=收益率#sigma=波动率#dt=时间步长#Si=每个时间段的初始(开始)价格值#价格和收益的时间演变#使用布朗运动模型来生成N天(时间段)的价格列表def gices(mu, sigma, dt, Si, N):
    pirr = np.zeros(N) #初始化一个长度为N的向量来存储价格值    pr_r\[0\] = Si #存储第一个价格值  
    retrr = np.zeros(N) #初始化向量来存储返回值    
    #还可以计算连续N之间的价格回报率    for i in range (1,N):
        #注意price\[i-1\]是每次迭代的Si        pr\_arr\[i\] = geoeti\_bown(mu, sigma, dt, price_arr\[i-1\])

运行单个模拟/步行


这部分代码只是调用上面编写的函数并绘制结果。给出了收益率和波动率、起始价格和时间步长的样本值。以下数字按出现顺序显示:

  1. 股票价格的演变,St 作为 N 的函数
  2. 股票价格水平的分布,绘制为直方图。
  3. 收益和对数收益的分布,也绘制为直方图。

在随后的部分中进行了多次模拟,以实际验证模型的正确性。

#运行单个模拟以检查功能#使用 mu、sigma 和 Si 的样本值进行测试#调用函数Slst, RitRlolist = gpes(mu, sigma, dt, Si, N)#绘制结果plt.figure(figsize=(15,5))


#用于获取mu\_multiple和sigma\_multiple#将价格数组作为输入并返回 mu 和 sigmadef v\_tun(price\_array):
    mu_single = 0    sgm_sigle = 0    
    #计算模拟的平均收益率,mu和平均波动率,sigma    musigle = np.mean(mu_temp)
    sigmsile = np.std(mu_temp)
    #Monte Carlo 模拟几何布朗运动演化#运行几个模拟来生成几个可能的价格演变数组#用它来计算平均波动率和回报率def gmlie(mu, sigma, dt, Si, N, sim_count):
    cacies = np.zeros(shape=(N,sim_count)) #创建一个数组来存储模拟值    #对于 alc_res 数组,我们只关心值    #创建数组来存储每个的mu和sigma的值    m\_mutple = np.zeros(sim\_count)
    sigmmiple = np.zeros(sim_count)
    
    vl = np.linspace(0,N-1,N)
    #运行模拟并绘制每个价格演变的结果    plt.figure(figsize=(20,20))


点击标题查阅往期内容


R语言几何布朗运动GBM模拟股票价格优化建立期权定价用概率加权收益曲线可视化


01

02

03

04

检查和测试多个模拟的代码


上面的代码包含一个函数,可以为几何布朗运动描述的随机游走运行多个模拟。还编写了另一个计算给定输入数组的平均收益和波动率水平的函数。这两个函数都用于生成几个模拟/随机游走,如上图所示。

上图显示了在相同起始价格、S0=100 和收益率和波动率、μ=0.2 和 σ=0.07 下运行的 500 次模拟图。使用的时间步长为 dt=0.01,表示每天对股票价格进行频繁抽样。每条线代表使用前面描述的几何布朗运动模型建模的样本随机游走。然后通过绘制股票价格、收益和标准差的分布来分析使用这些模拟生成的数据。然后分析这些价格水平、收益和波动率的分布,以检查其正确性和一致性。

从下面的第一张图中可以看出,价格水平遵循近似对数正态分布。这实际上是一个预期的结果。解,St 是一个对数正态分布的随机变量,其期望值和方差由下式给出:

从下面的第一幅图中可以看出,对于 sim_count = 500 次模拟,价格水平确实近似于对数正态分布,平均值约为 200。使用 tats.lmfit 函数测量的均值和方差也与以上定义的值在合理的误差范围内。对于使用上面给出的参数的模拟运行,它们被计算为:

下面的第二张图显示了上面运行的模拟的收益率分布。可以很容易地观察到,收益呈正态分布,平均值约为 0.15,这是模拟中 μ 的输入值。这种收益率的正态分布也是布朗运动模型的预期结果。下面的第三张图显示了标准偏差率的分布,也可以观察到其呈正态分布,平均值约为 0.07,这是模拟的 σ 输入值。

因此,上述讨论验证了几何布朗运动编码模型确实按预期工作,并生成与模型的属性和假设相对应的结果。自相似性也被证明适用于模型,其中不同的时间步长 dt 与调整后的 μ 和 σ 一起使用,以产生相似的价格水平和收益分布。这是模型的另一个预期结果,因为布朗运动在不同尺度上表现出分形行为。

#绘制价格水平和收益的分布以检查代码的有效性#价格水平应根据几何布朗运动模型呈对数正态分布#Retu ate 和 Vlatiiy 应该是正态分布的#Plot 价格水平plt.figure(figsize=(15,5))#与下面给出的均值和标准差的对数正态分布进行比较logorman = Si\*np.exp(mu\*N*dt)logmvar = (Si\*\*2)\*np.exp(2\*mu\*N\*dt)\*(np.exp((sigma\*\*2)\*N*dt)-1)plt.plot(bns,lonm_dst,"g",lw=5) #绘制预期的对数正态密度分布#绘制收益和波动率分布plt.figure(figsize=(15,5))

print(lono_ean)print(np.sqrt(loomvr))

探索:使用真实股票数据测试模型


一旦模型被检查为正常工作,它就会用真实的库存数据进行测试。耐克 (NKE) 2013-2015 年的股价被用来回测该模型。并且使用上述几何布朗运动模型运行 Monte Carlo 模拟。

以下值用于在两年期间使用 NKE 的真实数据测试代码。假设一年大约有 250 个工作日,N = 500 表示大约两年的时间框架。通过将数据导入单独的 .csv 文件并对股票价格的收益率和标准差进行所需的计算来计算收益率和波动率。


  1. 截至 2013 年 1 月 2 日,起始价格 S0 为 52.4。两年期末的预期价格 St 预计在 98.6 左右。
  2. 两年年化收益率为 μ=0.13,这是使用雅虎财经历史记录生成的价格列表计算得出的。
  3. 两年年化波动率也从价格中获得,σ=0.05。

以下代码调用函数以通过几何布朗运动模型生成随机游走。

#使用这些价格计算回报率和波动率。pprint(k.geical('2013-01-01', '2015-01-01'))

#使用输入参数的样本值运行多个模拟dt = 0.01sim_count = 500#调用函数并运行模拟prie, mu_arr, sigrr = geiple(mu, sgma, dt, Si, N, icont)
在 \[29\] 中:lorm_ean = Si\*np.exp(mu\*N*dt)

解释模拟结果


从上图中生成的随机游走可以看出,我们在这里使用的模型乍一看似乎产生了正确方向和近似幅度的价格演变。由于它是一个随机游走模型,重要的是要注意,结果只能解释为价格水平或整体收益分布,而不是单个模拟。下面的代码和数字为价格水平和收益率和波动率生成所需的分布图。

首先需要注意的是,使用等式 E[St]=S0e(μNt) 的对数正态分布价格水平的计算平均值为 100.374。这位于真实值 98.6 的 5% 误差范围内,是使用 500 次模拟生成的。

其次,可以看出几何布朗运动的所有性质都得到满足——价格水平服从对数正态分布,收益率和波动率正态分布,均值对应于输入参数值。

请注意,模拟还针对其他时间范围和不同的股票价格运行,平均而言,该模型显示的值在圣路易斯真实价值的 10% 以内。

#绘制价格水平的分布并返回以检查真实数据的代码#价格水平应根据几何布朗运动模型呈对数正态分布#Return Rate 和 Volatility 应该是正态分布的#Plot 价格水平plt.hist(prestiple,bins=100,normed=1,label="R")#与下面给出的均值和标准差的对数正态分布进行比较lognorm_mean = Si\*np.exp(mu\*N*dt)lognorm_var = (Si\*\*2)\*np.exp(2\*mu\*N\*dt)\*(np.exp((sigma\*\*2)\*N*dt)-1)#绘制预期的对数正态密度分布#绘制收益和波动率分布plt.hist(mu_arr,bins=100,normed=1,label="R")

评论和结论


从生成的模拟结果可以看出,几何布朗运动模型可以很好地使用上面讨论的随机过程来模拟股票价格。该模型首先被检查以满足几何布朗运动的特性,然后用真实的股票价格数据进行回测。NKE 2013-2015 年的股票价格用于计算 μ 和 σ 的值,然后用于运行该期间的模拟。股票价格的模拟结果和真实价值在 5% 的误差范围内相似。


相关文章
|
3天前
|
机器学习/深度学习 供应链 安全
使用Python实现智能食品供应链管理的深度学习模型
使用Python实现智能食品供应链管理的深度学习模型
17 3
|
1天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
1天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品安全监测的深度学习模型
使用Python实现智能食品安全监测的深度学习模型
12 0
|
14天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
8天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
1天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
10 5
|
1天前
|
人工智能 数据挖掘 开发者
探索Python编程:从基础到进阶
【10月更文挑战第32天】本文旨在通过浅显易懂的语言,带领读者从零开始学习Python编程。我们将一起探索Python的基础语法,了解如何编写简单的程序,并逐步深入到更复杂的编程概念。文章将通过实际的代码示例,帮助读者加深理解,并在结尾处提供练习题以巩固所学知识。无论你是编程新手还是希望提升编程技能的开发者,这篇文章都将为你的学习之旅提供宝贵的指导和启发。
|
14天前
|
弹性计算 安全 小程序
编程之美:Python让你领略浪漫星空下的流星雨奇观
这段代码使用 Python 的 `turtle` 库实现了一个流星雨动画。程序通过创建 `Meteor` 类来生成具有随机属性的流星,包括大小、颜色、位置和速度。在无限循环中,流星不断移动并重新绘制,营造出流星雨的效果。环境需求为 Python 3.11.4 和 PyCharm 2023.2.5。
|
6天前
|
数据处理 Python
从零到英雄:Python编程的奇幻旅程###
想象你正站在数字世界的门槛上,手中握着一把名为“Python”的魔法钥匙。别小看这把钥匙,它能开启无限可能的大门,引领你穿梭于现实与虚拟之间,创造属于自己的奇迹。本文将带你踏上一场从零基础到编程英雄的奇妙之旅,通过生动有趣的比喻和实际案例,让你领略Python编程的魅力,激发内心深处对技术的渴望与热爱。 ###