ディープラーニングで株価を予測する

参考論文

ディープラーニングで株価の予測できないかなと思っていたところ、下記の論文を見つけました。
Using Deep Learning Neural Networks and Candlestick Chart Representation to Predict Stock Market
内容はかなり簡単でディープラーニングの構造もかなり単純なものだったので、試してみました。

概要

内容としては、ロウソク足チャートの画像を入力として、ディープラーニングで株価が上がるか、
下がるかを予測するというものです。
ロウソク足チャート自体の保存自体は前の記事で既に出来ています。
www.oki-lab.net

プログラム

kerasで実装したのが下記のプログラムです。
Jupyter Notebookで試行錯誤的に作ったものを貼り付けているので、
色んな所でライブラリをimportしていますが気にしないでください。
なお、画像サイズが64x64となっていたり、出力の活性化関数がSoftmaxになっていて
論文と違いますが、こっちのほうが結果が良かったのでそうしています。

import cv2
import sys
import os.path
import glob
import numpy as np

img_size = 64
out_num = 2

paths=glob.glob("train_img/*")
img_num=len(paths)

train_x = np.zeros((img_num, img_size, img_size, 3))

cnt=0
for path in paths:
    image=cv2.imread(path)/255.0
    image=cv2.resize(image, (img_size, img_size))
    train_x[cnt,:]=image
    cnt+=1

from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Dense
from keras.layers import Input, Dropout, Flatten, Softmax
from keras.models import Model
from keras.optimizers import Adam

inputs=Input((img_size, img_size,3))

x = Conv2D(32, (2, 2), padding='same', activation='relu')(inputs)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(48, (2, 2), padding='same', activation='relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.5)(x)

x = Conv2D(64, (2, 2), padding='same', activation='relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Conv2D(96, (2, 2), padding='same', activation='relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.5)(x)

x = Flatten()(x)
x = Dense(256)(x)
x = Dropout(0.5)(x)
x = Dense(512)(x)

#outputs = Dense(out_num)(x)
x = Dense(out_num)(x)
outputs = Softmax()(x)

model=Model(input=inputs, output=outputs)

from keras.utils import np_utils
train_y = np_utils.to_categorical(np.loadtxt("output.csv"))

model.compile(loss = "categorical_crossentropy", optimizer = Adam(lr=1e-3), metrics = ["accuracy"])

batch_size=64
epoch_num=100

history = model.fit(train_x, train_y, batch_size = batch_size, epochs = epoch_num)

学習に使う画像はtrain_imgというフォルダに保存されているとして、それを読み込んで
入力データとしてしています。更に、csvファイルには上がるか下がるかを0と1で保存しておいて、
出力データとして使います。入力画像は下記のような感じです。

f:id:oki-lab:20191201193207p:plain

学習結果

上記のプログラムで学習した結果が下記のとおりです。学習したデータに対して67%の精度です。
学習回数を増やすとどんどん上がっていきますが、過学習になるのでこれくらいでやめています。
f:id:oki-lab:20191201193734p:plain

そして、学習に使っていないテストデータに対して試した結果が下記のとおりです。
55%なのでランダムよりは少しマシかなと言う程度でした。
論文では90%くらいの精度なので、全然違う結果です。
f:id:oki-lab:20191201194142p:plain

所感

正直、株価や為替をディープラーニングで予測しようというのはみんなやろうとしていますが、
流石にこんな単純な方法では無理なんじゃないかと実装前から思っていました。
案の定な結果だったので、そんな楽して儲けるのは無理ですね。