来源:机器之心
本文长度为4498字,建议阅读8分钟
本文非常适合初学者了解如何使用TensorFlow构建基本的神经网络。
STATWORX 团队近日从 Google Finance API 中精选出了 S&P 500 数据,该数据集包含 S&P 500 的指数和股价信息。有了这些数据,他们就希望能利用深度学习模型和 500 支成分股价预测 S&P 500 指数。STATWORX 团队的数据集十分新颖,但只是利用四个隐藏层的全连接网络实现预测,读者也可以下载该数据尝试更加优秀的循环神经网络。
本文非常适合初学者了解如何使用 TensorFlow 构建基本的神经网络,它全面展示了构建一个 TensorFlow 模型所涉及的概念与模块。本文所使用的数据集可以直接下载,所以有一定基础的读者也可以尝试使用更强的循环神经网络处理这一类时序数据。
数据集地址:http://files.statworx.com/sp500.zip
导入和预处理数据
STATWORX 团队从服务器爬取股票数据,并将它们保存为 csv 格式的文件。该数据集包含 n=41266 分钟的记录,范围从 2017 年的 4 月到 8 月的 500 支股票和 S&P 500 指数,股票和股指的范围分布十分广。
# Import data
data = pd.read_csv('data_stocks.csv')
# Dimensions of dataset
n = data.shape[0]
p = data.shape[1]
该数据集已经经过了清理与预处理,即损失的股票和股指都通过 LOCF'ed 处理(下一个观测数据复制前面的),所以该数据集没有任何缺损值。
我们可以使用 pyplot.plot('SP500') 语句绘出 S&P 时序数据。
S&P 500 股指时序绘图
-
预备训练和测试数据
该数据集需要被分割为训练和测试数据,训练数据包含总数据集 80% 的记录。该数据集并不需要扰乱而只需要序列地进行切片。训练数据可以从 2017 年 4 月选取到 2017 年 7 月底,而测试数据再选取剩下到 2017 年 8 月的数据。
# Training and test data
train_start = 0
train_end = int(np.floor(0.8*n))
test_start = train_end + 1
test_end = n
data_train = data[np.arange(train_start, train_end), :]
data_test = data[np.arange(test_start, test_end), :]
时序交叉验证有很多不同的方式,例如有或没有再拟合(refitting)而执行滚动式预测、或者如时序 bootstrap 重采样等更加详细的策略等。后者涉及时间序列周期性分解的重复样本,以便模拟与原时间序列相同周期性模式的样本,但这并不不是简单的复制他们的值。
-
数据标准化
大多数神经网络架构都需要标准化数据,因为 tanh 和 sigmoid 等大多数神经元的激活函数都定义在 [-1, 1] 或 [0, 1] 区间内。目前线性修正单元 ReLU 激活函数是最常用的,但它的值域有下界无上界。不过无论如何我们都应该重新缩放输入和目标值的范围,这对于我们使用梯度下降算法也很有帮助。缩放取值可以使用 sklearn 的 MinMaxScaler 轻松地实现。
# Scale data