この記事では、AIを作ってみよう:株価予測(1/4) に続き、AIを実際に作っていきます。
まだパソコンの準備ができてない人は、こちらから読んでください。 AIを作ってみよう:環境の準備から
プログラムのコピペ
それでは、AIを作っていきましょう。
プログラムとデータはそれぞれ2つに分かれています。学習用と予測用です。
下のプログラムをコピーして、自分のPCのデスクトップへファイルとして保存してください。Pythonプログラムは通常 .py という拡張子を付けます。
コピペについてもう少し詳しい手順はこちら。
- 下のプログラム(データ)をマウスでなぞって全部選択します。
- 右クリック→コピーを実行します。
- メモ帳を開いて、右クリック→ペーストを実行します。
- メモ帳のファイル→保存を実行します。
- 場所はデスクトップとし、ファイル名に一番上に書かれた名前(stock_rnn_gakusyu.pyなど)を書いて保存します。
- これを4ファイル分繰り返します。
学習用プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import numpy as np import pandas as pd from sklearn import preprocessing from keras.models import Sequential from keras.layers import InputLayer from keras.layers.recurrent import SimpleRNN from keras.layers.core import Dense, Activation IN_NODES = 10 # length of input data HIDDEN_NODES = 20 # number of hidden nodes OUT_NODES = 1 # length of output data BATCH_SIZE = 10 # number of train data in a group EPOCH = 20 # times of train MODELFILE = 'model_rnn_nikkei.hdf5' TRAINDATA = 'nikkei_gakusyu_data.csv' # data load data = None data = pd.read_csv(TRAINDATA) data.columns = ['date','openprice','highprice','lowprice','closeprice'] data['date'] = pd.to_datetime(data['date'], format='%Y-%m-%d') # hyojunka & reduce data data['closeprice'] = preprocessing.scale(data['closeprice']) data = data.sort_values(by='date') data = data.reset_index(drop=True) data = data.loc[:, ['closeprice']] # dataset input10 to result1 feature, label = [], [] for i in range(len(data) - IN_NODES): feature.append(data.iloc[i:(i+IN_NODES)].as_matrix()) # data = [[1-10],[2-11], ... label.append(data.iloc[i+IN_NODES].as_matrix()) # label = [11, 12, ... feature_train = np.array(feature) label_train = np.array(label) # build RNN model model = Sequential() model.add(InputLayer(batch_input_shape=(None, IN_NODES, OUT_NODES))) model.add(SimpleRNN(units=HIDDEN_NODES, return_sequences=False)) model.add(Dense(OUT_NODES)) model.add(Activation("linear")) model.compile(loss="mean_squared_error", optimizer="adam") # train model.fit(feature_train, label_train, batch_size=BATCH_SIZE, epochs=EPOCH) print('Train done.') model.save_weights(MODELFILE) print('Train saved.') |
予測用プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import numpy import pandas from sklearn.preprocessing import StandardScaler from keras.models import Sequential from keras.layers import InputLayer from keras.layers.recurrent import SimpleRNN from keras.layers.core import Dense, Activation IN_NODES = 10 # length of input data HIDDEN_NODES = 20 # number of hidden nodes OUT_NODES = 1 # length of output data MODELFILE = 'model_rnn_nikkei.hdf5' TESTDATA = 'nikkei_yosoku_data.csv' # data load data = None data = pandas.read_csv(TESTDATA) data.columns = ['date','openprice','highprice','lowprice','closeprice'] data['date'] = pandas.to_datetime(data['date'], format='%Y-%m-%d') # hyojunka & reduce data scaler = StandardScaler() datatmp = data['closeprice'].values.reshape(-1,1) # need values data['closeprice'] = scaler.fit_transform(datatmp) data = data.sort_values(by='date') data = data.reset_index(drop=True) data = data.loc[:, ['closeprice']] feature_test = data['closeprice'].values.reshape(-1,10,1) # need values # build RNN model model = Sequential() model.add(InputLayer(batch_input_shape=(None, IN_NODES, OUT_NODES))) model.add(SimpleRNN(units=HIDDEN_NODES, return_sequences=False)) model.add(Dense(OUT_NODES)) model.add(Activation("linear")) model.compile(loss="mean_squared_error", optimizer="adam") # load model model.load_weights(MODELFILE) print('Train loaded.') # predict predicted = model.predict(feature_test) # 1 output predicted = scaler.inverse_transform(predicted) # inverse hyoujunka result feature_test = scaler.inverse_transform(feature_test) # inverse hyoujunka indata print('Last day = ' + str(feature_test[-1,-1,-1])) print('Next day = ' + str(predicted)) |
学習用データ
学習用データは行数が多いので、下をクリックしてダウンロードしてください。 学習用データのダウンロード
予測用データ
1 2 3 4 5 6 7 8 9 10 11 |
Date,Open,High,Low,Close 2019/2/15,21051.50977,21051.50977,20853.33008,20900.63086 2019/2/18,21217.32031,21306.35938,21189.9707,21281.84961 2019/2/19,21256.58008,21344.16992,21217.16016,21302.65039 2019/2/20,21346.03906,21494.84961,21315.39063,21431.49023 2019/2/21,21422.31055,21553.34961,21318.74023,21464.23047 2019/2/22,21376.35938,21451.23047,21348.66992,21425.50977 2019/2/25,21567.66016,21590.0293,21505.07031,21528.23047 2019/2/26,21556.01953,21610.88086,21405.83984,21449.39063 2019/2/27,21504.60938,21578.81055,21492.65039,21556.50977 2019/2/28,21536.55078,21536.55078,21364.08984,21385.16016 |
保存できたでしょうか。
このプログラムの詳しい解説は次の記事に書きます。できるだけ簡単な解説にしましたので、後で初心者の人も見てみてください。
実行
プログラムとデータの計4ファイルが保存できたら、下記のように実行します。
- コマンド入力ウィンドウを開きます。
Windowsの場合:スタートボタンを押す → メニューが出たらそのまま「cmd」と打ち「Enter」。
Macintoshの場合:「ターミナル」を実行します。 - 3ファイルを保存した場所に移動します。デスクトップであれば
Win,Macどちらも「cd desktop」と打ち「Enter」です。 - AIの学習を実行します。
「python stock_rnn_gakusyu.py」と打ち「Enter」。 - 3分~5分待つと学習が終わり、同じフォルダに「model_rnn_nikkei.hdf5」というファイルができます。これはAIの脳にあたるもので、学習で分かったデータの傾向が数値になって記録されています。
- 次に予測を実行します。下記のように打って1分~3分待ちます。ここでは上記の脳みそと予測データを読み込んで、翌日を予測しています。
「python stock_rnn_yosoku.py」 - 「New day= [〇〇〇〇]」と表示されたものが結果です。2019/03/01 の日経平均株価が予測されています。
現実の正解は「21602」円 なのですが、AIはこれに近い数字を出したでしょうか。
いかがでしたか。
プログラムが思ったより簡単だと思いませんか。
これはKerasというライブラリを使っているからで、ディープラーニングの原理が既にプログラミングされているのです。
予測はさほど正確ではなかったかもしれません。プログラムもデータも簡単に作ったからです。より正確なAIにするには、データ項目やデータ量を増やしたり他の工夫を考えたりといったことが必要になってきます。そしてデータを増やすほど学習時間が増えます。ディープラーニングの学習時間は数時間~数日を覚悟することもあります。
また、RNNのような時系列学習より、教師あり学習が適するかもしれません(筆者はどちらも試しましたが結果はケースバイケースでした)
このようにモデルの選択とデータの組み合わせを試行錯誤しているとAIが楽しくなってきます。
さて、次の記事では、ここで使ったプログラムやデータの解説をしていきます。