去年12月3日にPythonの学習を再開しました。練習のために何か作れないかなと考えていたところ、株価予測のAIを作るというアイデアが浮かんだのでやってみることにしました。結果的に64%の精度で株価が1%以上上昇または下落することが予測できる(かもしれない)AIができました。プロジェクト1は本題に入るまでの経緯でプロジェクト2が本題です。
#プロジェクト1
線形回帰を使って現在の株式市場がバブルかどうかを視覚的に判断する。また、その成果をWebサイトに埋め込んで誰でも好きなETFや会社の株、また任意の期間で画像を生成して現在の価格がバブルかどうか判断するための参考にできるようにしたかった。
結果、ローカル環境ではDjangoを使って成功したと思ったのですが、実際にデプロイすることはできませんでした。データベースやDjangoの知識が足りなかったと思います。
一応コードです。
https://github.com/LulutasoAI/LRQiita/blob/master/LRgenerator
#プロジェクト2
画像分析によって未来の株価を予測する。
##試み1
大量の株価データを2カ月毎にローソク足チャート画像に変換し、チャートが最後に表示した価格と日時を取り、2カ月後に価格が上がっているかどうかで2種類に分ける。
犬と猫を見分けるのと同じ方法で株価が上がるか下がるかを予測する。
データは約500枚 日経平均株価、S&P500, APPLE inc. そしてトヨタ自動車の2001年から現在までのデータです。
https://github.com/LulutasoAI/Datasetpricechart1 学習用にどうぞ
データはこんな感じです
カテゴリー0:画像の後価格が上昇(up)
カテゴリー1:画像の後価格が下落(down)
###結果
学習のvalidationでは精度が変わらなくなってしまいましたが、一応精度58%
テストセットで試すと55.8%
うーん微妙
##試み2
ローソク足チャートを4つに分類して予測しようとした。
データセットをその価格が画像の後の2カ月で4.8%以上上昇したグループ、4.8%以上下落したグループ、それ以外の画像で価格が少し(4.7%以下)上昇したグループ、下落したグループの4つに分けて 学習させました。その結果36%の精度でその画像がどのグループに属するかを当てることができるAIが完成しました。この精度36%の意味を考えてみたのですが、よくわかりませんでした。 単純に4つのカテゴリーなのででたらめに予測して得られる25%よりはずっと良いと考えましたが、今回使ったデータセットの4つのカテゴリーの割合は"down 13.36%", "drastically-down 23.22%", "drastically-up 38.23%", "up 25.17%" となっているのでそう簡単に考えられるものではなさそうです。 たとえば、明らかな過学習の一例でしょうが、全ての画像についてそれが"drastically up"だと予測するAIは38%前後の精度を持つことができます(このデータセットからランダムで訓練セットやテストセットができるため)。 とにかく36%が良いのか悪いのかがよくわかりませんでした。
##試み3
もっと単純にしてみようと考えました。
上記のデータセットの中で4.8%以上価格が動いた2つのグループだけを使って学習をさせることにしました。
その結果
このように過学習が起きてしまいました。
この試みはまだ研究の余地があると思います。kerasのモデルやレイヤーをいじることで改善が見込めそうです。
##試み4
シンプルに画像の後の2か月間で価格が上がったか下がったかで二つに分けてデータセットを作りますが、今回は大量のデータを使って学習しようとしました。2001-01-01から現在までの期間の株価のデータを取得しました。
- ^N225 nikkei 225
- AAPL Apple Inc.
- ^GSPC S%P 500
- TM TOYOTA
- GOOGL Alphabet Inc Class A
- BA Boeing Company
- AMZN Amazon.com Inc.
- PYPL PayPal
- TWTR Twitter, Inc.
- V Visa Inc.
かなりいい結果になりました。
##試み5
上記の分類法ではほんの少しの差(たとえば2セントの差)で”下がる”に分類にされるかもしれなかったものが”あがる”に分類されるような場合が想定でき、また少ししか価格が変化しないものは学習時にモデルを混乱させるかもしれないと思い1%以下の価格変動だったものはデータセットに入れないことにしました。そのデータセットで学習した結果です
ここで問題がデータセットではなくkerasのモデルやレイヤーにあるかもしれないと気づきました。
##試み6
学んだことを全部活かそうとしました。
データセットは大きく、1%以下しか価格が動かなかった画像を除く3753個のローソク足チャート 2001年~
過学習は避けることを意識しました。
でもちょっとまってください、よく考えたら、リーマンショックがあった2007年から2009年頃のチャートはノイズが多いかもしれません。
ここで2010年以降のチャートのみを学習させることを思いつきました。
データセットは1875個になってしまいましたが、いざ挑戦
一日中モデルをいじって試行錯誤して
テストセットで64%という精度になりました。これが今日の出来事です。モデルやレイヤーに関してはもう少し勉強したあと記事にしたいと考えています。
#結論
Pythonにローソク足チャートを学ばせることによって、株式市場の将来を予測することがコンピューターにとってもなかなか難しいかがわかりました。しかし一方で、64%の精度はチャートの背後に何か予測を可能にする何かがあることも示唆しています。
資金(生活費)が続く限りまだ研究を続けたいと思います。良いAIができたらWebサイトに埋め込んで誰でも使えるようにしたいです。
最後ですが英語でも書いているのでよければ見てください
https://lulitech.nihoninanutshell.com