Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模拟进行股价预测|附代码数据

Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模拟进行股价预测|附代码数据

原创
作者头像
拓端
发布于 2023-03-31 14:09:08
发布于 2023-03-31 14:09:08
1.4K00
代码可运行
举报
文章被收录于专栏:拓端tecdat拓端tecdat
运行总次数:0
代码可运行

全文下载链接:http://tecdat.cn/?p=20678

最近我们被客户要求撰写关于GARCH的研究报告,包括一些图形和统计输出。

在本文中,预测股价已经受到了投资者,政府,企业和学者广泛的关注。然而,数据的非线性和非平稳性使得开发预测模型成为一项复杂而具有挑战性的任务

在本文中,我将解释如何将 GARCH,EGARCH和 GJR-GARCH 模型与Monte-Carlo 模拟结合使用, 以建立有效的预测模型。金融时间序列的峰度,波动率和杠杆效应特征证明了GARCH的合理性。时间序列的非线性特征用于检查布朗运动并研究时间演化模式。非线性预测和信号分析方法因其在特征提取和分类中的鲁棒性而在股票市场上越来越受欢迎。

动力学系统可以用一组时变(连续或离散)变量来描述,这些变量构成信号分析非线性方法的基础。如果时间的当前值和状态变量可以准确地描述下一时刻的系统状态,则可以说这样的系统是确定性的。另一方面,如果时间和状态变量的当前值仅描述状态变量的值随时间变化的概率,则将动力学系统视为随机系统。

因此,在使用GARCH 建模方法之前 ,我将采用 分形维数(FD) ,重定 范围 和 递归量化分析(RQA)的 数据建模 技术 来总结数据的非线性动力学行为并完成研究目标。

方法

Hurst**系数 (H)  是长期依赖的特征参数,与 FD (FD + H = 2)有关。 R / S分析是数据建模的核心工具。经验研究表明, 与同类中的其他方法相比,  R / S_带来了更好的结果,例如自相关,光谱分解的分析。它是度量时间序列差异的度量,该时间序列的定义是给定持续时间_(T)_的均值范围  ,除以该持续时间的标准偏差 [ R / S = k * T(H) ]; _ķ 是一个取决于时间序列的常数。H度量时间序列的长期记忆,将其表征为均值回复,趋势或随机游走。

H <0.5表示均值回复 H> 0.5表示趋势序列,并且 H = 0.5表示随机游走。

我将展示如何使用 GARCH 模型进行风险评估。

GARCH 模型的一个关键限制 是对其参数施加非负约束,以确保条件方差的正性。这样的约束会给估计GARCH 模型带来困难 。

因此,提出了 非对称GARCH 模型,即俗称的 GJR-GARCH 模型,以解决对称GARCH 模型的局限性 。更重要的是,指数 GARCH 或 EGARCH 模型相对于传统的GARCH 模型具有潜在的改进 。

数据挖掘

查看数据。

在过去的几十年中,原油价格呈现出较大的波动,尤其是在2008年左右。可以看出,随着多次上升和下降,价格保持在相对较低的水平。从自相关图可以看出原始数据中明显的自相关。QQ和PP图的形状表明该过程接近正态,但是_重尾分布_。

