五、RNN实现股票预测

本文介绍了如何使用Python和深度学习中的循环神经网络(RNN)对民生银行股票进行历史数据预测。作者首先通过TushareAPI获取股票数据,然后进行数据预处理、特征提取和模型构建,使用TensorFlow实现RNN模型并进行训练和预测,最后展示了预测结果与实际数据的对比。
部署运行你感兴趣的模型镜像

参考文章:深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天-优快云博客​​​​​​

文章中没有给出股票相关的csv文件,先说一下爬取代码:

import tushare as ts
token='你的token' # 登录Tushare 查看自己的token
pro = ts.pro_api(token)
msy = pro.daily(ts_code='600016.SH', start_date='20170101', end_date='20231101') # ts_code='600016.SH'民生银行股票代码,可以任取别的代码,随意啦
print(msy.head()) # 查看前五行数据

msy.to_csv('你的路径\民生银行.csv')  # 保存路径

先登录注册Tushare,然后获取token即可(无tushare的pip一下即可)。

打开后是这样:

时间从17年1月到23年11月,一共1659行数据。

1.导包,设置gpu

import os
import math
from tensorflow import keras
from keras import layers
from keras.layers import Dropout, Dense, SimpleRNN
from sklearn.preprocessing import MinMaxScaler
from sklearn import metrics
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

gpus = tf.config.list_physical_devices("GPU")

if gpus:
    tf.config.experimental.set_memory_growth(gpus[0], True)  #设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpus[0]],"GPU")

2.读取数据

data = pd.read_csv('你的路径/民生银行.csv')  # 读取股票文件
print(data)

3.数据的预处理

"""
前(1659-300=1359)天的开盘价作为训练集,表格从0开始计数,3:4 是提取[3:4)列,前闭后开,故提取出3列开盘价
后300天的开盘价作为测试集
"""
training_set = data.iloc[0:1659 - 300, 3:4].values
test_set = data.iloc[1659 - 300:, 3:4].values

# 归一化
sc = MinMaxScaler(feature_range=(0, 1))
training_set = sc.fit_transform(training_set)
test_set = sc.transform(test_set)

x_train = []
y_train = []

x_test = []
y_test = []

"""
使用前60天的开盘价作为输入特征x_train
    第61天的开盘价作为输入标签y_train

for循环共构建1659-300-60=1299组训练数据。
       共构建300-60=240组测试数据
"""
for i in range(60, len(training_set)):
    x_train.append(training_set[i - 60:i, 0])
    y_train.append(training_set[i, 0])

for i in range(60, len(test_set)):
    x_test.append(test_set[i - 60:i, 0])
    y_test.append(test_set[i, 0])

# 对训练集进行打乱
np.random.seed(7)
np.random.shuffle(x_train)
np.random.seed(7)
np.random.shuffle(y_train)
tf.random.set_seed(7)

"""
将训练数据调整为数组(array)
调整后的形状:
x_train:(1299, 60, 1)
y_train:(1299,)
x_test :(240, 60, 1)
y_test :(240,)
"""
x_train, y_train = np.array(x_train), np.array(y_train) # x_train形状为:(1299, 60, 1)
x_test, y_test = np.array(x_test),  np.array(y_test)

"""
输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]
"""
x_train = np.reshape(x_train, (x_train.shape[0], 60, 1))
x_test = np.reshape(x_test,  (x_test.shape[0], 60, 1))

4.模型的构建、编译及训练

model = tf.keras.Sequential([
    SimpleRNN(100, return_sequences=True), # 布尔值。是返回输出序列中的最后一个输出,还是全部序列。
    Dropout(0.1),                         # 防止过拟合
    SimpleRNN(100),
    Dropout(0.1),
    Dense(1)
])

# 编译,该应用只观测loss数值,不观测准确率,所以删去metrics选项,一会在每个epoch迭代显示时只显示loss值
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss='mean_squared_error')  # 损失函数用均方误差
# 训练
history = model.fit(x_train, y_train,
                    batch_size=64,
                    epochs=100,
                    validation_data=(x_test, y_test),
                    validation_freq=1)                  # 测试的epoch间隔数

model.summary()

5.预测

加个分割线查看归一化的数据和还原后的数据。

plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Loss')
plt.ylabel('Accuracy')
plt.title('RNN训练')
plt.legend(loc='lower right')
plt.show()


predicted_stock_price = model.predict(x_test)                       # 测试集输入模型进行预测
print(predicted_stock_price)
print('---------------------------------------------------------')
predicted_stock_price = sc.inverse_transform(predicted_stock_price) # 对预测数据还原---从(0,1)反归一化到原始范围
print(predicted_stock_price)
print('---------------------------------------------------------')
real_stock_price = sc.inverse_transform(test_set[60:])              # 对真实数据还原---从(0,1)反归一化到原始范围
print(real_stock_price)

# 画出真实数据和预测数据的对比曲线
plt.plot(real_stock_price, color='red', label='Stock Price')
plt.plot(predicted_stock_price, color='blue', label='Predicted Stock Price')
plt.title('RNN预测')
plt.xlabel('Time')
plt.ylabel('Stock Price')
plt.legend()
plt.show()

loss和预测图:

效果还可以,这就去预测股票赚钱去喽!(开个玩笑)

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### RNN 实现股票预测的实战案例与教程 RNN(循环神经网络)是一种适合处理时间序列数据的深度学习模型,广泛应用于股票预测等场景。以下是一个完整的 RNN 股票预测实战案例,包括代码实现和关键点解析。 #### 数据准备 在股票预测中,通常需要从历史数据中提取特征。例如,使用每日收盘价、开盘价、最高价、最低价等作为输入特征[^1]。数据预处理步骤包括归一化、划分训练集和测试集等。 ```python import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler # 加载数据 data = pd.read_csv('stock_data.csv') training_set = data.iloc[:, 1:2].values # 提取收盘价列 # 归一化 scaler = MinMaxScaler(feature_range=(0, 1)) scaled_training_set = scaler.fit_transform(training_set) # 创建数据结构 X_train = [] y_train = [] for i in range(60, len(scaled_training_set)): # 使用过去60天的数据预测下一天 X_train.append(scaled_training_set[i-60:i, 0]) y_train.append(scaled_training_set[i, 0]) X_train, y_train = np.array(X_train), np.array(y_train) # 调整形状 X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1)) ``` #### 模型构建 使用 Keras 构建 RNN 模型。为了缓解长期依赖问题,可以采用 LSTM 或 GRU 等改进版 RNN 单元[^3]。 ```python from keras.models import Sequential from keras.layers import Dense, LSTM, Dropout # 初始化模型 model = Sequential() # 添加 LSTM 层 model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1))) model.add(Dropout(0.2)) # 再添加一层 LSTM model.add(LSTM(units=50, return_sequences=False)) model.add(Dropout(0.2)) # 输出层 model.add(Dense(units=1)) # 编译模型 model.compile(optimizer='adam', loss='mean_squared_error') # 训练模型 model.fit(X_train, y_train, epochs=100, batch_size=32) ``` #### 模型评估与可视化 通过测试集评估模型性能,并绘制预测值与实际值的对比图[^2]。 ```python # 测试集准备 test_data = pd.read_csv('test_stock_data.csv') real_stock_price = test_data.iloc[:, 1:2].values total_dataset = pd.concat((data['Close'], test_data['Close']), axis=0) inputs = total_dataset[len(total_dataset) - len(test_data) - 60:].values inputs = inputs.reshape(-1, 1) inputs = scaler.transform(inputs) X_test = [] for i in range(60, len(inputs)): X_test.append(inputs[i-60:i, 0]) X_test = np.array(X_test) X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1)) # 预测 predicted_stock_price = model.predict(X_test) predicted_stock_price = scaler.inverse_transform(predicted_stock_price) # 可视化 import matplotlib.pyplot as plt plt.plot(real_stock_price, color='red', label='Real Stock Price') plt.plot(predicted_stock_price, color='blue', label='Predicted Stock Price') plt.title('Stock Price Prediction') plt.xlabel('Time') plt.ylabel('Stock Price') plt.legend() plt.show() ``` #### 性能指标 通过均方误差(MSE)和平均绝对误差(MAE)评估模型性能。例如,测试集上的 MSE 为 53.03141531,MAE 为 5.82196445[^2]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值