近期股市行情牛转熊,大盘一直下探!由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
是将数据分成几部分。举个例子就明白。假设有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的例子。