![見出し画像](https://assets.st-note.com/production/uploads/images/130083441/rectangle_large_type_2_9f295202860ad108053b07eb6552c80d.jpeg?width=1200)
失敗? 成功? AIを使って日経平均株価の予測に挑戦 プロローグ編
自分で作成したAIが売買可能な時代に
世間で何かと話題なのがAI(Artificial Intelligence: 人工知能)です。
以前読んだ新井 紀子氏の著書『AI vs. 教科書が読めない子どもたち』では、AIを「人工知能」ではなく、「人工知能技術」と呼ぶのが正しいと紹介されていました。
AIは、現状、知能のレベルにはないということです。
ChatGPTのニュースを見ると、AIはもはや知能のレベルにあるようにも見えます。
しかし、ChatGPTは論理的な思考は行っていませんので、AIは「人工知能技術」なのです。
ところで、ChatGPTをリリースしたOpenAIは、同社の技術をもとにカスタマイズしたAIモデルを開発者が販売できる「GPTストア」を開設しました。
現状、「GPTストア」を利用できるのは、ChatGPTの有料サービス利用者に限られています。
しかし、作成されたAIが売買可能になったことに私は衝撃を受けました。
お試しで良いからAIを作ってみたい
AIを取り巻く環境が日々変わっていく中で、私も、とりあえずAIを作ってみたいと感じるようになりました。
私は、個人投資家でもありますから、どうせなら株価を予測するAIが良いと考えました。
そこで、インターネットでアレコレ調べたところ、私にも出来そうなことが分かりました。
参考にしたのは、「ソニーの開発者ポータル」です。
「ソニーの開発者ポータル」によると、お試しAI作成の基本的な流れは、下記の通りです。
お試しAI作成の基本的な流れ
データを収集する
AIを学習させるためのデータを収集する
モデルを作って学習させる
人間の「脳」に相当するモデルを作成し、データを学習させる
AIが正しく機能するかチェックする
学習通りにAIが機能するかを確認する
モデルの作成は、ソニーが提供している「Neural Network Console」を使用します。
Neural Network Consoleには、クラウド版とWindows版があります。
どちらも無料で使用することができますが、クラウド版は、学習・評価実行時間が2時間まで、プロジェクト数が10個まで、等の制約があります。
一方で、Windows版には特に制約がないため、私は、Windowsをダウンロードして使用することにしました。
Windows版のNeural Network Consoleをダウンロードする人は、上記のNeural Network Consoleのウェブサイトにアクセスし、一番下までスクロールして「Windows版」をクリックしてください。
また、Windows版のNeural Network Consoleを使用するには、別途、Visual Studio 2015 Visual C++の再頒布パッケージが必要になります。
Visual Studio 2015 Visual C++の再頒布パッケージは、Microsoftのウェブサイトから無料でダウンロードできます。
ちなみに、Neural Network Consoleを使用するには、アカウントの登録が必要となります。
Neural Network Console専用のアカウントを登録する以外に、Googleアカウントによる登録も可能です。
日経平均株価を予測するAI向けに学習データと評価データを用意する
はじめに、学習データと評価データについて説明します。
学習データと評価データについて
学習データとは、AIモデルを設計者が期待する動作となるように教育するためのデータである
評価データとは、学習済みAIモデルが設計者の期待する動作をするか否かを評価するためのデータである
AIに日経平均株価の予測をさせるには、AIに日経平均株価のこれまでの推移を勉強させるのが良いと思われます。
このため、日経平均株価の過去データをダウンロードすることにしました。
日経平均株価の過去データを無料でダウンロードする方法は、幾つかあります。
とは言え、無料で簡単に過去20年分程度のデータをダウンロードする方法で、かつ、私が知っているものは下記となります。
日経平均株価の過去データを無料で簡単にダウンロードする方法
SBI証券が提供しているHYPER SBI 2からダウンロード
Investing.comのウェブサイトからダウンロード
私は、SBI証券に口座を開設しているため、HYPER SBI 2が使用可能です。
他の証券会社に口座を開設している人は、その証券会社のサービスを調べてみると良いと思います。
私は(口座を開設していないので)未確認ですが、楽天証券でも過去データのダウンロードが可能であるとの情報を見たことがあります。
Investing.comのウェブサイトから過去データをダウンロードする方法
Investing.comのウェブサイトから過去データをダウンロードする場合は、下記のいずれかの方法でログインする必要があります。
Investing.comにログインする方法
Googleアカウントを使用
Facebookアカウントを使用
E-Mailアドレスを使用
私は、何かと便利なGoogleアカウントを使用してログインしています。
さて、Investing.comで日経平均株価の過去データをダウンロードする方法ですが、下記の通りです。
Investing.comで日経平均株価の過去データをダウンロードする方法
ウェブサイトの左上にある「マーケット」にマウスカーソルを合わせる
続いて「指数」にマウスカーソルを合わせる
さらに「日本の株価指数」を左クリックする
「日本の株価指数」一覧が表示された中にある「日経平均株価」を左クリックする
日経平均株価の現在の価格が表示されている下に「一般」のタブがあり、その中の「過去のデータ」を左クリックする
時間枠を日足を意味する「Daily」とし、ダウンロードする期間を設定した後に「データをダウンロードする」を左クリックする
上記の手順で、日経平均株価の日足チャートに関するデータをcsv形式でダウンロードすることができます。
過去データをAI向け学習データおよび評価データに加工する
Investing.comでダウンロードした過去データの内容は、下記の通りです。
![Investing.com ダウンロード 過去データ](https://assets.st-note.com/img/1707104581416-Kq7RCJEalY.png)
上記の過去データは、必要最低限の内容しか含まれていません。
このため、過去データをAI向け学習データ(評価データを含む)に加工していきます。
データを加工する際に注意すべき点があります。
それは、データの並びが降順(日付の新しい方が上、古い方が下)になっていることです。
私は、これに気がつかず、ハマってしまった経験があるので、直ぐに過去データの並びを昇順(日付の古い方が上、新しい方が下)に変更して上書き保存しておきましょう。
今回は、Neural Network Consoleのチュートリアル「2層のニューラルネットワークの設計と学習(App)」で紹介されているAIモデルを使用することにします。
![2層 ニューラルネットワーク モデル 構成図](https://assets.st-note.com/img/1707109851410-pPQJeTRpBF.png)
このため、過去データをAI向け学習データに加工するためには、AIモデルの構成を事前に把握しておく必要があります。
なぜなら、AIモデルに適したフォーマットで学習データを受け渡す必要があるからです。
一方で、AIモデルのアウトプットに関しては、1次元のデータフォーマットであれば容易に対応可能です。
さて、AIモデルの構成を見たところ、Input層からAffine層に接続されているのが確認できます。
Affine層ではAffine変換を行います。
Affine変換とは、画像の平行移動、拡大縮小、回転、スキュー(平行四辺形への変形)を行うものです。
インターネットでAffine変換を検索すると、視覚的に分かりやすい説明が記載されたウェブサイトが多数見つかります。
Affine変換に関する詳細を知りたい人は、お手数ですがそちらをご確認ください。
ここで重要なのは、Affine層のインプットデータのフォーマットは1次元のデータであるということです。
このため、学習データのフォーマットも1次元のデータにする必要があります。
続いて、アウトプットデータを検討します。
アウトプットデータのフォーマットを決めることは、AIに対して日経平均株価をどのように予測させるかを決めることになります。
今回は、AIに当日の日経平均株価に関する情報を与えた場合に、下記の予測が行えるようにします。
当日の日経平均株価に関する情報に基づいてAIが予測する内容
翌営業日の終値が+1%を超えて上昇する
翌営業日の終値が-1%~+1%の間に収まる
翌営業日の終値が-1%を超えて下落する
そこで、今回使用する学習データのフォーマットは、下記の通りとしました。
学習データのフォーマット
インプットデータ
終値, 始値, 高値, 安値, 5日移動平均値(終値), 25日移動平均値(終値), 75日移動平均値(終値)
アウトプットデータ
+1%超えフラグ, ±1%以内フラグ, -1%超えフラグ
学習データを作成する前に、ダウンロードした過去データをcsv形式からExcel形式に変換して下さい。
なぜなら、csv形式のファイルではExcelの関数が使用できないからです。
上記の学習データフォーマットに従い、私が作成した仮の学習データが下記となります。
![Neural Network Console 日経平均株価 加工データ](https://assets.st-note.com/img/1708001658150-w7OzkPioVe.png?width=1200)
上記の仮の学習データにおいて、A列からD列はダウンロードしたデータそのものです。
「日付け」、「出来高」、「変化率 %」は列ごと削除し、5, 25, 75日の移動平均値と出力用のフラグ(+1%越え、±1%以内、-1%越え)を追加しました。
移動平均値の算出は、AVERAGE関数を使用しています。
例えば、セルE6の5日移動平均値は、AVERAGE(A2:A6)で算出します。
また、セルE7の5日移動平均値は、AVERAGE(A3:A7)で算出します。
25日移動平均値の場合は、AVERAGE(Am:An)とします(n=m+24)。
同様に、75日移動平均値の場合は、AVERAGE(Ax:Ay)とします(y=x+74)。
一方で、出力用のフラグは、下記の通りです。
セルH2の+1%越えフラグは、IF(A2*1.01<A3, 1, 0)で算出します。
関数の内容は、翌営業日の終値を表すセルA3(=10813.99)が当日の終値を表すセルA2(=10825.17)より1%を超えて大きい場合は"1"を、それ以外は"0"を出力します。
セルI2の±1%以内フラグは、IF(AND(A3<A2*1.01, A2*0.99<A3), 1, 0)で算出します。
関数の内容は、翌営業日の終値を表すセルA3が当日の終値を表すセルA2の101%より小さく、かつ、セルA2の99%よりセルA3が大きい場合は"1"を、それ以外は"0"を出力します。
セルJ2の-1%越えフラグは、IF(A3<A2*0.99, 1, 0)で算出します。
関数の内容は、翌営業日の終値を表すセルA3が当日の終値を表すセルA2の99%より小さい場合は"1"を、それ以外は"0"を出力します。
ここまで出来たら、Excel形式で作成した仮の学習データをcsv形式に変換します。
csv形式に変換する際に悩ましいのが文字コードです。
なぜなら、文字コードが間違っているとエラーとなる場合があるからです。
しかし、Neural Network Console(Vertion 2.7.8490.25016)は、「UTF-8」および「Shift-JIS」の両方の文字コードに対応していますので安心です。
続いて、csv形式に変換した仮の学習データの1行目をNeural Network ConsoleのInput層が理解できるラベル名に変換します。
具体的には、次の通りです。
ラベル名の変換ルール
終値 → x__0
始値 → x__1
高値 → x__2
安値 → x__3
5日移動平均 → x__4
25日移動平均 → x__5
75日移動平均 → x__6
+1%越え → y__0
+/-1%以内 → y__1
-1%越え → y__2
私もハマったので明記しておきますが、ラベル名のルールは下記の通りです。
ラベル名のルール
入力: x__(アンダースコアが2個)m(mは0を含む自然数)
出力: y__(アンダースコアが2個)n(nは0を含む自然数)
誤ってアンダースコアを1個にしてNeural Network Consoleの学習を実行すると、下記のエラーが出ます。
誤ったラベル名を使用してNeural Network Consoleの学習を実行した場合のエラーメッセージ
[Error 1] Input->Dataset : Variable "x" is not found in dataset.
1 errors.
次に、仮の学習データのトリミングを行います。
具体的には、下記の行を削除します。
削除する行
移動平均値が算出できない2~75行目
出力用のフラグが算出できない最後の行(4945行目)
最後に、作成した仮の学習データを、学習データと評価データに分割します。
仮の学習データを分割する場合、学習データの割合を多くして、できるだけAIモデルを学習させるのが良いと思われます。
今回、私は仮の学習データの2~4700行目を学習データとし、4701~4870行目を評価データとしました。
やり方は簡単で、仮の学習データを評価データ用にコピーします。
仮の学習データの方を学習データとして使用します。
学習データの方は、4701~4870行目を削除します。
続いて、評価データの方は、1行目のラベルは残したまま、2~4700行目を削除します。
これで、ようやくAI学習と評価に必要なデータが用意できました。
AIモデルの修正
今回用意した学習データは、入力がx__0~x__6の7種類、出力がy__0~y__2の3種類です。
このため、このフォーマットに合うようにAIモデルのパラメータを修正します。
具体的には、下記の通りです。
AIモデルのパラメータ変更内容
Input層のSizeパラメータを"7"に変更
Affine_2層のOutShapeを"3"に変更
各パラメータを変更した後のAIモデルが下記となります。
![2層 ニューラルネットワーク モデル 構成図 パラメータ 修正済み](https://assets.st-note.com/img/1707137923077-qADGBbqrhV.png)
続いて、学習データと評価データを設定します。
学習データと評価データの設定方法については、先に挙げた「2層のニューラルネットワークの設計と学習(App)」を参照ください。
AIモデルの学習および評価を実行
AIモデルの学習を実行するには、実行ボタンを左クリックします。
![Neural Network Console 学習 実行](https://assets.st-note.com/img/1707138936632-OPh8Mlc2gN.png?width=1200)
学習が終了すると、下記のようなグラフが表示されます。
![Neural Network Console 学習 終了](https://assets.st-note.com/img/1708002709933-68wPIkcxSH.png?width=1200)
学習終了後の状態では、AIモデルの学習にかかった時間や学習後のAIモデルの状態が確認できます。
Neural Network Consoleのマニュアルには、「世代数の増加に従い Cost、Error の値が下がっていれば正しく最適化が実行されていると考えられます。」とあります。
上記において、世代数とはEpochを指します。
つまり、上記のグラフにおいて、COST, TRAINING ERRORおよびVALIDATION ERRORが右肩下がりになれば良いということです。
しかし、上記の結果は、右肩下がりではなく、一定値となっていますので、この点が非常に気になるところです。
ちなみに、本ケースでは、AIモデルの学習にかかった時間は44秒でした。
続いて、評価を実行するため、実行ボタンを左クリックします。
評価が終了すると、下記のような表が表示されます。
![Neural Network Console 評価 終了](https://assets.st-note.com/img/1708002856677-71KC90MppH.png?width=1200)
上記の状態で、「混同行列」を左クリックすると、下記の表が表示されます。
![Neural Network Console 混同行列](https://assets.st-note.com/img/1708003007995-99jl3b4lW1.png?width=1200)
ソニーネットワークコミュニケーションズ株式会社のプレゼンテーション資料(P. 33参照)によると、混同行列の見方は、以下の通りです。
混同行列の見方
Accuracy: 全データの内、正答した数の割合
Precision: 予測を正と判断した中で、答えも正のものである割合
Recall: 答えが正の中で、予測が正とされた割合
F-Measures: PrecisionとRecallの調和平均
つまり、私が作成したAIの日経平均株価に対する予測は、約63.5%の確率で正しいということです。
しかし、評価結果を改めて確認したところ、AIモデルが予想したy'__0, y'__1, y'__2の値が、全ての評価で同一値となっていました。
![Neural Network Console AIモデル 予測値 同一](https://assets.st-note.com/img/1708003449145-oWa26pxzSE.png)
つまり、どのような日経平均株価の値をAIモデルに入力しても、AIモデルの出力は、上記の値に固定されているということです。
これは失敗ではない、一つのうまくいかない方法を見つけたのだ
この結果は、私にとってショックでしたが、千里の道も一歩からです。
私は、この結果を、一つのうまくいかない方法を見つけたものと考えることにしました。
早速、このような結果になってしまった原因を考えたところ、一つ気になる点が浮かびました。
それは、日経平均株価の予測をさせるために入力している情報が、当日のローソク足と5, 25, 75日移動平均値のみであることです。
流石に、それだけの情報量で翌営業日の日経平均株価の予測をするのは難しかったのではないかと私は考えました。
そこで、AIモデルに入力する情報を5日分のローソク足に変更することにしました。
4営業日前から当日までのローソク足の情報をAIモデルに与えることで、翌営業日の日経平均株価を予測させるのです。
これならうまくいきそうだと、早速AIモデルの学習と評価を実行したのですが、結果は失敗でした。
前回の結果と変わらず、AIモデルの予想値は固定値のままでした。
また、新たに一つのうまくいかない方法を見つけてしまいました。
AIモデルの学習に失敗した原因とは
AI初心者の私には、AIを使って日経平均株価の予測をするなど無謀な挑戦だったのかと心が折れそうになりました。
そんな時に、ふと、あることに気がつきました。
AIモデルには日経平均株価の情報を与えているのですが、その値は10,000とか20,000とか30,000とかのオーダーです。
一方で、AIモデルに期待する出力は0とか1のオーダーです。
流石に、桁数が違いすぎるのではないかと私は考えました。
そこで、インターネットでアレコレ調べたところ、「正規化」というキーワードを発見しました。
どうやら、AIモデルの学習に使用するデータは、事前に正規化をしておくと良いらしいのです。
正規化とは、学習に使用するデータの範囲を0~1に変換することです。
私の考えとは異なりますが、学習データの範囲が全く正規化されていないことは事実です。
先ずは、正規化について調べてみたところ、学習データを正規化する方法は複数ありました。
主な学習データ向け正規化の方法
Min-Max正規化
バッチ正規化
レイヤー正規化
インスタンス正規化
続いて、Neural Network Consoleの正規化について調べたところ、バッチ正規化、レイヤー正規化およびインスタンス正規化の3種類をサポートしていることが分かりました。
そこで、今回は、正規化処理として非常にメジャーとされるバッチ正規化を使って、AIモデルの学習を行ってみることにしました。
Neural Network ConsoleのBatchNormalization層に関する説明を見ると、次のように記載されていました。
BatchNormalization
入力値を平均0分散1に正規化します。
ConvolutionやAffineの後に挿入することで精度向上、および収束を早める効果があります。
上記の説明に従い、Affine層の直後にBatchNormalization層を組み込むことにしました。
そのAIモデル構成図が下記となります。
![2層 ニューラルネットワーク モデル 構成図 BatchNormalization層 追加](https://assets.st-note.com/img/1707277614416-uX68Ht1HiK.png)
ちなみに、BatchNormalization層の各種パラメータは、デフォルト値を使用することにしました。
学習データを正規化した結果
BatchNormalization層を追加した結果、AIモデルが予想したy'__0, y'__1, y'__2の値が同一値となる問題は解決されました。
![Neural Network Console BatchNormalization 追加 混同行列](https://assets.st-note.com/img/1708003730829-x88dBzU1qF.png?width=1200)
Accuracyの値は、BatchNormalization層の追加前と同じく0.6352でした。
続いて、AIモデルが予想したy'__0, y'__1, y'__2の値を以下に示します。
![Neural Network Console BatchNormalization 追加 AIモデル 予測値](https://assets.st-note.com/img/1708004111061-BwuMXFhodb.png)
確かに、AIモデルの予測にばらつきが生じるようになりました。
これは、BatchNormalization層の追加前と比べて、AIモデルの学習が少しだけ進んでいる証拠だと私は考えます。
一方で、期待値がy__0やy__2であるにもかかわらず、AIモデルの予想値はy'__1の値が最も大きくなっています。
こうした点は、今後の課題としたいと思います。
今後の課題
BatchNormalization層の追加により、評価結果に改善が見られたものの、もっと複雑な構成のAIモデルを使用したり、学習データを工夫する、等の課題は残っています。
また、評価結果の詳細を確認していて気がついたのですが、今回使用した学習データおよび評価データでは、期待値がy__1に偏り過ぎています。
y__1とは、翌営業日の日経平均株価の終値が±1%以内に収まることを期待したフラグです。
この状況だと、y__1を予測しておけば、一定程度の確率で正解となってしまいます。
このため、この点に関する改善も今後の課題です。
AIモデルのデータについて
今回作成したAIモデルのデータは、Googleドライブにて共有しています。
GoogleドライブURL: https://drive.google.com/drive/folders/1T417HPFY8GlYLssRquVxpwWZa3dAQ51V?usp=sharing
N225_Simple2LayerNorm_1.sdcproj
Neural Network Console用のプロジェクトファイル
この記事が気に入ったらサポートをしてみませんか?