本程序使用了循环神经网络中的长期短期记忆模型(LSTM)以Apple公司过去60天的股价来预测收盘价
LSTM模型相当于对RNN模型的改良版本
RNN:想把所有的信息都记住,不管是有用的信息还是没用的信息(记忆负担重)
LSTM:设计一个记忆细胞,具备选择记忆的功能,可以选择记忆重要信息,过滤掉噪声信息,减轻记忆负担
关于LSTM的原理这个不过多赘述,推荐观看B站视频。
使用Anaconda3中的Jupyter来编写(个人推荐十分好用)
环境搭建:
Anaconda安装
Anaconda添加新的库
进入后直接打pip即可
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple --user
把tensorflow 换成你要导入的包名即可
项目步骤:
1、首先导入库:
#导入库 import math import pandas_datareader as web import numpy as np import pandas as pd import seaborn as sns from sklearn.preprocessing import MinMaxScaler from keras.models import Sequential from keras. layers import Dense,LSTM import matplotlib.pyplot as plt
2、获取股票报价:
#解决字体显示异常bug
sns.set_style("whitegrid", {"font.sans-serif": ['KaiTi', 'Arial']})
#获取股票报价
df=web.DataReader("AAPL",data_source='yahoo',start='2013-01-01',end='2022-02-15')
#显示数据
df
显示数据如下:
3、绘制股票历史收盘价:
#可视化收盘价历史
plt.figure(figsize=(16,8))
plt.title('历史价格')
plt.plot(df['Close'])
plt.xlabel('日期',fontsize=18)
plt.ylabel('收盘价美元 ($)',fontsize=18)
plt.show()
4、创建一个只有“Close”列的数据集
#创建一个只有“Close”列的数据集 data = df.filter(['Close']) ##转换数据集为numpy数组 dataset = data.values
5、获取训练模型的行数
training_data_len = math.ceil( len (dataset)*.8) training_data_len
6、数据规范化
#数据规范化 scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(dataset) scaled_data
7、创建训练数据集
#数据规范化
#创建训练数据集
#创建缩放的训练数据集train_data
train_data = scaled_data[0:training_data_len,:]
#将数据拆分为x_train和y_train数据集
x_train = []
y_train = []
for i in range(60,len(train_data)):
x_train.append(train_data[i-60:i,0])
y_train.append(train_data[i,0])
if i <= 61:
print(x_train)
print(y_train)
8、将x_train和y_train转换为numpy数组
x_train,y_train = np.array(x_train),np.array(y_train)
9、重塑的数据
x_train = np.reshape(x_train,(x_train.shape[0],x_train.shape[1],1))
10、建立LSTM模型
model = Sequential() model.add(LSTM(50,return_sequences=True, input_shape=(x_train.shape[1],1))) model.add(LSTM(50,return_sequences=False)) model.add(Dense(25)) model.add(Dense(1))
11、编译模型
model.compile(optimizer='adam',loss='mean_squared_error')
12、训练模型
model.fit(x_train,y_train,batch_size=1,epochs=1)
13、创建测试数据集
#创建一个新的数组,包含从索引1978到2438的缩放值
test_data = scaled_data[training_data_len - 60:,:]
#创建数据集x test和y_test
x_test = []
y_test = dataset[training_data_len:,:]
for i in range(60,len(test_data)):
x_test.append(test_data[i-60:i,0])
#转换数据为numpy数组
x_test = np.array(x_test)
#重塑的数据
x_test = np.reshape(x_test,(x_test.shape[0],x_test.shape[1],1))
14、获取模型预测价格值
#获取模型预测价格值 predictions = model.predict(x_test) predictions = scaler.inverse_transform(predictions)
15、计算均方根误差(RMSE)
rmse = np.sqrt(np.mean( predictions - y_test)**2 )
16、绘制图表
train = data[:training_data_len]
valid = data[training_data_len:]
valid['Predictions'] = predictions
#可视化数据
plt.figure(figsize=(16,8))
plt.title('LSTM模型预测')
plt.xlabel('日期', fontsize=18)
plt.ylabel('收盘价美元 ($)', fontsize=18)
plt.plot(train['Close'])
plt.plot(valid[['Close','Predictions']])
plt.legend(["模型训练值",'真实值','预测值'],loc='lower right')
plt.show()



