機械学習で株価変動を予測してみる(1)~はじめに
はじめに (2020年9月27日)
2020年2月9日に機械学習を用いた株価予想にチャレンジを開始し、その記録を残そうとこのブログを書き始めましたが、全くうまくいっていません。
そのうちコロナウイルス騒ぎで株価も乱高下し、機械学習はやめて、独自の統計的な指標を算出して売買を判断できないか、といった寄り道もしました。最近になって、やはり自分が作ったプログラムの記録を残したいと思い、再開することにしました。
途中半年以上間が空いてしまったので一部書き直しています。そのため、使用するデータや結果など、一部連続性が失われているところもありますが、失敗の取組み内容がなんらかの参考になれば幸いです。
さあやるぞ (2020年2月9日)
最近「なんでも自分でやってみたい病」の症状が出てきて、機械学習で株価が上がるか下がるか、予測できるか試してみたくなりました。いろいろやってみてどんな結果になるのか、ブログにあげていきます。
一年以上前に画像処理のためにニューラルネットワークを使えないかと、機械学習の基本から勉強することになり、そのときから「ニューラルネットワークの仕組みや使い方を理解すれば、株価の上げ下げを予測できるかも」と野望を胸に抱いてきました。しかし、ニューラルネットワークの仕組みをそれなりに理解して、仕事で実際に画像処理ニューラルネットワークで実験するたびにうまくいかず、なかなか重い腰があがりませんでした。
でも、どんな結果になるのか一度試してみたいという想いは持ち続けて今日に至ります。シンプルなニューラルネットワークで株価の変動がうまく予想できるとは思っていませんが、やってみたことの記録を残していきます。
Google検索すると、Qiitaや普通のブログで実際に試してみたというのがあり、参考にさせていただいています。まずは、全結合のシンプルな全結合ニューラルネットワークで試し、いずれはRNNやLTSMを試す予定です。実際にコーディングしたPythonコードをすべて公開する予定はありませんが、興味がある人が中身をイメージできるように書きたいと思います。
私の履歴
ちなみに、私の履歴は以下の通りで、たぶん株式取引も機械学習(ニューラルネットワーク)も初級者~中級者のレベルだと思います。機械学習に関しては参考書「ゼロから作るディープラーニング」のPythonコードを実際に動かし、例えば訓練の最初と途中と最後のパラメタの変動といった様子を自分なりにグラフ化して観測したりしてました(この本は入門者におススメです)。
- 株式取引
- 2003年~2015年頃までやって、儲からないし他のことに興味を持ったので2016年以降は遠ざかっていた
- 収支がプラスになったのは一年だけで、成績は大きく負け越しでほぼ毎年確定申告で損失を繰り越し
- Perlで株価の時系列データをYahoo!ファイナンスから取得し、上がりそうな銘柄、下がりそうな銘柄をスクリーニングし、それを元に売買していた
- 機械学習
- 2018年6月ごろから勉強し始め、ニューラルネットワークの仕組みはだいたり理解した
- Pythonも一から勉強し、Google検索を活用しながら自由にコーディングできるようになった
- プログラミング
- C言語プログラミングの経験は20年以上
- C++, C#, PERL, Pythonがコーディングできる
株の売買は、ふつう毎日ローソク足を見ていろいろ判断するのが一般的だと思いますが、私は繰り返し作業があるとプログラムでなんとかしたくなる面倒くさがり屋で、プログラムを書いて売買できそうな銘柄をスクリーニングしていました。完全にプログラムの判定結果に頼るのは不安なので、売買の前には一応ローソク足を見て最終判断していたのですが、結果はダメダメ。うまくいかない原因はいろいろあると思いますが、主な原因は
- チャートを見たときの印象とか過去の株価の動向とかがプログラムに反映できない
- プログラムの評価・チューニングが不十分(プログラムを作ったらすぐ使いたくなってしまった)
といったところでしょうか。もちろんうまくいったこともあったのですが、小さく儲かって大きく損した、というのもあります。そもそも機械的に判断するのがまずくて、よっぽど確信が持てない限り、売買しない方がよいのかもしれません。とは言うものの、株式売買はつい欲が出て、ハマってしまうんですよね…。
まずはやってみた
株価が今後どう変動(上がるのか、下がるのか、変わらないのか)するかは神のみぞ知るですが、機械学習で何かできないか試してみました。やったことは、「本日を含む過去5日間の株価データから、1日後の変動を予測する」です。入力層、中間層×1、出力層の全結合ニューラルネットワークを構成し、学習・推論させてみました。その結果が
正答率 | |
訓練データ | 89% |
テストデータ | 98% |
えええっ!!、ほんとにっ??テストデータで98%ってほぼ完ぺきに予測できてるやん。
- 上のグラフは訓練データとテストデータでの損失関数の値(青線が訓練データ, 橙線がテストデータ)
- 下のグラフは、訓練データとテストデータでの予測精度(0~1)
- ニューラルネットワークの構成
- レイヤ: 入力層+中間層×1+出力層(重み係数は2層)
- 各層のノード数
- 入力層: 指標の数(最初は1個)×5日分
- 中間層: 2層(10ノード + 10ノード)
- 出力層: 3 (UP/EVEN/DOWNの3つ)
- 活性化関数
- 中間層: シグモイド
- 出力層: ソフトマックス
- 損失関数
- 交差エントロピー
- 学習条件
- 銘柄: SUBARU(銘柄コード7270)
- 訓練データ885日分(2015年1月22日~2019年8月31日)
- テストデータ104日分(2019年9月1日~2020年2月7日)
- エポック=5000, 学習率0.01
- 推論内容
- 当日の株価に対して翌日の株価がどうなるか
- UP(3%以上上昇)
- EVEN(±3%未満)
- DOWN(3%以上下落)
- 当日の株価に対して翌日の株価がどうなるか
- 最終結果
- 訓練データでの予測精度: 89%
- テストデータでの予測精度: 98%
一応、学習曲線を見ると訓練データの損失は徐々に下がってて学習してそう。でも待てよ。上のグラフで訓練データの損失が徐々に小さくなっていき、下のグラフの正答率が徐々に上がっているのに対し、テストデータの正答率が最初からほぼ98%に張り付いてる・・・。
何かおかしい・・・。
ということで、次回はこの結果の考察を書きます。
ディスカッション
コメント一覧
まだ、コメントがありません