4日目でざっくりお話した内容についてもう少し深堀していこうと思います!
翌日株価の終値予想
この数日間挑戦していたのは,翌日の終値予想です終値って?
「未来のデータがわかれば苦労しないんじゃないか?」なんて安直な理由でやってみた次第です。
挫折とTFLearnとの出会い
RNNはじめたものの,公式Tensorflowって初心者ふるいにかけているんじゃないかってくらい解説が少ない…:Dカスタマイズ性が高いといえば聞こえはいいけども,私には
無理\(^q^)/
そんなとき出会ったのがTFLearn
テンソルフローより,ずっとはやい!
tflearn.orgTFlearn is a modular and transparent deep learning library built on top of Tensorflow. It was designed to provide a higher-level API to TensorFlow in order to facilitate and speed-up experimentations, while remaining fully transparent and compatible with it.
…使いやすいから手早く実装できるよ!ってことだろう(適当)
以下のサイトで知り,今回書いたソースコードもそこをもとに書いています
deepage.net
独自解釈でアレンジ加えたりいじったりしているので,ここはおかしいなどの指摘をいただけると幸いです(Pythonも始めてかなり日が浅いです…)
#tflearn_mysample.py import pandas as pd import numpy as np import tensorflow as tf import tflearn import matplotlib.pyplot as plt tf.python.control_flow_ops = tf #CSVデータのインポート def import_data(data_csv): dataframe = pd.read_csv(data_csv,engine='python') return dataframe #訓練データの生成 def create_traindata(dataset, history, future): X,Y = [], [] for i in range(history, len(dataset) - future, 1): X.append(dataset[i - history: i]) Y.append(dataset[i - history + future]) X = np.reshape(np.array(X), [-1, history, 1]) Y = np.reshape(np.array(Y), [-1, 1]) return X, Y #テストデータの生成 def create_testdata(dataset, history): X = [] for i in range(history, len(dataset), 1): X.append(dataset[i - history: i]) X = np.reshape(np.array(X), [-1, history, 1]) return X if __name__=='__main__': #訓練・テストデータの読み込み traindata = import_data('train.csv')['Close'].values testdata = import_data('test.csv')['Close'].values #モデルの生成 steps_of_history = 1; #いくつ前のデータまでを学習に用いるか steps_in_future = 1; #いくつ先のデータを予測するか trainX, trainY = create_traindata(traindata , steps_of_history, steps_in_future) testX = create_testdata(testdata, steps_of_history) #ネットワーク形成 net = tflearn.input_data(shape=[None, steps_of_history, 1]) #LSTMだと時間がかかるのでGRUを用いています #活性化関数にはReLUを用いています(あまり深く考えていません) net = tflearn.gru(net, n_units=150, activation='relu',return_seq=True) net = tflearn.gru(net, n_units=150, activation='relu') net = tflearn.fully_connected(net, 1, activation='linear') # Mape関数は標準では含まれていないので # ~/anaconda3/envs/tensorflow/lib/python3.5/site-packages/tflearn/objectives.py # を開き一番下に # def mape(y_pred,y_true): # return tf.reduce_mean(tf.abs((y_true-y_pred)/ y_true)) * 100 # を追加してください net = tflearn.regression(net, optimizer='adam', learning_rate=0.001, loss='mape') #上記の設定で学習してモデルを作ります #tensorboard_verbose: 0とか1とか変えるとTensorBoardで表示できる結果が増えます。 #学習スピード優先ならば,0推奨 model = tflearn.DNN(net, tensorboard_verbose=0) model.fit(trainX, trainY, validation_set=0.1, batch_size=50, n_epoch=3) #後で読み込める用に保存しておきます model.save("model.tfl") #学習したモデルで訓練データの予測を試みます train_predict = np.array(model.predict(trainX)) #予測したい先分データがずれるので適当に0かなんか入れてます #(現在のデータを元に1つ先の未来を予測したならば,予測値に現在値は含まれない) train_predict_plot = np.vstack((np.zeros([steps_in_future,1]),train_predict)) #学習したモデルでテストデータの予測を試みます test_predict = np.array(model.predict(testX)) test_predict_plot = np.vstack((np.zeros([steps_in_future,1]),test_predict)) #訓練データの予測結果 plt.figure(figsize=(10, 10)) plt.title('History={} Future={}'.format(steps_of_history, steps_in_future)) plt.plot(traindata, label = "実際のデータ", color = "black") plt.plot(train_predict_plot,label = "実際のデータ", color = "green") plt.xlim(0, len(traindata)) plt.ylim(0, np.max(traindata)) plt.savefig('train.png') #テストデータの予測結果 plt.figure(figsize=(10, 10)) plt.title('History={} Future={}'.format(steps_of_history, steps_in_future)) plt.plot(testdata, label = "実際のデータ", color = "black") plt.plot(test_predict_plot,label = "実際のデータ", color = "green") plt.xlim(0, len(testdata)) plt.ylim(0, np.max(testdata)) plt.savefig('test.png') #学習した結果をCSVで保存しています tes = pd.DataFrame(test_predict); tes.to_csv('ans.csv');
・学習には,日経平均株価 1985~2015年
・テストには,日経平均株価 2016年
を用いています
オリジナルと訓練データの予測(黒:元データ 緑:予測値)
オリジナルと入力値からの予測(黒:元データ 緑:予測値)
RNNのその性質上,やっぱりトレンドを追いかけてしまうというか遅延が生じてしまいますね
ぱっと見あっているようでも,200円とか実はずれているのでこんなんで株買ったらやばいですね(^ν^)