近期股市行情牛转熊,大盘一直下探!由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