首页 > 编程语言 >【视频讲解】Python用LSTM长短期记忆网络GARCH对SPX指数金融时间序列波动率滚动预测

【视频讲解】Python用LSTM长短期记忆网络GARCH对SPX指数金融时间序列波动率滚动预测

时间:2024-08-15 23:48:51浏览次数:10  
标签:SPX plt Python 模型 df GARCH LSTM 数据

全文链接:https://tecdat.cn/?p=37371 

原文出处:拓端数据部落公众号

本文融合了多种技术,其中 LSTM(长短期记忆网络)和 GARCH(广义自回归条件异方差)模型尤为关键。LSTM 在处理时间序列数据方面独具优势,能够捕捉长期依赖关系,为金融预测提供强大支持。GARCH 模型则能有效捕捉金融时间序列中的波动聚类现象,提升预测准确性。

通过对这套代码的详细解读和分析,包括对 LSTM 和 GARCH 等关键模型的深入探讨,我们期望为金融研究和实践注入新活力,开辟新思路。

引言

在当今复杂多变的金融市场环境中,深入的数据分析和精准的模型构建对于理解市场动态、预测价格走势以及制定有效的投资策略至关重要。

创新点

  1. 融合多种先进模型:综合运用了 GARCH 模型和 LSTM 模型,结合了传统金融模型和深度学习方法的优势,为金融数据的分析和预测提供了更全面和精确的手段。

  2. 精细化的特征工程:通过计算对数收益和过去 10 天的波动率等特征,深入挖掘金融数据中的潜在信息,提高了模型的输入质量和预测性能。

  3. 灵活的数据处理:包括数据的转置、索引重置和缺失值处理等操作,能够适应不同结构和质量的金融数据,增强了其通用性和实用性。

代码内容与分析

导入所需的库

 
  1.   import pandas as pd
  2.   from pandas.plotting import autocorrelation_plot
  3.   from pandas_datareader import data
  4.   import numpy as np
  5.   import matplotlib.pyplot as plt
  6.   import seaborn as sns
  7.   import math
 

丰富且强大的库导入为后续的数据处理和分析奠定了坚实的基础。Pandas 库用于数据读取和操作,Matplotlib 和 Seaborn 则用于数据可视化,Numpy 提供高效的数值计算支持,Math 库用于数学运算。

读取包含金融数据的 CSV 文件

 
  1.   df = pd.read_csv(r'inpv')
  2.   print(df.head())
  3.   print(df.shape)
 

此部分代码实现了从 CSV 文件中读取金融数据,并通过打印数据头部和形状,初步了解数据的结构和规模。

在此我们可以看到,我们有 254 列,对应着我们拥有金融数据的 254 个工作日,还有 10 列,它们是我们所拥有的 10 个金融指标。

数据清洗

转置数据框
由于我们处理的是时间序列数据,应当将日期作为一列,因此我们为此使用转置(transpose)函数。

 
  1.   df = df.transpose()
  2.    
  3.   print(df.head())
  4.   print(df.shape)
 

 

转置操作有助于以更合适的方式组织数据,便于后续的分析。

重置数据框的索引

 
  1.   df = df.reset_index()
  2.    
  3.   print(df.head())
 

 

重置索引确保数据的索引具有一致性和准确性。

 
  1.   import pandas as pd
  2.   import matplotlib.pyplot as plt
  3.    
  4.   # 加载数据
  5.   file_path = '/mnt/data/finaaned.csv'
  6.   df = pd.read_csv(file_path)
  7.    
  8.   # 显示数据的前几行以了解其结构
  9.   df.head()
 

数据已成功加载。接下来,我将进行以下分析和可视化:

  1. 股票的开盘价、收盘价、最高价和最低价的趋势图。
  2. 交易量的变化趋势图。
  3. 技术指标(RSI14、SMA14、EMA14、MACD_sl、MACD_h)的趋势图。

