股票数据集3- 纳斯达克NASDAQ 100 指数预测

通过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结构:

我们用的是第一种,大体输出结果如下:

## 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/d_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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值