文章目录LSTM模型预测个股收盘价一、前言二、LSTM建模1 .模型升级1.1、LSTM升级1.2、数据集升级2.1、代码分析2.2、相关库部署2.2、模型构建2.4
LTM模型预测个股收盘价1,前言
该情况来源于AI For Trading: LSTM模型预测3天后的收盘价,利用LSTM模型,多个特征指标预测收盘价的项目。
二、LSTM建模LSTM模型是一类RNN,其特点是基于单循环神经网络构建了长短记忆门。 也就是说,在重点关注当前数据中存在的信息的同时,可以发现并存储数据序列中存在的长相关性。 本项目采用LSTM模型预测上证指数3天后的收盘价。 也就是说,使用5月10日前的数据,预测5月15日的收盘价。
1 .模型预测升级LSTM模型的所有股价的能力,模型本身主要是捕捉价格序列中时间序列要素的信息。 对模型进行预测本身是完全没有问题的,但此次模型升级的根本目标是提高预测精度。 关于模式的升级,主要来自两个方面。 一个是模型优化,另一个是数据优化。
1.1 .升级lstmlstm机型大致有六种变形形式,主要特点是针对不同的数据输入类型。 这里选择了Multiple Input模型,即多序列输入、单序列输出。 选择该模型对数据的构建也有很好的促进作用,可以构建hxdxb (多维数组)。 该hxdxb是5维的hxdxb,各维是特征数据,同时可以用n天的方法形成数据片。 这个设计基于两个理由:
数据包含的信息越多,但特征数据越多,提供的信息就越多,成为多因子的雏形。 在保留多特征数据的基础上,保留时间序列数据的主要特征。 也就是说,在不增加特征的情况下,将特征信息加倍。 该数据处理模型非常好于许多传统算法。 许多传统算法还是以单个样本为切片输入所有维度的数据,在捕获时间序列信息方面存在欠缺。
1.2 .升级数据集中的数据是从2010年1月1日—2019年5月10日的大智慧中提取的数据,数据时间段为开放式价格、封闭、卷、真) 根据n个交易日的模式,将数据转换为shape(m,n,5 )中的hxdxb表。 原始数据:上证指数. xlsx
2 .代码分析http://www.Sina.com/jupyternotebook代码
2.1 .相关库部署# 所需的库importpandasaspdimportnumpyasnpfromnumpyimportlogfromsklearn.preprocessingimportminmaxscalerfromkeras.modelsimportssportskeas s import LSTM, denseimportkerasfromsklearn.metrics importr2_ scoreimportrandomimportmatplotlib.pyplotasplt #中文,设置减号设置PLT.rcparamarame PLT.rcparams [ ' axes.unicode _ MINUS ' ]=false 2.2 .生成模型#全局参数,要调整的所有参数其中dim=300 #输出维数,LSTM的网络节点batch_size=535 #培训批处理大小是一次读取多少个样本进行运算,越大运算速度越快,但占用的内存和内存越多,根据自己的机器性能设置此外,该参数还确定了梯度下降算法的下降步数。 #网络构建开始n_steps=days#hxdxb的维度计数n_features=5#hxdxb的维度model_2=sequential(#用于激活函数的relumodel_2.add ) lstm n_features ) )输出层,只要输出节点model_2.add(dense ) )选择优化器和丢失函数,该丢失函数就是线性规划算法
r e t
u r n = l n ( C l o s e t C l o s e t − 1 ) return=ln(frac{Close_{t}}{Close_{t-1}}) return=ln(Closet−1Closet) data = pd.read_excel('上证指数.xlsx')data.head(10)data.info()# 提取本项目所使用的数据data_ = data[['开盘价', '收盘价', '成交量', '成交金额']].loc[(data['日期'] >= '2010-01-01') & (data['日期'] <= '2019-05-10')]data_['日收益率'] = log(data_[['收盘价']]).diff(-1)data_.index = data['日期'].loc[(data['日期'] >= '2010-01-01') & (data['日期'] <= '2019-05-10')]data_.dropna(axis=0, inplace=True)data_.tail(10)data_.shape 2.构建函数构建两个处理数据生成hxdxb表的函数,一个用带标签输出,另一个只处理输入数据集,生成20X5的切片数据。
def processData(data, lb): X, Y = [], [] for i in range(len(data) - lb - 1): X.append(data[i:(i + lb), 0]) try: Y.append(data[(i + 2 + lb), 0]) except: Y.append(data[(i + lb), 0]) return np.array(X), np.array(Y) def pData(data, lb): X = [] for i in range(len(data) - lb - 1): X.append(data[i:(i + lb)]) return np.array(X) 3.数据清洗 close = data_['收盘价']cl = np.array(close)clcl = cl.reshape(cl.shape[0], 1)clscl = MinMaxScaler()sc2 = MinMaxScaler()cl = scl.fit_transform(cl)cl# 生成标签_, y = processData(cl, days)X = data_.valuesX.shapeX = sc2.fit_transform(X)XX = pData(X, days)X.shape 4.数据集拆分 y_train, y_test = y[:int(y.shape[0] * 0.80)], y[int(y.shape[0] * 0.80):]x_train, x_test = X[:int(X.shape[0] * 0.80)], X[int(X.shape[0] * 0.80):] 2.5.建模 1.训练模型 History = model_2.fit(x_train,y_train,batch_size=batch_size, epochs=epochs, validation_data=(x_test,y_test),shuffle=False) plt.plot(History.history['loss'], label='loss')plt.plot(History.history['val_loss'], label='val loss')plt.legend(loc='best')plt.title('The loss values of real and predict')plt.savefig('D:/mojin/self/try/LSTM/result/真实值与预测值的loss值.jpg')plt.show();[out]
[out]