ディープラーニングってやつで人生の不安をなんとかしたかった(できなかった)

概要

特に開発ネタが浮かばなかったのでみんな大好き株価予測やるよー(できなかったよー)

やったこと

75日間の終値推移を食べさせて、5営業日後の騰落率分類を出力することを試みます。
データは以下のサイトのものをお借りしました。
kabuoji3.com
以下のフォーマットのCSVに加工して食べさせます。

開始日,開始日終値,開始日+1日終値,...,開始日+74日終値,開始日+79日終値,騰落率,分類クラス

分類クラスはこんな感じで定義。

  • +2%以上: 0
  • +0%以上: 1
  • -2%以上: 2
  • それ以外: 3

銘柄は優待券を使いきれるかちょっと不安な9831を使用。(日用品にも使えるので、そのうち使い切ります)

コード

以下のサイトのものをほぼ写経させていただきました。
qiita.com

# coding: UTF-8

from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Activation
from tensorflow.python.keras.layers import LSTM
from tensorflow.python.keras.optimizers import Adam
from tensorflow.python.keras.callbacks import EarlyStopping
import numpy as np
import csv

import pprint

data_len = 75

def make_dataset():
    data, target = [], []

    with open('teacher.csv') as f:
        reader = csv.reader(f)
        for row in reader:
            data.append(row[1:1 + data_len])
            target.append(row[78])

    re_data = np.array(data).reshape(len(data), data_len, 1)
    re_targer = np.array(target).reshape(len(data), 1)

    return re_data, re_targer

#g -> 学習データ,h -> 学習ラベル
g, h = make_dataset()

# モデル構築

# 1つの学習データのStep数(今回は25)
length_of_sequence = g.shape[1] 
in_out_neurons = 1
n_hidden = 300

model = Sequential()
model.add(LSTM(n_hidden, batch_input_shape=(None, length_of_sequence, in_out_neurons), return_sequences=False))
model.add(Dense(in_out_neurons))
model.add(Activation("softplus"))
optimizer = Adam(lr=0.001)
model.compile(loss="mean_squared_error", optimizer=optimizer)

# 学習
early_stopping = EarlyStopping(monitor='val_loss', mode='auto', patience=20)
model.fit(g, h,
          batch_size=300,
          epochs=100,
          validation_split=0.1,
          callbacks=[early_stopping]
          )

# 確認
def check_dataset():
    data_cnt = 0

    with open('check.csv') as f:
        reader = csv.reader(f)
        for row in reader:
            data_cnt += 1
            data = np.reshape([row[1:1 + data_len]], (1, data_len, 1))
            predict = model.predict(data)[0][0]
            actual = row[78]
            print("predict: " + str(predict) + ", actual: " + str(actual))

check_dataset()

2018/1/4~2018/10/23を開始日とするデータを教師として、2019/3/25~2019/6/11を開始日とする確認用データを用いた結果

predict: 1.5422372, actual: 2
predict: 1.5422382, actual: 2
predict: 1.5422276, actual: 1
predict: 1.542234, actual: 2
predict: 1.5422267, actual: 1
predict: 1.5422276, actual: 2
predict: 1.5422314, actual: 2
predict: 1.5422349, actual: 3
predict: 1.5422267, actual: 3
predict: 1.542229, actual: 3
predict: 1.5422252, actual: 3
predict: 1.5422966, actual: 3
predict: 1.5422227, actual: 3
predict: 1.5432527, actual: 0
predict: 1.543247, actual: 0
predict: 1.5432377, actual: 0
predict: 1.5432113, actual: 0
predict: 1.5432373, actual: 0
predict: 1.5431979, actual: 0
predict: 1.5431927, actual: 0
predict: 1.5428239, actual: 0
predict: 1.5428268, actual: 0
predict: 1.54276, actual: 0
predict: 1.5422269, actual: 0
predict: 1.5422227, actual: 1
predict: 1.5422276, actual: 1
predict: 1.5422326, actual: 1
predict: 1.5422416, actual: 1
predict: 1.5422406, actual: 3
predict: 1.5422337, actual: 2
predict: 1.542229, actual: 1
predict: 1.542234, actual: 1
predict: 1.5422428, actual: 3
predict: 1.5422226, actual: 0
predict: 1.5422302, actual: 1
predict: 1.542234, actual: 0
predict: 1.5422337, actual: 0
predict: 1.5422302, actual: 0
predict: 1.5422382, actual: 0
predict: 1.5422406, actual: 0
predict: 1.5422584, actual: 1
predict: 1.542261, actual: 1
predict: 1.542267, actual: 1
predict: 1.54227, actual: 1
predict: 1.5422643, actual: 0
predict: 1.5422636, actual: 1
predict: 1.5422661, actual: 2
predict: 1.5422724, actual: 2
predict: 1.5422753, actual: 2
predict: 1.542273, actual: 3
predict: 1.5422715, actual: 3

ほぼ定数を出力する結果となりました。本当にありがとうございました。

考察とか

  • 実は以前も似たようなインプットで株価予測(分類ではなく)をやったのですが、そのときも定数を吐き出すだけの結果になってました。となると課題設定がよろしくないのでは?
  • このシチュエーションだと75日移動平均しか使えないので、トレンドライン、サポートライン、レジスタンスラインを一切考慮していないですし、また騰落率を出すのももっと先の営業日の方がいいかもしれないです。(スイングトレードを想定した課題ですが、5営業日はトレード期間としては短め? のような気もします)
  • まず これを 書いている人が 機械学習 何も分からない
  • そもそも含み損を手取りのnか月抱えているような人がやっているので根本的にチャートを見る目が課題設定をするに足るまで養われていないのでは🤔