实测 《Tensorflow实例:利用LSTM预测股票每日最高价(二)》的结果

        近期股市行情牛转熊,大盘一直下探!由3200跌到了2700,想必很多人被深套了。这时想起人工智能能否预测股市趋势?RNN能否起作用?

  这时便从网上找下教程,发现网上有个例子,便拿来一试!Tensorflow实例:利用LSTM预测股票每日最高价(二)

  这个实例大体上没有大问题,只是有些小细节有问题!要想直接复制运行,是会报错的。首先整下代码过程原作者已经写得很清楚了,但对于初学者来讲,有些地方还是不太明白的。我作为一个初学者,先来谈谈我在整个实测中的收获吧!

  实例的思路:通过tushare可以获取股票数据,

import tushare as ts
hist = ts.get_hist_data('600804')
hist.to_csv('f:/py/data/stock-1.csv')

然后用pandas进行数据整理,实例中的代码已经有说明了,这里就不再重复。在整例子中,最重要的还是要清楚数据的shape。

在生成训练集和测试集数据时,样本数(batch_size)、时间步(time_step)和(input_size)构成了RNN神经网络的输入数据的shape=[batch_size,time_step,input_size]。我想重点说说这三个参数代表的意思。input_size是数据中最低价、最高价、开盘价、收盘价、交易量、交易额、跌涨幅等因素,共7个;time_step=20,是连续的20条数据。batch_size是将数据分成几部分。举个例子就明白。假设有100天的数据,把第1天到至第20天的数据合在一起作为一条数据,第2天到第21天的数据合在一起作为第2条数据,第3天到第22天的数据合在一起作为第3条数据……如此类推!那么经过这样的处理后,就有100-20+1=81条数据。每条数据里有20天的记录,每天的记录里又有7个数据,那么shape=[81*20*7]。为什么要这样处理?也许是考虑到数据的连续性吧。

对比训练方法和测试方法,都有lstm()方法,当prediction()函数里再次运行lstm()方法时,需要在lstm()方法前通过tf.get_variable_scope().reuse_variables()将变量重用。

也可用with tf.variable_scope(‘scope_name’,reuse=True)来重用变量,在保存变量时,必须也要使用with tf.variable_scope(‘scope_name’)来命名变量空间。为什么需要重用?因为在载入之前保存训练结果的变量时,需要有变量来存储这此结果,在同一文件里,之前的train()函数将结果保存在变量里,这时无法再使用变量。如果保存和载入不在同一个文件,则不存在这些问题。另外,用来接收载入数据的变量必须要和保存的一致!

def prediction(time_step=20):
    X = tf.placeholder(tf.float32, shape=[None,time_step,input_size])
    #Y=tf.placeholder(tf.float32, shape=[None,time_step,1])
    mean,std,test_x,test_y=get_test_data()
    tf.get_variable_scope().reuse_variables()         # 变量重用
    pred,_=lstm(X)
    saver = tf.train.Saver(tf.global_variables())
    with tf.Session() as sess:
        #参数恢复

        #saver = tf.train.import_meta_graph('f:/py/data/stock2.model-1800.meta')
        saver.restore(sess, './Model/stock.ckpt-100')
        test_predict=[]
        for step in range(len(test_x)-1):
            prob=sess.run(pred,feed_dict={X:[test_x[step]]})
            predict=prob.reshape((-1))
            test_predict.extend(predict)
        test_y=np.array(test_y)*std[7]+mean[7]
        test_predict=np.array(test_predict)*std[7]+mean[7]
        acc=np.average(np.abs(test_predict-test_y[:len(test_predict)])/test_y[:len(test_predict)])  #偏差
        print(test_predict)
        print(test_y)
        #以折线图表示结果
        plt.figure()
        plt.plot(list(range(len(test_predict))), test_predict, color='b')
        plt.plot(list(range(len(test_y))), test_y,  color='r')
        plt.show()

最后总结一下整个实测结果,代码能完全运行,但并不能预测。因为股市并不仅仅是因为几个价格就能预测出来的。这仅仅是个学习RNN的例子。

posted @ 2018-07-07 18:07  xinghun85  阅读(813)  评论(0编辑  收藏  举报