梦见你的名字 发表于 2024-9-6 09:07:57

用RNN(循环神经网络)预测股票价格

RNN(循环神经网络)是一种特殊类型的神经网络,它能够处置惩罚序列数据,并且具有记忆先前信息的能力。这种网络布局特殊得当于处置惩罚时间序列数据、文本、语音等具有时间依靠性的问题。RNN的焦点特点是它可以捕捉时间序列中的长期依靠关系。
RNN的基本布局
RNN由多个重复的单元组成,每个单元可以看作是一个小型的神经网络。这些单元按顺序处置惩罚序列中的每个元素,并且每个单元的输出不光取决于当前的输入,还取决于前一个单元的输出。这种布局使得RNN能够在序列的差别时间点之间传递信息。
RNN的工作原理

[*] 输入:RNN接收一个序列作为输入,序列中的每个元素在差别的时间步骤被输入到网络中。
[*] 隐藏层:每个时间步骤,RNN都会计算一个隐藏状态,这个状态是当前输入和前一时间步骤隐藏状态的函数。隐藏状态可以看作是网络对到目前为止所观察到的所有输入的总结。
[*] 输出:在每个时间步骤,RNN可以产生一个输出,这个输出是基于当前的隐藏状态。对于某些任务,如语言模型或文本天生,输出可能是序列的下一个元素。
[*] 循环毗连:RNN的每个单元都包罗一个循环毗连,这个毗连将当前单元的输出反馈到下一个时间步骤的相同单元的输入中。这种循环毗连是RNN能够处置惩罚序列数据的关键。
RNN的变体
由于标准的RNN在处置惩罚长序列时会遇到梯度消失或梯度爆炸的问题,因此出现了一些改进的RNN布局:

[*] LSTM(长短期记忆网络):LSTM通过引入门控机制(输入门、忘记门、输出门)来解决梯度消失的问题,使得网络能够学习到长期依靠关系。
[*] GRU(门控循环单元):GRU是LSTM的一个简化版本,它将LSTM中的三个门镌汰为两个门(更新门和重置门),并且将细胞状态和隐藏状态合并为一个。
[*] 双向RNN(Bi-RNN):在双向RNN中,序列的每个元素同时被两个RNN处置惩罚,一个处置惩罚正向序列,另一个处置惩罚反向序列。这答应网络在每个时间步骤同时考虑前后文信息。
RNN的应用
RNN在很多范畴都有广泛的应用,包括:


[*]自然语言处置惩罚:如呆板翻译、文本摘要、感情分析、语言模型。
[*]语音识别:将语音信号转换为文本。
[*]时间序列预测:如股票价格预测、天气预测。
RNN的这些应用通常涉及到序列数据的处置惩罚,此中序列中的元素之间存在时间上的依靠关系。通过学习这些依靠关系,RNN能够预测序列的未来走向或理解序列的模式。
要实现一个预测股票价格的循环神经网络(RNN)模型,我们必要考虑以下几个关键步骤:

[*]数据网络:获取股票价格汗青数据,通常包括开盘价、最高价、最低价、收盘价和成交量等。
[*]数据预处置惩罚:包括数据清洗、归一化或标准化、序列构造等,以便于模型能够更好地学习和泛化。
[*]模型计划:选择符合的RNN架构,如简单RNN、LSTM或GRU,并计划网络层布局。
[*]模型训练:使用训练数据对模型进行训练,并调解参数以优化性能。
[*]预测与评估:使用测试数据评估模型的预测能力,并选择符合的评估指标,如均方毛病(MSE)。
接下来,我将提供一个简化的RNN模型实现案例,用于预测股票价格。
假设已经网络到了股票价格的汗青数据,并将其存储在一个名为stock_prices.csv的文件中。数据预处置惩罚和模型计划将基于这个假设数据进行。
数据入口:‌​‌‬‬​‬​​​​‍​‬​‍‌​‬‌‍​​​​​‍​​​​​‬​‬​⁠‬‬用于学习的财经数据 - 飞书云文档 (feishu.cn)
接下来将使用Python来编写股票价格预测脚本,利用TensorFlow和Keras库构建和训练一个循环神经网络(RNN)模型。
Step1:导入所需的库

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN
from tensorflow.keras.optimizers import Adam
import numpy as np
这里导入了数据处置惩罚(pandas)、数据预处置惩罚(MinMaxScaler)、神经网络模型构建(Sequential, Dense, SimpleRNN)和优化器(Adam)相关的库。
Step2:加载数据

data = pd.read_csv('stock_prices.csv')
使用pandas库从CSV文件中读取股票价格数据。
Step3:选择特性和标签

