通过4天股票数据预测后1天的数据
1. 特征选择
从上一节的PCA特征分析中,我们大概选择40-60只股票就可涵盖该数据集的主要信息。
因此,我们选择前32 or 64只股票作为模型输入, NASDAQ指数作为预测输出。
也可以根据上一节内容,分析特征重要性以筛选重要特征,这里未做该部分优化。
2. 数据处理
2.1 处理空值nan
我们用的是全数据集full = './nasdaq100/full/full_non_padding.csv’
对里面大量nan值做填充(padding)
#数据清洗,去除NaN数据,用邻近均值做填充(padding)
def nan_helper(y):return np.isnan(y), lambda z: z.nonzero()[0]
data = df.to_numpy()
for col in range(data.shape[1]):nans, x = nan_helper(data[:,col])data[nans,col] = np.interp(x(nans),x(~nans),data[~nans,col])
df = pd.DataFrame(data,columns = columns)
2.2 数据拼接
我们选择数据的前n支股票,预测最后1个指数,数据的shape是(74501, 105)
因此需要抽取n支股票后按列拼接:
data1 = df.iloc[:,:(input_size-1)] # 这里需要保留前input_size-1个特征,
data2 = df.iloc[:,-1] # 最后一个指数特征
data = pd.concat([data1,data2],axis=1) #按列拼接
print(data.shape)
3. 模型训练 &模型评估
模型有两种思路一种直接参考天气数据的预测:
- 天气数据预测
另一种是通过自编码器,一种更复杂的RNN结构:
- DA-RNN
我们用的是第一种,大体输出结果如下:
## RNN
# Test Loss: 6.7714215 Ep=10, LR=1e-3
# Test Loss: 0.0841337 Ep=10, LR=1e-4
# Test Loss: 0.0620537 Ep=10, LR=5e-5 | Epoch [10/10], Loss: 0.0000688
# Test Loss: 0.0555936 Ep=10, LR=1e-5 | Epoch [10/10], Loss: 0.0000089## GRU
# Test Loss: 0.0495339 Ep=10, LR=1e-5 | Epoch [10/10], Loss: 0.0000048
# Test Loss: 0.0875661 Ep=20, LR=1e-5 | Epoch [20/20], Loss: 0.0000326# Test Loss: 0.0745597 Ep=10, LR=1e-6 | Epoch [10/10], Loss: 0.0000036
# Test Loss: 0.0763733 Ep=20, LR=1e-6 | Epoch [20/20], Loss: 0.0004341
# Test Loss: 0.0602298 Ep=20, LR=1e-5 | Epoch [20/20], Loss: 0.0000151
# Test Loss: 0.1652189 Ep=20, LR=1e-5 | Epoch [20/20], Loss: 0.0000038 | input_size = 32 => 64# Test Loss: 0.0413432 Ep=20, LR=1e-6 | Epoch [20/20], Loss: 0.0000610 | input_size = 32 => 64 hidden_size = 64 => 128# Test Loss: 0.0537035 Ep=20, LR=1e-6 | Epoch [20/20], Loss: 0.0003193 | input_size = 32 hidden_size = 64 => 128
# Test Loss: 0.0897933 Ep=20, LR=1e-6 | Epoch [20/20], Loss: 0.0003652 | input_size = 32 => 64 hidden_size = 64 => 128 Layers = 3# Test Loss: 0.0827767 Ep=20, LR=1e-7 | Epoch [20/20], Loss: 0.0080595 | input_size = 32 hidden_size = 128
# Test Loss: 0.0882905 Ep=30, LR=1e-7 | Epoch [30/30], Loss: 0.0144194 | input_size = 64 hidden_size = 128
通过4天股票数据预测后1天的数据,最好的测试结果在Test Loss: 0.0413432,有效,但还有改进的空间。
4.总结
- train loss,不是越低越好
- epoch, 也不是越低越好
- 所有参数需要在“同等规模”下,即相匹配,才能发挥模型性能
Reference
-
本案例代码: https://github.com/disanda/b_code/blob/master/2.Stock_Prediction/readme.md
-
A case: https://chandlerzuo.github.io/blog/2017/11/darnn
-
数据集: https://cseweb.ucsd.edu/~yaq007/NASDAQ100_stock_data.html
-
论文: https://arxiv.org/abs/1704.02971
“A Dual-Stage Attention-Based Recurrent Neural Network for Time Series Prediction” IJCAI, 2017
Code: https://github.com/Seanny123/da-rnn