TensorFlow深度学习!构建神经网络预测股票价格!?( 二 )


# 幅度缩放df2 = dfcols = ['close', 'volume', 'previous_close']features = df2[cols]scaler = MinMaxScaler(feature_range=(0, 1)).fit(features.values)features = scaler.transform(features.values)df2[cols] = features在这里 , 我们重点处理了收盘价、成交量和前几天收盘价列 。
数据切分接下来我们将数据拆分为训练和测试数据集 。
# 收盘价设为目标字段X = df2.drop(['close','timestamp'], axis =1)y = df2['close']import math# 计算切分点(以80%的训练数据为例)train_percentage = 0.8split_point = math.floor(len(X) * train_percentage)# 时序切分train_x, train_y = X[:split_point], y[:split_point]test_x, test_y = X[split_point:], y[split_point:]接下来 , 我们对数据进行处理 , 构建滑窗数据 , 沿时间序列创建数据样本 。(因为我们需要基于历史信息对未来的数值进行预测)

TensorFlow深度学习!构建神经网络预测股票价格!?

文章插图
# 构建滑窗数据import numpy.libfrom numpy.lib.stride_tricks import sliding_window_viewdef genWindows(X_in, y_in, window_size):X_out = []y_out = []length = X_in.shape[0]for i in range(window_size, length):X_out.append(X_in[i-window_size:i, 0:4])y_out.append(y_in[i-1])return np.array(X_out), np.array(y_out)# 窗口大小为5window_size = 5X_train_win, y_train_win = genWindows(np.array(train_x), np.array(train_y), window_size)X_test_win, y_test_win = genWindows(np.array(test_x), np.array(test_y), window_size)模型构建&训练构建完数据之后 , 我们就要构建 RNN 模型了 , 具体的代码如下所示 。注意到下面使用了1个回调函数 , 模型会在验证集性能没有改善的情况下提前停止训练 , 防止模型过拟合影响泛化能力 。
from tensorflow.keras import callbacks# 早停止 回调函数callback_early_stopping = callbacks.EarlyStopping(monitor="loss",patience=10,#look at last 10 epochsmin_delta=0.0001,#loss must improve by this amountrestore_best_weights=True,)from tensorflow import kerasfrom tensorflow.keras import layersfrom keras.models import Sequential# 构建RNN模型 , 结构为 输入-RNN-RNN-连续值输出input_shape=(X_train_win.shape[1],X_train_win.shape[2])print(input_shape)model = Sequential([layers.Input(shape=input_shape),layers.SimpleRNN(units=128, return_sequences=True),layers.SimpleRNN(64, return_sequences=False),layers.Dense(1, activation="linear"),])# 优化器optimizer = keras.optimizers.Nadam(learning_rate=0.0001)model.compile(optimizer=optimizer, loss="mse")# 模型结构总结model.summary()# 模型训练batch_size = 20epochs = 50history = model.fit(X_train_win, y_train_win,batch_size=batch_size, epochs=epochs,callbacks=[callback_early_stopping])模型训练过程的损失函数(训练集上)的变化如下图所示 。随着训练过程推进 , 模型损失不断优化 , 初期的优化和loss减小速度很快 , 后逐渐趋于平稳 。
TensorFlow深度学习!构建神经网络预测股票价格!?

文章插图
大约 10 个 epoch 后达到了最佳结果 , 训练好的模型就可以用于后续预测了 , 我们可以先对训练集进行预测 , 验证一下在训练集上学习的效果 。
# 训练集预测pred_train_y = model.predict(X_train_win)# 绘图plt.figure(figsize=(15, 6), dpi=80)plt.plot(np.array(train_y))plt.plot(pred_train_y)plt.legend(['Actual', 'Predictions'])plt.show()模型在训练集上学习的效果还不错 , 大家可以看到预测结果和真实值对比绘图如下:
TensorFlow深度学习!构建神经网络预测股票价格!?

文章插图
模型预测&应用我们要评估模型的真实表现 , 需要在它没有见过的测试数据上评估 , 大家记得我们在数据切分的时候预留了 20% 的数据 , 下面我们用模型在这部分数据上预测并评估 。

经验总结扩展阅读