【Python】基于动态残差学习的堆叠式LSTM模型和传统BP在股票预测中的应用

1. 前言

本论文探讨了长短时记忆网络(LSTM)和反向传播神经网络(BP)在股票价格预测中的应用。首先,我们介绍了LSTM和BP在时间序列预测中的基本原理和应用背景。通过对比分析两者的优缺点,我们选择了LSTM作为基础模型,因其能够有效处理时间序列数据中的长期依赖关系,在基础LSTM模型的基础上,我们引入了动态残差学习(dynamic skip connection)的概念,通过动态调整残差连接,提高了模型的长期记忆能力和预测准确性。实验证明,动态残差的引入在股票价格预测任务中取得了显著的改进效果。进一步地,我们探讨了堆叠式LSTM的改进方法,通过增加模型的深度来捕捉更复杂的时间序列模式。我们详细阐述了堆叠式LSTM的结构和训练过程,并通过实验证实其在股票价格预测中的优越性。结果表明,堆叠式LSTM在处理多层次的时间序列信息上具有更强的表达能力,提高了模型的泛化性能。综合而言,本论文通过对LSTM和BP在股票价格预测中的应用进行研究,进一步引入了动态残差学习和堆叠式LSTM的改进方法,提高了模型的性能和稳健性。这些方法为金融领域的时间序列预测提供了有效的工具和思路,对于投资决策和风险管理具有重要的实际意义。

Value 在这里插入图片描述
Colab Notebook Github Rep

2. 数据集和方法选用

随着信息技术的不断发展和大数据的涌现,研究者们越来越倾向于利用高频、多维的金融数据来提升预测模型的性能。在这一趋势中,长短时记忆网络(LSTM)作为一种强大的时序建模工具,凭借其对长期依赖关系的出色捕捉能力,引起了广泛的关注。同时,动态残差学习和堆叠式LSTM等改进方法的引入进一步提高了模型的复杂性和性能。本研究在这一背景下,以中国股票市场为研究对象,旨在利用这些先进的深度学习技术,提高对系统性风险的识别和预测能力。

2.1 数据集描述

为了确保时间序列的稳定性,我们选择了这些具有相对较长历史的股票。我们的数据集来源于 investing.com、Yahoo Finance、Yahoo Finance等,通过网络爬虫爬取和网站直接下载的方式,获取了中国股票市场中时间较长的四只股票的日频数据。这些股票的历史数据涵盖多年,每日记录超过7000条。

2.2 数据获取过程

在使用网络爬虫获取金融数据时,主要步骤包括选择数据源、确定数据获取的方法、编写爬虫代码、处理数据并保存。首先我们确定了要获取数据的来源,就是上面所说的几个股票网站,随后我们确定了数据获取的方法,查看数据源是否提供API接口和直接下载的链接。如果有,就可以使用API或者直接下载方式来更加方便和规范地获取数据。如果没有API,则能需要考虑使用爬虫技术从网页中提取数据。到了编写爬虫代码的步骤, 我们选择使用爬虫,于是编写代码来模拟浏览器行为,请求网页并解析HTML内容。具体使用的Python中的requests库来用于发送HTTP请求,除此之外还使用了BeautifulSoup和lxml等库用于解析所获取到HTML。最后我们进行了处理数据并保存,提取了后面再进行特征工程时所需要的信息,然后进行简单的数据清理和处理。最后,将数据保存到本地文件或数据库中。最后我们保存了四只符合条件的股票。

表 I 四只股票的详情信息(名称用序号替换)
序号 记录开始时间 记录结束时间 记录条数
000001 1991-01-29 2020-04-14 6936
000002 1991-01-29 2020-04-18 6940
000004 1991-01-14 2020-04-14 6820
000006 1992-04-27 2020-04-18 6603
示例代码1 使用爬虫获得股票信息(伪代码)
import requests  
from bs4 import BeautifulSoup  
import pandas as pd  
import yfinance as yf  
from tiingo import TiingoClient  
  
# 函数:爬取 investing.com 的历史股价数据  
def scrape_investing(stock_code):  
    url = f'https://www.investing.com/equities/{
     stock_code}-historical-data'  
    response = requests.get(url)  
    soup = BeautifulSoup(response.text, 'html.parser')  
    data_table = soup.find('table', {
   'id': 'curr_table'})  
    data = pd.read_html(str(data_table))[0]  
    return data  
  
# 函数:爬取 Yahoo Finance 的历史股价数据  
def scrape_yahoo_finance(stock_code):  
    stock_data = yf.download(stock_code, start="1991-01-01")  
    return stock_data
        
# 函数:爬取 Tiingo 的历史股价数据  
def scrape_tiingo(stock_code, api_key):  
    config = {
     
        'session': True,  
        'api_key': api_key  
    }  
    client = TiingoClient(config)  
    stock_data = client.get_ticker_price(stock_code, fmt='json', startDate='2000-01-01')  
    data = pd.DataFrame(stock_data)  
    return data  
  
# 函数:筛选至少有6800条记录的数据  
def filter_data(data, min_records=6800):  
    if len(data) >= min_records:  
        return data  
    else:  
        return None  
  