开始绘制图表。

 
  1.    
  2.    
  3.    
  4.   # 重新绘制图表
  5.   # 绘制股票的开盘价、收盘价、最高价和最低价的趋势图
  6.   plt.figure(figsize=(14, 8))
  7.   plt.plot(df['Open'], color=colors[1], label='开盘价')
  8.   plt.plot(df['Close'], color=colors[2], label='收盘价')
  9.   plt.plot(df['High'], color=colors[3], label='最高价')
  10.   plt.plot(df['Low'], color=colors[4], label='最低价')
  11.   plt.title('股票价格趋势')
  12.   plt.xlabel('日期')
  13.   plt.ylabel('价格')
  14.   plt.legend()
  15.   plt.grid(True)
  16.   plt.show()
  17.    
  18.   # 绘制交易量的变化趋势图
  19.   plt.figure(figsize=(14, 8))
  20.   plt.bar(df.index, df['Volume'], color=colors[5])
  21.   plt.title('交易量变化')
  22.   plt.xlabel('日期')
  23.   plt.ylabel('交易量')
  24.   plt.grid(True)
  25.   plt.show()
  26.    
  27.   # 绘制技术指标的趋势图
  28.   indicators = ['RSI14', 'SMA14', 'EMA14', 'MACD_sl', 'MACD_h']
  29.   plt.figure(figsize=(14, 8))
  30.   for i, indicator in enumerate(indicators):
  31.   plt.plot(df[indicator], color=colors[i + 6], label=indicator)
  32.   plt.title('技术指标趋势')
  33.   plt.xlabel('日期')
  34.   plt.ylabel('指标值')
  35.   plt.legend()
  36.   plt.grid(True)
  37.   plt.show()
 

 

  1. 第一个图表显示了股票的开盘价、收盘价、最高价和最低价的趋势。
  2. 第二个图表展示了交易量的变化趋势。
  3. 第三个图表展示了技术指标(RSI14、SMA14、EMA14、MACD_sl、MACD_h)的趋势。

特征工程

对数特征 - 对数收益

 
  1.   df['Log_Returns'] = np.log(df.Close) - np.log(df.Close.shift(1))
  2.    
  3.   print(df.head())
 

通过计算对数收益,能够更好地捕捉金融数据的变化特征。

波动率 - 过去 10 天的波动率

 
  1.   df['Previous_10_Day_Volatility'] = df['Log_Returns'].rolling(window = 10).std()
  2.    
  3.   print(df.tail())
 

 

波动率的计算对于评估金融资产的风险具有重要意义。

GARCH

针对整个 SPX 数据集的 GARCH 预测

构建用于将数据框拆分为测试和训练数据的新数据框

X = df[df.first_valid_index():df.last_valid_index()- datetime.timedelta(1500)]

使用 GARCH 模型进行滚动预测

GARCH_rolling_predictions = GARCH_model.predict_is(h = len(X) - 50, fit_once = True)

GARCH 模型能够捕捉金融时间序列数据中的波动聚类现象,提高预测的准确性。

构建用于将数据框拆分为测试和训练数据的新数据框

在多个列上使用 dropna

 
  1.   def list_columns_to_dropna(df, column_list):
  2.    
  3.   for column in column_list:
  4.    
  5.   df = df[df[column].notna()]
 

处理缺失值保证数据的完整性和可靠性。

LSTM

构建 LSTM 模型

在代码中,通过inputLSTM = Input(shTM)语句构建了 LSTM 模型的输入层。这是模型架构的起始步骤,为后续的数据传递和处理奠定了基础。 

inputLSTM = Input(shTM)

 


绘制 LSTM 网络

plot_model(lstm, to_fue, show_layer_names=True)这行代码用于绘制 LSTM 网络的结构。通过可视化模型的层次和连接,有助于更直观地理解模型的内部架构,从而方便对模型进行调试、优化和解释。 

plot_model(lstm, to_fue, show_layer_names=True)

 

拟合 LSTM 模型

hist = lstm.fit(X_train, y_train,batch_s)此语句执行了 LSTM 模型的拟合过程。在这个过程中,模型学习输入数据X_train和对应的目标数据y_train之间的关系,并通过调整模型的参数来最小化预测误差,以达到良好的拟合效果。 

