近期股市行情牛轉熊,大盤一直下探!由3200跌到了2700,想必不少人被深套了。這時想起人工智能可否預測股市趨勢?RNN可否起做用?python
這時便從網上找下教程,發現網上有個例子,便拿來一試!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
是將數據分紅幾部分。舉個例子就明白。假設有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()將變量重用。
spa
也可用with tf.variable_scope(‘scope_name’,reuse=True)來重用變量,在保存變量時,必須也要使用with tf.variable_scope(‘scope_name’)來命名變量空間。爲何須要重用?由於在載入以前保存訓練結果的變量時,須要有變量來存儲這此結果,在同一文件裏,以前的train()函數將結果保存在變量裏,這時沒法再使用變量。若是保存和載入不在同一個文件,則不存在這些問題。另外,用來接收載入數據的變量必需要和保存的一致!.net
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的例子。 rest