# 股票代码  
stock_code = 'xxxx'  # 示例伪代码  
  
# 爬取数据  
investing_data = scrape_investing(stock_code)  
yahoo_finance_data = scrape_yahoo_finance(stock_code)  
tiingo_data = scrape_tiingo(stock_code, 'TIINGO_API_KEY')  # 真实的Tiingo API 密钥  
  
# 筛选数据  
investing_data = filter_data(investing_data)  
yahoo_finance_data = filter_data(yahoo_finance_data)  
tiingo_data = filter_data(tiingo_data)  
# 清洗数据...  
# 保存文件...  

在数据获取的过程中,我们也遇到一些困难,有网站有反爬虫机制,它们采取反爬虫机制来防止爬虫访问。我们用设置合适的请求头,使用代理IP解决了这个问题,还有动态加载的问题, 一些网页如新三板网站(xinsanban.eastmoney.com)使用JavaScript进行动态加载数据,这样爬虫可能无法直接获取到所有的信息。解决办法是我们使用Docker部署一个splash来爬取数据。

FIGURE 1.  使用Splash来解决爬取网页需要JavaScript动态加载的问题

在这里插入图片描述

2.3 选股标准:

在选股时,我们考虑了这四只股票在中国股票市场中的代表性、其历史数据的时间跨度,以及它们的交易活跃度。这种选股标准的应用旨在使我们的研究更具有代表性,能够更全面地反映中国股票市场的整体波动。

2.4 机器学习方法:

我们采用了深度学习方法,主要是长短时记忆网络(LSTM)。并且与BP神经网络进行了一个对比实验,LSTM作为一种递归神经网络,在捕捉时间序列数据中的长期依赖关系方面表现出色。通过对股票价格的历史数据进行训练,我们预期的是LSTM能够有效地建模和预测未来的价格趋势。

2.5 改进方法:

在基础的LSTM模型上,我们引入了动态残差学习和堆叠式LSTM的改进方法。动态残差学习旨在通过调整残差连接,提升模型的长期记忆能力。而堆叠式LSTM通过增加模型的深度,更好地捕捉时间序列中的复杂模式。这些改进方法旨在提高模型对系统性风险的识别和预测能力,使其更适用于金融领域的时间序列预测任务。

3. 反向神经网络以及短期记忆网络的数学表达

反向传播(BP)神经网络是一类人工神经网络,在机器学习和模式识别领域非常受欢迎。这些网络属于监督学习算法家族,尤其以其学习输入和输出数据之间复杂映射的能力而闻名。术语“反向传播”是指误差通过网络向后传播的训练过程,从而能够调整权重以最小化预测输出和实际输出之间的差异。

3.1 反向传播原理的概念

3.1.1 神经网络结构

BP神经网络由输入层、一个或多个隐藏层和输出层组成。每层都包含互连的节点,每个连接都与一个权重相关联。

3.1.2 前馈过程

在前馈过程中,输入数据在网络中逐层传播,通过每个节点中的加权连接和激活函数进行转换。此过程生成网络的输出。如下公式(1),前馈的过程是通过网络传播输入以使用激活函数生成输出。

a j ( l ) = g ( z j ( l ) ) ( 1 ) a_j^{(l)} = g(z_j^{(l)}) (1) aj(l)=g(zj(l))1

FIGURE 2.  BP神经网络的前馈过程(图源知乎)

在这里插入图片描述

3.1.3 误差计算:

将网络生成的输出与实际目标值进行比较,并计算误差。常见的误差函数包括均方误差 (MSE) 或交叉熵。如下公式(2),误差计算是计算预测 a k ( L ) a_k^{(L)} ak(L)和实际 y k y_k yk输出之间的差异。

E = 1 2 ∑ k ( y k − a k ( L ) ) ( 2 ) E=\frac{1}{2}\sum_{k}(y_{k}-a_{k}^{(L)})(2) E=21k(ykak(L))2

FIGURE 3.  BP神经网络的误差计算(图源知乎)

在这里插入图片描述

3.1.4 反向传播算法

反向传播算法涉及权重的迭代调整以最小化误差。首先进行梯度计算(公式3)用微积分的链式法则计算误差相对于每个权重的梯度。然后更新权重(公式4),权重以梯度的相反方向更新,目的是减少误差。再引入学习率,以此来控制权重更新期间的步长。它可以防止超调或收敛问题。然后是激活函数(公式5),它向网络引入非线性,使其能够学习复杂的关系。最后训练迭代前馈和反向传播步骤重复多次迭代或历元,直到网络收敛到误差最小化的状态。

FIGURE 4.  BP神经网络的反向传播(图源知乎)

在这里插入图片描述

∂ E ∂ ω i j ¨ ( 1 ) = δ j ( l + 1 ) ∗ a i ( l ) ( 3 ) \frac{\partial E}{\partial\omega_{\ddot{\mathrm{ij}}}^{(1)}}=\delta_{j}^{(l+1)}*a_{i}^{(l)} (3)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SheathedSharp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值