简单收益率的常用形式为:r(t)= {p(t)— p(t-1)} / p(t-1),对数收益率= ln(pt / p(t-1),pt每日原油价格,r(t)是每日收益。

对数收益率在这里被视为本文的每日收益率。原始价格和对数收益率的直观显示清楚地证明了以几乎恒定的均值,使用对数收益率是合理的。

收益率序列图显示了高和低变化周期。在图中可以看到一个随机且集中在零附近的过程。大幅度波动的正收益和负收益都增加了风险投资和管理的难度。每日收益率的平均值基本上在零水平水平附近,并且具有明显的波动性聚类,表明存在异方差性。ACF很小,但是高度相关。QQ和PP图的形状没有明显变化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sns.distplot(df.returns, color=’blue’) #密度图

# 汇总统计数据
print(df.returns.describe())

收益率的偏度(-0.119)和向右偏离表明,收益率正比负收益率高,峰度(7.042)反映了油价波动大。


R语言ARMA-GARCH-COPULA模型和金融时间序列案例

01

02

03

04

标准正态分布的偏度和峰度分别为0和3。

Jarque-Bera检验的值表明,传统的正态分布假设不适用于原油收益的真实分布。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ADF = ADF(df.returns)
print(ADF.summary().as_text())

kpss = KPSS(df.returns)
print(kpss.summary().as_text())

进行了VR检验,以测试对数收益率序列是否是纯粹的随机游走,以及是否具有一定的可预测性。我在这里比较了1个月和12个月的对数收益率,并且拒绝了该系列为纯随机游走的空值。用负检验统计量VA(-11.07)拒绝零表示在时间序列中存在序列相关性。用ADF,KPSS,DFGLS,PP和ZA统计量对单位根和平稳性进行的检验均显示出显着性,表明使用 GARCH型模型来拟合收益序列是合适的。

非线性动力学

使用_Hurst_对平稳性的研究 。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 计算最近价格的Hurst系数

tau = [sqrt(std(subtract(closes_recent[lag:], closes_recent[:-lag]))) for lag in lags]
m = polyfit(log(lags), log(tau), 1)
hurst = m[0]*2

H(0.531)表示具有长期依赖性的随机运动时间序列。证明了 本研究中GARCH模型的合理性 。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
computation = RQAComputation.create(settings,
verbose=True)
result = computation.run()
result.min_diagonal_line_length = 2

此处,低 R 表示较低的周期性和随机行为。此外,较低的 DET 值表示不确定性。这证明了使用GARCH 方法的合理性 。

GARCH模型

在估算GARCH类型的模型之前,将收益率乘以100。由于波动率截距与模型中其他参数非常接近,因此这有助于优化程序进行转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = 100* df.returns

让我们拟合一个 ARCH 模型并绘制平方残差以检查自相关性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getbest(TS):
best_aic = np.inf

for i in pq_rng:
for d in d_rng:
for j in pq_rng:
try:
tmp_mdl = smt.ARIMA(TS, order=(i,d,j)).fit(




#aic: 22462.01 | order: (2, 0, 2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gam = arch_model(Model.resid, p=2, o=0, q=2, dist=’StudentsT’)
gres = gam.fit(update_freq=5, disp=’off’)
print(gres.summary())

tsplot(gres.resid**2, lags=30)

我们可以看到平方残差具有自相关的依据。让我们拟合一个GARCH模型并查看其性能。我将按照以下步骤进行操作:

  • 通过ARIMA(p,d,q)  模型的组合进行迭代  以拟合最优时间序列。
  • 根据 具有最低AIC的ARIMA模型选择 GARCH模型 。
  • 将 GARCH(p,q)  模型拟合到时间序列。
  • 检查模型残差和平方残差进行自相关

因此,我们在这里发现,最好的模型是 ARIMA(2,0,2) 。现在,我们对残差进行绘图,以确定它们是否具有条件异方差。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 arch_model(X, p=2, q=2, o=1,power=2.0, vol=’Garch’, dist=’StudentsT’)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
am = arch_model(X, p=2, q=2, o=1,power=2.0, vol=’Garch’, dist=’StudentsT’)

所有3个GARCH 模型的输出 都以表格格式显示。Ω  (ω) 是白噪声,alpha和beta是模型的参数。此外,  α[1] +β[1] <1 表示稳定的模型。 EGARCH 似乎是最好的三个这模型。

最好在训练/测试中拆分数据并获得MSE / MAE / RMSE结果以比较最佳模型拟合。

通过将残差除以条件波动率来计算标准化残差。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std_resid =  resid /  conditional_volatility
unit_var_resid =  resid /  resid.std()

标准化残差和条件波动图显示了一些误差,但幅度不大。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sns.kdeplot(squared_resid, shade=True)
sns.kdeplot(std_resid, shade=True)
sns.kdeplot(unit_var_resid, shade=True)

还标绘了标准化残差以及非标准化的残差。残差的平方在中心更加尖峰,表明分布的尾部比标准残差的尾部更重。让我们检查一下ACF图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot_acf(std_resid)

看起来有些尖峰超出了阴影的置信区。让我们查看残差平方。

残差平方显示数据点在蓝色阴影的置信度区域(95%)内,表示模型拟合较好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
res = am.fit()
fig = res.hedgehog_plot(type=’mean’)

图显示了整个2019年的预测。橙色线表示在不同时间区间的预测。

基于模拟的预测

这里使用基于仿真的方法从EGARCH 模拟中获得预测波动率的置信区间 。要从EGARCH 模型获得波动预测,该 模型是从拟合模型的最后一次观察中模拟得出的。重复此过程很多次,以获得波动率预测。预测点是通过对模拟求平均值来计算的,分别使用模拟分布的2.5%和97.5%的分位数来计算95%的置信区间。考虑平均收益率(mu)为0.0292,年波动率(vol)为(26.48)* sqrt 252 = 37.37%。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#定义变量
T = 252 #交易天数
mu = 0.0622 #收益
vol = 0.3737 #波动率

daily_returns=np.random.normal((1+mu)**(1/T),vol/sqrt(T),T)


#生成图-价格序列和每日收益的直方图
plt.plot(price_list)
plt.hist(daily_returns-1, 100)

在最上方的图上,根据遵循正态分布的随机每日收益,显示了一个交易年度(252天)内潜在价格序列演变的模拟。第二个图是一年中这些随机每日收益的直方图。但是,可以通过运行成千上万的模拟来获得洞察,每次模拟都基于相同的特征(价格交易量)产生一系列不同的潜在价格演变。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#设置一个空列表来保存我们每个模拟价格序列的最终值
result = []

S = df.Price[-1] #起始股票价格(即最后可用的实际股票价格)
T = 252 #交易天数
mu = 0.0622 #收益率
vol = 0.3737 #波动率

#选择要模拟的运行次数-我选择了10,000
for i in range(10000):
#使用随机正态分布创建每日收益表
daily_returns= np.random.normal((1+mu)**(1/T),vol/sqrt(T),T)

#设定起始价格,并创建由上述随机每日收益生成的价格序列



#将每次模拟运行的结束值添加到我们在开始时创建的空列表中
result.append(price_list[-1])

由于这些是对每日收益的随机模拟,因此此处的结果会略有不同。由于每个模拟中包含的路径,平均值趋向于“ mu”使用的平均收益。下面的直方图显示了价格分布的两个分位数,以了解高收益率或低收益率的可能性。

很显然,原油价格有5%的机会最终跌破29.72元,有5%的机会高于101.75美元。

概括

在原油价格高波动的背景下,我研究并提出了混合时变长记忆 GARCH 和基于模拟的预测模型,该模型考虑了诸如非对称性和异方差,时变风险,长记忆和重尾分布等波动事实。经验证据表明,具有布朗运动的原油数据往往在其时间动态方面显示出一定程度的可预测性。这项研究考虑了2000年至2019年的数据,当时股市经历了几次金融危机和危机后阶段。使用此时期的数据训练的模型有望具有出色的预测能力。

当处理长时间波动的原油价格的时间序列数据时,GARCH (2,2)模型估计了方差的持久性 。  进行了蒙特卡洛分析,以检查结果的稳健性。蒙特卡洛 模拟的输出 表明,即使在控制了无关因素之后,结果仍然是可靠的。因此,这些发现提供了出色的混合 EGARCH 和 蒙特卡洛 模拟的的预测模型,其中考虑了波动性特征,如波动性聚类和不对称性,时变风险和重尾分布,来衡量原油价格。


本文摘选 Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模拟进行股价预测

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Groovy 添加带注释的Map构造函数
从Groovy的早期开始,我们可以创建POGO(Plain Old Groovy Objects)类,它们将具有带有Map参数的构造函数。 Groovy在生成的类中自动添加构造函数。我们可以使用命名参数来创建POGO的实例,因为Map参数构造函数。 这只有在我们不添加自己的构造函数且属性不是最终的时才有效。从Groovy 2.5.0开始,我们可以使用@MapConstrutor AST转换注释来添加带有Map参数的构造函数。使用注释我们可以有更多选项来自定义生成的构造函数。例如,我们可以让Groovy使用Map参数生成构造函数,并添加我们自己的构造函数。 属性也可以是final,我们仍然可以使用带有Map参数的构造函数。
白石
2019/08/23
1.2K0
【Groovy】json 序列化 ( 类对象转为 json 字符串 | 使用 JsonBuilder 进行转换 | 使用 JsonOutput 进行转换 | 将 json 字符串格式化输出 )
创建 json 生成器 JsonBuilder 对象 , 构造函数中传入 Student 对象 , 即可完成 json 转换 , 将 Student 对象转为了 json 字符串 ;
韩曙亮
2023/03/30
9K0
【Groovy】json 序列化 ( 类对象转为 json 字符串 | 使用 JsonBuilder 进行转换 | 使用 JsonOutput 进行转换 | 将 json 字符串格式化输出 )
Groovy 使用EqualsAndHashCode注解生成equals和hashcode方法
Groovy 1.8中有很多新的字节码生成注释。 其中一个是@EqualsAndHashCode注释。 使用此注释,为类生成equals()和hashCode()方法。 hashCode()方法是使用Groovyorg.codehaus.groovy.util.HashCodeHelper实现的(遵循书中的算法 Effective Java )。 equals()方法查看类的所有单个属性,以查看两个对象是否相同。
白石
2019/09/09
1.9K0
Groovy 处理JSON
Groovy自带了转换JSON的功能,相关类都在groovy.json包下。本文参考自Groovy文档 Parsing and producing JSON。
乐百川
2022/05/05
2.2K0
【Groovy】json 序列化 ( JsonBuilder 生成器 | 生成带根节点名称的 json 字符串 | 生成不带根节点名称的 json 字符串 )
然后 , 如果生成一个带根节点名称的 json 字符串 ,需要使用 jsonBuilder.根节点名称 = {闭包} 格式的代码 , 生成 json 字符串 ;
韩曙亮
2023/03/30
1.8K0
【Groovy】json 序列化 ( JsonBuilder 生成器 | 生成带根节点名称的 json 字符串 | 生成不带根节点名称的 json 字符串 )
《Groovy极简教程》第12章 Groovy的JSON包《Groovy极简教程》JsonOutputJsonSlurper
Groovy自带了转换JSON的功能,相关类都在groovy.json包下。本文参考自Groovy文档 Parsing and producing JSON。
一个会写诗的程序员
2018/08/20
2.1K1
Groovy秘诀 顶
听说java世界里有个Groovy大神!java需要半天处理的事情,Groovy只需要几分钟,是的,几分钟…剩下来的时间,程序员终于有时间泡妹子了,^_^…….技术宅的兄弟,赶紧来看看吧。
白石
2019/08/23
4.7K0
从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)
这是《从 Java 和 JavaScript 来学习 Haskell 和 Groovy》系列的第四篇。
四火
2022/07/19
5480
从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)
聊聊如何自定义数据脱敏
本示例通过替换的手段实现脱敏,然后配合常用的框架特性,比如mybatis的拦截器机制或者json的序列化来快速实现脱敏
lyb-geek
2021/12/28
1.8K0
聊聊如何自定义数据脱敏
ASP.NET Core AutoWrapper 自定义响应输出
AutoWrapper是一个简单可自定义全局异常处理程序和ASP.NET Core API响应的包装。他使用ASP.NET Core middleware拦截传入的HTTP请求,并将最后的结果使用统一的格式来自动包装起来.目的主要是让我们更多的关注业务特定的代码要求,并让包装器自动处理HTTP响应。这可以在构建API时加快开发时间,同时为HTTP响应试试我们统一的标准。
HueiFeng
2020/04/01
1.6K0
根据指定键对自定义 JSON 输出
接下来,我们将用 Python 演示这些操作,结合 json 模块解析和处理 JSON 数据。
华科云商小徐
2024/10/14
1910
【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
在之前的博客中 , 在 BuilderSupport#createNode 方法中创建了 Xml 节点 , 在 BuilderSupport#setParent 方法中设置了 Xml 节点之间的父子关系 ;
韩曙亮
2023/03/30
4670
【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,更多的内容我会写成一个系列,5-10篇文章,请您继续关注我。
字母哥博客
2020/09/24
3.6K0
Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )
然后 , 调用该 JsonSlurper 对象的 parse 方法 , 可以对不同类型的 json 数据进行反序列化 ;
韩曙亮
2023/03/30
1.4K0
【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )
【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )
在 class MyBuilderSupport extends BuilderSupport 类中维护一个 Map 集合 , 该 Map 集合用于存储 上一篇博客 【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 ) 中封装的 XmlNode 节点 ;
韩曙亮
2023/03/30
7580
【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
在自定义的 Xml 生成器 MyBuilderSupport 中的 setParent 方法是设置节点之间父子关系的方法 , 在调用了 Object createNode(Object name, Map attributes, Object value) 方法返回非空值后 , 会自动回调该方法 ; ( 注意 : 一定要返回非空值 )
韩曙亮
2023/03/30
7180
给JSONObject添加自定义遍历方法
经过了Groovy动态添加方法和属性及Spock单测的铺垫,今天用fastjson为例,演示如何给JSONObject添加一个自定义的方法,来帮助提高编程效率。
FunTester
2021/11/04
2K0
logback自定义json日志输出
先说下楼主的使用场景吧,将程序的某些方法调用以json格式的内容记录到文件中,提供给大数据做数据分析用。当然这个需求实现起来很简单,通过aop拦截切面统一输出内容到文件即可。下面要介绍的就是通过logback日志体系以及logstash提供的json log依赖将数据以json格式记录到日志文件的例子。
kl博主
2023/11/18
7110
logback自定义json日志输出
自定义Data Sink
上一篇文章介绍了 Flink Data Sink,也介绍了 Flink 自带的 Sink,那么如何自定义自己的 Sink 呢?这篇文章将写一个 demo 教大家将从 Kafka Source 的数据 Sink 到 MySQL 中去。
zeekling
2022/06/17
3150
自定义Data Sink
【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
参考 Xml 生成器 MarkupBuilder , 自定义开发一个 Xml 生成器 ;
韩曙亮
2023/03/30
2.1K0
【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
推荐阅读
Groovy 添加带注释的Map构造函数
1.2K0
【Groovy】json 序列化 ( 类对象转为 json 字符串 | 使用 JsonBuilder 进行转换 | 使用 JsonOutput 进行转换 | 将 json 字符串格式化输出 )
9K0
Groovy 使用EqualsAndHashCode注解生成equals和hashcode方法
1.9K0
Groovy 处理JSON
2.2K0
【Groovy】json 序列化 ( JsonBuilder 生成器 | 生成带根节点名称的 json 字符串 | 生成不带根节点名称的 json 字符串 )
1.8K0
《Groovy极简教程》第12章 Groovy的JSON包《Groovy极简教程》JsonOutputJsonSlurper
2.1K1
Groovy秘诀 顶
4.7K0
从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)
5480
聊聊如何自定义数据脱敏
1.8K0
ASP.NET Core AutoWrapper 自定义响应输出
1.6K0
根据指定键对自定义 JSON 输出
1910
【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
4670
Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
3.6K0
【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )
1.4K0
【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )
7580
【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
7180
给JSONObject添加自定义遍历方法
2K0
logback自定义json日志输出
7110
自定义Data Sink
3150
【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
2.1K0
相关推荐
Groovy 添加带注释的Map构造函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验