hist = lstm.fit(X_train, y_train,batch_s

 

打印出模型做出的预测

通过for ind, i in enumerate(lstm.predict(X_test)):这一循环结构,对测试集X_test进行预测,并依次获取每个预测结果。这种逐样本的预测方式有助于详细评估模型在新数据上的表现。

printingt, y_tes)这部分代码可能用于打印相关的预测结果和真实值,以便进行对比和分析,从而深入了解模型的性能和准确性。

for ind, i in enumerate(lstm.predict(X_test)):
    

 

printingt, y_tes)

LSTM 模型在处理时间序列数据方面具有独特的优势,能够捕捉长期依赖关系。

参考文献
[1] Stanford Paper on LSTM Neural Networks for stock prices volatility prediction. http://cs230.stanford.edu/projects_fall_2019/reports/26254244.pdf

标签:SPX,plt,Python,模型,df,GARCH,LSTM,数据
From: https://www.cnblogs.com/tecdat/p/18362068

相关文章

  • Python 查看当前环境所有变量的大小
    https://blog.csdn.net/lly1122334/article/details/104757467defshow_memory(unit='KB',threshold=1):'''查看变量占用内存情况:paramunit:显示的单位,可为`B`,`KB`,`MB`,`GB`:paramthreshold:仅显示内存数值大于等于threshold的变量''�......
  • python-flask计算机毕业设计助学贷款信息管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及与深化,越来越多的学生选择通过助学贷款来完成学业,以减轻家庭经济负担。然而,传统的助学贷款管理方式往往存在信息更新滞......
  • python-flask计算机毕业设计养老服务系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全球人口老龄化的加速发展,养老服务已成为社会关注的焦点。传统家庭养老模式正面临巨大挑战,如家庭结构小型化、子女工作繁忙导致照顾能......
  • python-flask计算机毕业设计校园二手交易平台系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及和校园生活的日益丰富,学生群体对于物品交换与再利用的需求日益增长。传统的校园二手交易往往依赖于线下张贴广告、口口......
  • 编程基础题:开关灯(C语言方式代码,C++方式代码,Python3方式编写)三种语言编写代码
    1.题目描述:假设有N蓋灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以......
  • Python编程 - 基础知识
    前言一、常量与变量二、数据类型 三、标识符与关键字四、输出五、输入六、运算符总结前言本文正式开始介绍Python相关知识,主要有常量和变量、数据类型等,接下来咱们往下看一、常量与变量常量通俗的说就是固定不变的值,而变量就是可以变化的值,是一个用于存储......
  • Python编程 - 判断语句与循环语句
    目录前言一、运算符二、判断语句三、循环语句总结前言第一篇主要讲的是较为基础的知识,如变量,关键字和输入输出等,接下来主要讲判断语句,将判断语句之前需要先扩展上篇文章中的运算符,运算符搭配判断语句使用,让我们拭目以待!!一、运算符这里拓展的运算符有比较运......
  • Python - Protocols
    IntroducedinPython3.8viathetypingmodule,Protocolsofferamoreflexibleapproachthan ABCs,knownasstructuralducktyping,whereanobjectisconsideredvalidifithascertainattributes ormethods,regardlessofitsactualinheritance.Unlike......
  • python-flask计算机毕业设计中国服饰文献资料管理平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着中国传统文化的复兴与全球文化交流的日益频繁,中国服饰作为承载深厚历史文化底蕴的重要载体,其研究价值与日俱增。然而,当前中国服饰文献......
  • Python 通过UDP传输超过64k的信息
    在UDP中,单个数据包的最大尺寸通常受到网络层的限制,这通常被称为最大传输单元(MTU)。在以太网环境中,标准的MTU大小通常为1500字节。尽管有些网络环境可能支持更大的数据包,但是UDP数据包的理论最大限制是65535字节(64KB),这是由于UDP头部的16位长度字段决定的。然而,如果你需要发送超过这......