与第一版相比的改进点
上一篇博客 直接预测收益,训练过程中通过观察预测值的变动,发现LSTM网络收敛起来非常困难,几百万行数据下来,也没有比较明显的收敛迹象。我分析原因有可能为:一行60个交易日,下一行的60个交易日有59个实际上并没有变,即大部分输入数据并未变动,但是收益变动可能会非常巨大(股票的价格变动),如图所示:
收益相对剧烈的变动,给网络的收敛带来了巨大的困难。碍于硬件资源的限制,我没有再尝试更加复杂的网络深度,转而尝试降低收益的波动,具体方法为:
1. 将收益分成3类:收益小于0%,收益小于5%,收益大于等于5%,对应[1, 0, 0]、[0, 1, 0]、[0, 0, 1] 3种输出。
2. 给LSTM网络输出层套上softmax激励函数,将预测收益改为分类问题。
这样做在功能性上牺牲了些,换来了收益波动的减小,网络收敛难度降低。
补充:大家可以通过更改分类和输出层参数,使其降低到二元分类问题,进一步降低收益的波动,例如:小于8%和大于等于8%、处于3%-5%和不处于等。
股票预测相关代码
数据部分
与上一篇 相比,数据部分在输出时将股价替换成3种类型输出,输出的数据矩阵从1列改为了3列。
tensorflow 代码
数据部分
class get_stock_data():
"""
获得股票分类数据,用以深度学习。格式为按照时间顺序,由小到大排序的:
[开盘价, 最高价, 最低价, 收盘价,换手率,成交量, 流通市值, 真实收益, 日期]
真实收益定义:下一个交易日开盘买入,再下一个交易日开盘卖出所得到的收益,算法为 100 * (open_next_next / open_next - 1)。
> 如果真实收益的回归预测效果一般,可以再试试分类预测:真实收益>= n 和 <n 等
"""
def __init__(self,):
self.file_paths = {}
def get_train_test_data_softmax(self, batch_size, file_path, time_step = 60):
"""
将收益变成分类问题。分类定义在classify函数内,分别为:
0: <= 0%
1: (0%, 5%)
2: [5%, 以上)
"""
self_variable_name = "data_cur_{0}".format(file_path)
if self_variable_name in self.file_paths:
curs