見出し画像

上がるの? 下がるの? 二値分類 AIを使って日経平均株価の予測に挑戦 初めてのRNN編


前回の記事より、今後の課題を振り返る

前回は、初めてAIモデルを使用した二値分類に挑戦したものの、山勘レベルの結果に終わってしまいました。

このため、今後の課題として、二値分類の精度向上を挙げました。

この点に関して、アレコレ調べてみたところ、RNNと呼ばれる構造のAIモデルを使用するのが良いとの情報を見つけました。

RNNとは

RNNとは、Recurrent Neural Networkの頭文字を取ったものであり、過去の時系列データやシーケンシャルデータに基づいて未来の予測を行うことに適したAIモデルです。

ちなみに、Recurrentの意味には、「循環する」とか「回帰性の」というものがあります。

RNNの構造図を下記に記載します。

RNN 構成図
RNNの構造図

これまで私が行ってきたAIモデルによる日経平均株価の予測は、時間$${t}$$における入力データ$${x_{t}}$$に対して、出力データ$${y_{t}}$$が出力される構造でした。

こうしたAIモデルの構造をFeedforward Neural Networkと呼ぶそうです。

一方で、RNNは、上図のように時間$${t}$$における中間層の出力が時間$${t+1}$$の中間層に入力される構造となっています。

これにより、過去のデータによる結果を現在に反映させることが可能となります。

株価の予測にはRNNが適している

改めて、SONYのYouTubeチャンネル「Neural Network Console」に投稿されている動画を視聴しました。

その中に、「Deep Learning入門:Recurrent Neural Networksとは?」という動画があります(下記の動画です)。

この動画の5分0秒辺りには、RNNで実現可能な機能の一つとして株価の予測が挙げられています。

また、この動画の3分25秒辺りの資料によると、RNNには複数の種類が存在します。

  • RNNの種類

    • Many to One(入力が複数で出力が1つ)

    • One to Many(入力が1つで出力が複数)

    • Many to Many(1)(入力も出力も複数)

    • Many to Many(2)(入力も出力も複数)

私がやりたいことは、ローソク足の時系列データから翌営業日の株価が上がるのか、下がるのかを予測する二値分類です。

このため、Many to Oneの構造となります。

さらに、この動画の6分5秒辺りでは、シンプルなRNNでは実用的な性能を得ることは難しいと紹介されています。

実用的な性能を得るためには、RNNの一部であるLSTM(Long Short Term Memory)の構造を用いるのが良いとのことです。

ということなので、LSTM(Long Short Term Memory)に関する動画を視聴しました(下記の動画です)。

動画のタイトルは、「Deep Learning入門:数式なしで理解するLSTM (Long short-term memory)」です。

何となくLSTMを理解することはできたのですが、私にはちょっと複雑だと感じる点もあります。

そこで、今回はこの動画で紹介されていたシンプルな構造のRNNであるElman Netを使うことにしました。

AIモデルに使用したRNN Elman Netの構造図

下記が、今回作成したRNN Elman NetによるAIモデルの構造図です。

RNN Elman Net AIモデル 構造図
RNN Elman NetによるAIモデルの構造図

これだけでも私には十分複雑でした。

そもそも、期待した通りに動作しているかどうかも不安なところがあります。

Neural Network ConsoleでRNNを構成する場合は、お約束として中間層をRecurrentInputとRecurrentOutputで挟む必要があります。

そして、中間層の処理をN回行う場合は、InputにN回分のデータを一括で入力する必要があります。

つまり、Inputに一括で入力されたN回分のデータは、RecurrentInputでN分割されます。

N分割された入力データのそれぞれに対して、RecurrentInputとRecurrentOutputに挟まれた中間層の処理を1回ずつ行います。

中間層で処理されたデータは、Delayに送られるとともに、RecurrentOutputに溜まっていきます。

中間層の処理がN回行われると、N回分の入力データに対するAIモデルの処理が完了し、RecurrentOutputに保持されます。

今度は、SliceでRecurrentOutputに保持されたN回分の処理データを1つずつ切り出していきます。

そして、Sliceで切り出された処理後のデータに対して二値分類します。

今回私が作成したAIモデルは、2回分の入力データを1つにまとめてInputに入力し、中間層の処理は2回実施させています。

学習データと評価データの作成方法

今回のRNN Elman Net向けに作成した学習データの基データを下記に示します。

RNN Elman Net 学習データ 基データ
RNN Elman Net向け学習データの基データ

A~G列が$${T_m}$$のベクトルデータ、H~N列が$${T_{m+1}}$$のベクトルデータです。

各ベクトルの値は、下記の通りです。

  • 各ベクトルの値

    • A, H列: 終値

    • B, I列:  始値

    • C, J列: 高値

    • D, K列: 安値

    • E, L列: 5日移動平均

    • F, M列: 25日移動平均

    • G, N列: 75日移動平均

    • O~Q列: ラベル

各ラベルの算出方法は下記の通りです。

  • 各ラベルの算出方法

    • セルO2: IF(A3<=A4, 1, 0)

    • セルP2: IF(A4<A3, 1, 0)

    • セルQ2: LOG(BIN2DEC(CONCAT(O2:P2)), 2)

上記の基データから作成した学習データが下記となります。

RNN Elman Net 学習データ
RNN Elman Net向け学習データ

これまでの経緯から、ラベル以外のベクトルデータにはMin-Max正規化を行っています。

ちなみに、セルO1の「y:label;D;U」の意味ですが、下記の通りです。

  • 「y:label;D;U」の意味

    • y: ラベル名

    • label: ラベルに対するコメント

    • D: y=0の論理的な意味、Down(株価下落)の頭文字

    • U: y=1の論理的な意味、Up(株価上昇)の頭文字

ラベルのフォーマットを調べたところ、コメント以降は、製作者のメモ用に使えるようです。

AIモデルの学習および評価を実行

上記のAIモデルを学習させた際の学習曲線を下記に示します。

RNN Elman Net 二値分類 学習曲線
RNN Elman NetのAIモデルによる二値分類の学習曲線

RNN Elman NetによるAIモデルを使用しても、学習曲線はほぼ平行となっています。

以下に、評価結果の混同行列を示します。

RNN Elman Net 二値分類 混同行列
RNN Elman NetのAIモデルによる二値分類の混同行列

y'__0の列が全てゼロとなっています。

今回もAccuracyが53.84%ですので、山勘レベルの結果となってしまいました。

今後の課題

次は、LSTMに挑戦します。

AIモデルのデータについて

今回作成したAIモデルのデータは、Googleドライブにて共有しています。

URL: https://drive.google.com/drive/folders/1sYDLxhPH5tpwcpvagvmc3B0tRl5GaORX?usp=drive_link

  • N225_ElmanNet_1.sdcproj

    • Neural Network Console用のプロジェクトファイル


この記事が気に入ったらサポートをしてみませんか?