- 一、数据集介绍
- 二、程序介绍
- 2.1 加载数据集
- 2.2 数据集预处理及特征提取
- 2.3 划分训练集、测试集的数据和标签
- 2.4 建立模型及训练
- 2.5 输出结果可视化
数据集采用所有当前标准普尔500指数公司的历史股票数据。 在这里,提供了一个数据集,其中包括目前在S&P500指数上发现的所有公司的历史股价(过去5年)。
数据以两种格式呈现,以满足不同个人的需求或计算限制。 已经包括了包含5年股票数据的文件(在allstocks5yr.csv和相应的文件夹中)。 文件夹individualstocks5yr包含单个股票的数据文件,以其股票代码名称标记。 allstocks5yr.csv包含相同的数据,以合并的.csv文件显示。 根据预期用途(绘图、建模等),用户可能更喜欢这些给定格式中的一种。
数据集链接如下:https://www.kaggle.com/camnugent/sandp500
当然,如果你下载出现问题,我这里也上传了我下载好的数据集,有需要的可以自取:https://download.csdn.net/download/didi_ya/20618247
所有文件都有以下的列:
- Date——格式:yy-mm-dd
- Open——开盘时的股票价格(这是纽约证券交易所的数据,所以都是美元)
- High——当天达到的最高价格
- Low Close——当天达到的最低价格
- Volume——股票交易数量
- Name——股票代码名称 该数据集可用于股票分析与预测。
首先,导入相应的库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential,load_model
from keras.layers import LSTM,Dense,Dropout
import os
2.1 加载数据集
加载数据集并读取前5行数据:
df=pd.read_csv('AAPL_data.csv')
df.head() # 读取前5行数据
df=df['open'].values # 获取开盘价open的值
df=df.reshape(-1,1) # 转换为1列
print(df.shape)
df[:5] # 输出df的前5个值
划分训练集和测试集:
dataset_train=np.array(df[:int(df.shape[0]*0.8)]) # 80%作为训练集
dataset_test=np.array(df[int(df.shape[0]*0.8)-50:]) #后20%+50作为测试集
print(dataset_train.shape)
print(dataset_test.shape)
(1007, 1) (302, 1)
训练集和测试集数据归一化为(0,1):
scaler=MinMaxScaler(feature_range=(0,1)) # 将数据归一化为(0,1)
dataset_train=scaler.fit_transform(dataset_train) # 拟合数据并将其进行转换
dataset_train[:5] # 输出前5个值
dataset_test=scaler.transform(dataset_test) # 缩放dataset
dataset_test[:5] # 输出前5个值
2.3 划分训练集、测试集的数据和标签
创建一个划分数据及标签的函数,这里定义为create_dataset:
# 划分训练集(测试集)数据x及标签y
# 前50个数据作为数据x,后一个数据作为标签y
def create_dataset(df):
x=[]
y=[]
for i in range(50,df.shape[0]): # 产生50到df.shape[0]的整数序列
x.append(df[i-50:i,0])
y.append(df[i,0])
x=np.array(x)
y=np.array(y)
return x,y
划分训练集数据和标签:
x_train,y_train=create_dataset(dataset_train) # 划分训练集数据和标签
print(x_train.shape)
x_train[:1] #显示训练集第一个数据样本
(957, 50)
划分测试集数据和标签:
x_test,y_test=create_dataset(dataset_test) #划分测试集数据和标签
print(x_test.shape)
x_test[:1]
(252, 50)
最后,将其转换为LSTM可训练的数据样式:
# Reshape features for LSTM Layer
x_train=np.reshape(x_train,(x_train.shape[0],x_train.shape[1],1)) # 训练集数据
x_test=np.reshape(x_test,(x_test.shape[0],x_test.shape[1],1)) # 测试集数据
print(x_train.shape)
print(x_test.shape)
(957, 50, 1) (252, 50, 1)
2.4 建立模型及训练利用Keras搭建神经网络训练模型:
model=Sequential()
model.add(LSTM(units=96,return_sequences=True,input_shape=(x_train.shape[1],1)))
model.add(Dropout(0.2))
model.add(LSTM(units=96,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=96,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=96))
model.add(Dropout(0.2))
model.add(Dense(units=1))
编译训练:
model.compile(loss='mean_squared_error',optimizer='adam')
if(not os.path.exists('stock_prediction.h5')):
model.fit(x_train,y_train,epochs=50,batch_size=32) # 训练
model.save('stock_prediction.h5')
2.5 输出结果可视化
训练完成后,预测输出并绘制真实和预测图像:
predictions=model.predict(x_test) #预测输出
predictions=scaler.inverse_transform(predictions) # 反归一化
fig,ax=plt.subplots(figsize=(8,4))
plt.plot(df,color='red',label='True Price') # 绘制真实价格
ax.plot(range(len(y_train)+50,len(y_train)+50+len(predictions)),predictions,color='blue',label='Predicted Testing Price') # 绘制预测价格
plt.legend()
预测图像: 测试集可视化:
y_test_scaled=scaler.inverse_transform(y_test.reshape(-1,1))
fig,ax=plt.subplots(figsize=(8,4))
ax.plot(y_test_scaled,color='red',label='True Testing Price')
plt.plot(predictions,color='blue',label='Predicted Testing Price')
plt.legend()
预测图像:
ok,以上便是循环神经网络进行股票价格预测,如果对你有所帮助,记得点个赞哟,完整代码也可以参考:https://download.csdn.net/download/didi_ya/20721581