實測 《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
]。我想重點說說這三個參數代表的意思。
是數據中最低價、最高價、開盤價、收盤價、交易量、交易額、跌漲幅等因素,共7個;time_step=20,是連續的20條數據。input_size
batch_size
第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預測股票每日最高價(二)》的結果