features = data[['Open', 'High', 'Low', 'Volume']]
labels = data['Close']
从数据中提取开盘价、最高价、最低价和成交量作为特性(用于训练模型),收盘价作为标签(模型的预测目的)。
Step4:数据归一化

scaler = MinMaxScaler(feature_range=(0, 1))
scaled_features = scaler.fit_transform(features)
scaled_labels = scaler.fit_transform(labels.values.reshape(-1, 1))
使用MinMaxScaler将特性和标签数据缩放到0和1之间,以帮助神经网络更好地学习。
这里创建了一个MinMaxScaler实例,并指定了特性范围feature_range为(0, 1)。这意味着所有的特性将被缩放到0和1之间。
fit_transform方法执行两个操作:首先,fit方法计算用于缩放数据的参数(即每个特性的最小值和最大值)。然后,transform方法使用这些参数来实际转换数据。features是包罗所有特性数据的DataFrame,调用fit_transform后,这些特性将被缩放到0和1之间的范围。
这一步与上一步类似,但是它应用于标签数据。首先,由于labels是一个Series,使用.values将其转换为NumPy数组。然后,.reshape(-1, 1)将数组重塑为一个列向量,这是由于fit_transform期望输入数据的形状为 。在这个例子中,n_features是1,由于我们只有一个标签(收盘价)。
Step5:构造序列数据

def create_dataset(data, look_back=1):
    X, Y = [], []# 初始化两个列表,X用于存储特征,Y用于存储标签
    for i in range(len(data) - look_back):# 遍历数据,直到长度减去look_back
      X.append(data)# 将从当前位置到look_back的数据追加到X列表
      Y.append(data)# 将look_back之后的数据追加到Y列表
    return np.array(X), np.array(Y)# 将列表转换为NumPy数组并返回

look_back = 1
X, Y = create_dataset(scaled_features, look_back)
参数说明:


[*]data: 输入的时间序列数据,通常是二维数组,此中每一行代表一个时间步,每一列代表一个特性。
[*]look_back: 一个整数,表示在构造特性序列时回看的汗青时间步数。默认值为1,表示只使用前一个时间步的数据作为特性。
函数内部逻辑:

[*] 初始化两个空列表 X 和 Y,用于存储特性和标签。
[*] 使用 for 循环遍历数据,循环的范围是 len(data) - look_back。这是由于我们必要确保对于每个起始索引 i,都有足够的后续数据来构造一个长度为 look_back 的特性序列和一个对应的标签。
[*] 在每次循环中,使用切片操作 data 来从数据中提取长度为 look_back 的子序列,并将其追加到 X 列表中。
[*] 同时,提取 look_back 之后的数据行 data 作为标签,并将其追加到 Y 列表中。
[*] 循环结束后,使用 np.array 将 X 和 Y 列表转换为 NumPy 数组,并返回这两个数组。
调用 create_dataset 函数:
look_back = 1
X, Y = create_dataset(scaled_features, look_back)
这里,look_back 被设置为 1,表示每个特性序列将只包罗一个时间步。然后,create_dataset 函数被调用来处置惩罚 scaled_features 数据(假设这是之前已经归一化的特性数据)。函数返回的 X 和 Y 将被用作训练模型的输入和目的数据。
简而言之,这段代码的目的是将原始时间序列数据转换为得当训练序列预测模型的形式,此中 X 包罗多个时间步的特性序列,而 Y 是对应的标签数组。
Step6:创建模型

model = Sequential()
model.add(SimpleRNN(units=50, return_sequences=True, input_shape=(look_back, features.shape)))
model.add(SimpleRNN(units=50))
model.add(Dense(1))
创建一个序贯模型(Sequential),并添加了两层SimpleRNN和一个输出层(Dense)。第一个SimpleRNN层返回序列,第二个不返回。
Step7:编译模型

model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error')
使用Adam优化器和均方毛病丧失函数来编译模型。
Step8:训练模型

model.fit(X, Y, epochs=100, batch_size=32, verbose=1)
使用提供的特性和标签数据训练模型,设置迭代次数为100,批量大小为32,并显示训练过程。
Step9:预测

predicted_prices = model.predict(X)
predicted_prices = scaler.inverse_transform(predicted_prices)
df_predicted = pd.DataFrame(predicted_prices, columns=['Predicted Close Price'])
df_predicted 使用训练好的模型进行预测,并将预测结果从归一化后的值转换回原始标准,结果如下:
https://i-blog.csdnimg.cn/direct/761d1452662e48579b19c831e6f47be8.png
以上就是用Python编写的一个股票价格预测脚本,利用了TensorFlow和Keras库来构建和训练一个循环神经网络(RNN)模型来预测股票价格的相对完整的过程。
 
想要了解更多多元化的数据分析视角,可以关注之前发布的相关内容。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 用RNN(循环神经网络)预测股票价格