上がるの? 下がるの? 二値分類 AIを使って日経平均株価の予測に挑戦 初めてのRNN編
前回の記事より、今後の課題を振り返る
前回は、初めてAIモデルを使用した二値分類に挑戦したものの、山勘レベルの結果に終わってしまいました。
このため、今後の課題として、二値分類の精度向上を挙げました。
この点に関して、アレコレ調べてみたところ、RNNと呼ばれる構造のAIモデルを使用するのが良いとの情報を見つけました。
RNNとは
RNNとは、Recurrent Neural Networkの頭文字を取ったものであり、過去の時系列データやシーケンシャルデータに基づいて未来の予測を行うことに適したAIモデルです。
ちなみに、Recurrentの意味には、「循環する」とか「回帰性の」というものがあります。
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モデルの構造図です。
これだけでも私には十分複雑でした。
そもそも、期待した通りに動作しているかどうかも不安なところがあります。
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向けに作成した学習データの基データを下記に示します。
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)
上記の基データから作成した学習データが下記となります。
これまでの経緯から、ラベル以外のベクトルデータには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による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用のプロジェクトファイル