機械学習で株価(日経平均)を予想できず。失敗原因を考える

かじったばかりのディープラーニングで日経平均のアップダウン予測を試みました。

淡い期待  (^^♪

株の知識はほとんどないものの、単純な方法、「サルでも勝てる」投資法が運よく見つかればいいな、うまくいくようなら実際の売買も始めようかな、と割と本気で考えました。

やろうとしたのはこんな感じ。

nikkei_fea

過去 n 日の騰落(上昇 or 下落)をもとに明日の騰落を当てる。

・・・・

厳しい現実  (*_*;

全然ダメでした。
n をいろいろ変えて試しましたが、予測正解率は安定的にほぼ 50 %。。どうしようもない数字。
せめて性能が悪いほうに振れて、正解率 20% とかを叩きだしてくれれば逆方向に賭けることもできるのですが。

株もディープラーニングもまったく素人なので当たり前といえば当たり前の結果かもしれません。

で、予測のほうは一旦中止して、なぜ予測が上手くいかないのか考えてみました。
とりあえず、日経平均を python の pandas に読み込み、いろいろ探ってみます。
株価データはこちらで入手。

株価読み込み

df の中身はこうなってます。

騰落を追加

ここに、今日の騰落と翌日~4日後までの騰落を追加します。

こうなります。

1 が上昇、0 が下落です。
これで、5日分の騰落がどう推移するか見てみます。

騰落の推移

まず、上昇した日と下落した日の割合を確認してみます。

下落が 769日、上昇が 853日です。
比率になおすと、下落が 47% 強、上昇が 52% 強で、ほぼ半々です。

今日と明日

では、今日の騰落と明日の騰落はどのように推移するのでしょうか。

下落した翌日は、356日が下落、413日が上昇。比率は 46%54% です。
上昇した翌日は、414日が下落、439日が上昇。比率は 49%51% です。

続落または連騰した翌日

では、続落または連騰した翌日はどうでしょう。
逆方向に動きがちなら、そちらに賭けて丸儲けですが。。。

続落した翌日は、下落が 46%、上昇が 54% です。
連騰した翌日は、下落と上昇がほぼ 50% です。

ダメですね。丸儲けできません。

3日続落、または3連騰の翌日

では、3日続落、または3連騰の翌日はどうでしょうか。
さすがに方向感があるのでは。。。

3日続落した翌日は、下落が 45%、上昇が 55% です。
3日連騰した翌日は、下落が 47%、上昇が 53% です。

方向感、まったくなし。

4日続落、または4連騰の翌日

最後、4日続落、または4連騰の翌日はどうでしょうか。
なんか、期待薄ですが、一応見てみます。

4日続落した翌日は、下落が 40%、上昇が 60% です。
4日連騰した翌日は、下落が 47%、上昇が 53% です。

騰落の推移を見て明日の騰落を当てるのは無理っぽいです。
50% 前後に落ち着くというのは、つまり、コイントスの裏表を見て次はどっちか当てるようなもので、確率 2分の1で当たり外れが続くだけです。

騰落の率を考慮

株価が上がるといっても 1円 上がるのと 100円あがるのでは重みが違います。そこで、騰落の大きさを考慮しようと思うのですが、そもそも、日経平均というのは、どの程度の変動幅で動くのでしょうか。

nikkei_updown
横軸が騰落率、縦が件数です。
大半の日は 2% 未満の騰落率に収まっています。

単純な想像ですが、
2% 以上、つまり大幅に上下した翌日は逆方向に動きやすいのでは?

2% 以上 上昇した翌日

下落が 46%、上昇が 54% でした。

2% 以上 下落した翌日

下落が 40%、上昇が 60% でした。

大幅に上下した翌日でも、どちらに動くかはほぼ半々なようです。

今日と明日の騰落率を可視化

今日の騰落率が明日の騰落率に影響する(つまり、相関性がある)かどうか可視化してみます。

nikkei_updown_rate

どうなんでしょうか。
大半のデータは中央の円に収まっているので相関性はないような気がします。
率が 5% を超えるような場合は、右下がりになっているようにも見えますが(つまり、5% 超動いた翌日は反対に動く ?)、件数は微々たるもので、あまり当てにはなりません。

5%以上動く日数は

1621日中、11日しかありません。

まとめ

単純に騰落を当てるのは無理でした。
為替やアメリカ株を取り入れれば少しは当たるのかもしれませんが、それだと仕込むタイミングが難しい。

移動平均を求めてゴールデンクロスやデッドクロスを考慮すれば、あるいは、という気もしますが。
ちなみに、移動平均は rolling_mean で求まります。

そもそも株価は時系列な情報ですから、RNN で処理するといいのかもしれません。でも、RNN はハードル高そう。。。

コメントはお気軽に