戯言日記

ホロレンジャーの戦いの記録

最弱SEでも機械学習でお金が稼ぎたい【5日目・TFLearnとの出会い】

dhero.hatenablog.com

4日目でざっくりお話した内容についてもう少し深堀していこうと思います!

翌日株価の終値予想

この数日間挑戦していたのは,翌日の終値予想です

終値って?

取引時間の最後についた値段。引け値があればその値段、引け値がなければザラ場で最後についた値段。

「未来のデータがわかれば苦労しないんじゃないか?」なんて安直な理由でやってみた次第です。

挫折とTFLearnとの出会い

RNNはじめたものの,公式Tensorflowって初心者ふるいにかけているんじゃないかってくらい解説が少ない…:D
カスタマイズ性が高いといえば聞こえはいいけども,私には



無理\(^q^)/



そんなとき出会ったのがTFLearn

テンソルフローより,ずっとはやい!

tflearn.org

TFlearn 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年
を用いています

オリジナルと訓練データの予測(黒:元データ 緑:予測値)
f:id:haikage1755:20161202233213p:plain

オリジナルと入力値からの予測(黒:元データ 緑:予測値)
f:id:haikage1755:20161202233211p:plain

RNNのその性質上,やっぱりトレンドを追いかけてしまうというか遅延が生じてしまいますね
ぱっと見あっているようでも,200円とか実はずれているのでこんなんで株買ったらやばいですね(^ν^)


クリックしてもらえるととっても嬉しいです(/・ω・)/
にほんブログ村 IT技術ブログ IT技術情報へ

[研究者になりたかった青二才の戯言日記]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」