1. 程式人生 > >實測 《Tensorflow實例:利用LSTM預測股票每日最高價(二)》的結果

實測 《Tensorflow實例:利用LSTM預測股票每日最高價(二)》的結果

直接 batch Language name 開盤 num 完全 tor 運行

近期股市行情牛轉熊,大盤一直下探!由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的例子。

實測 《Tensorflow實例:利用LSTM預測股票每日最高價(二)》的結果