中頻度取引botの作成④

機械学習を用いて板情報のプロットからn秒後の価格の騰落を予想する

下記の記事で分類した価格のプロットを機械学習にかけて、板情報のプロットからn秒後の価格の騰落を予測出来るか検討する。

xpppp.hatenablog.com

機械学習については、下記の資料を参考にした ディープラーニングで近藤春菜、角野卓三、マイケルムーアを判別する(Kerasで画像分類)

import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Dense, Dropout, Activation, Flatten
import numpy as np
from sklearn.model_selection import train_test_split
from PIL import Image
import glob

folder = ['up','down']
image_size_X = 432
image_size_X = 288

# 画像の読み込み、リサイズ、ndarrayへの格納 
X = []
Y = []
for index, name in enumerate(folder):
    dir = 'keras_image/' + name
    files = glob.glob(dir + '/*.png')
    for i, file in enumerate(files):
        image = Image.open(file)
        image = image.convert('RGB')
        image = image.resize((image_size_X, image_size_Y))
        data = np.asarray(image)
        X.append(data)
        Y.append(index)
 
X = np.array(X)
Y = np.array(Y)

# RGBデータの正規化
X = X.astype('float32')
X = X / 255.0

# 正解ラベルの形式を変換
Y = np_utils.to_categorical(Y, 3)

# 訓練データとテストデータの分配(2割をテストデータへ)  
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.20)

# CNNのパラメータ設定
model = Sequential()
 
model.add(Conv2D(32, (3, 3), padding='same',input_shape=X_train.shape[1:])) # レイヤー1  
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3))) # レイヤー2  
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
 
model.add(Conv2D(64, (3, 3), padding='same'))  # レイヤー3  
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))   # レイヤー4  
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
 
model.add(Flatten())   # レイヤー5
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))   # レイヤー6  
model.add(Activation('softmax'))
 
# コンパイル
model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy'])

#訓練
model.fit(X_train, Y_train,batch_size=32, epochs=100)

#評価 & 評価結果出力
score = model.evaluate(X_test, Y_test)
print('loss=',score[0])
print('accuracy=',score[1])

https://github.com/PP-lib/Bot_materials/blob/master/Keras_practice.ipynb

結果

Epoch 98/100
388/388 [==============================] - 8s 21ms/step - loss: 0.2662 - acc: 0.9253
Epoch 99/100
388/388 [==============================] - 8s 21ms/step - loss: 0.1183 - acc: 0.9691
Epoch 100/100
388/388 [==============================] - 8s 21ms/step - loss: 0.1044 - acc: 0.9665
98/98 [==============================] - 1s 11ms/step
loss= 2.002868954016238
accuracy= 0.5

認識率が50%という事で全く予想できていないという結果だった。

考察

今回は1秒間の板情報から1秒後の価格を予想した。
結果としては次回は、板情報の期間と認識率の依存性について検討する。