<株進捗>9/3 株価の3分類予想(+10%over / -10%〜+10% / -10%under)

目次

  1. 今日やったこと
  2. 学習モデルの構築
  3. 出力イメージ
  4. その他

1.今日やったこと

昨日記事に書いてた以下をやりました。

  • 1銘柄N日→先30日の終値の最大値、最小値を6分類する(値動き+10%以上、+5%〜+10%、0%〜+5%、-5%〜0%、-10%〜-5%、-10%以下)
    未完了

昨日はなんとなく6分類にしていました。
よく考えると、実際は「買う」「何もしない」「売る」の3つさえできればよいです。
具体的には、予想値が「+10%超え」なら買い、「ー10%未満」なら売り、それ以外は何もしない。

ということで、値動きを「〜ー10%」「ー10%〜+10%」「+10%〜」の3つに分類することを最終目標にしました。

2.学習モデルの構築

Input: 1銘柄N日分のデータ
Output: 先30日の終値の最大値、最小値が「〜ー10%」「ー10%〜+10%」「+10%〜」になる確率

出力層にはソフトマックス関数を使っています。分類の確率を出すためです。

損失関数は以下を考えました。

出力層がソフトマックス関数の場合、交差エントロピーが損失関数としてセットになることが多いみたいです。

ここで疑問が2つ。

  • 上記の例で、正解が「+10%以上」の学習データに対して以下の2つは同じ評価がされます。
    • 「+10%以上」50%、「ー10%〜+10%」50%  
    • 「+10%以上」50%、「〜ー10%」50%
  • 当てずっぽで全部「ー10%〜+10%」にする、になりそう。。
    「+10%以上」「ー10%以下」がそれぞれ5%程度、あとはすべて「ー10%〜+10%」くらいの分布になるので。しかし、大事なのは「ー10%〜+10%」を当てることじゃなくて、「+10%〜」「〜ー10%」を当ててもらうことです。単純に分類するだけでなく、「+10%〜」「〜ー10%」にインセンティブを与えるような損失関数がいるのか、どうなのか・・・。

結局、とりあえず以下の関数を作ってみました。誤差逆伝播とかの関係でこの関数じゃダメなのかもしれませんが、一度やってみようと思います。
Loss = 教師データ(※) - [(+10%〜である確率) - (〜ー10%である確率)]

(※)教師データ。以下のように表現されます
「+10%〜」であれば1
「〜ー10%」であれば-1
「ー10%〜+10%」であれば0

3.出力イメージ

とりあえず実装。簡単に出してみました。
f:id:kurupical:20170904000727p:plain:w400

一番したにちょこっとでてる3×3の行列が結果です。
縦列が予想です。
1行目から順に〜ー10%、ー10%〜+10%、+10%〜とそれぞれ予想した件数です。
2行目にすべての数字が出ているので、この例だとすべてのデータに対して「ー10%〜+10%」と予想しています。

横軸は実際の値です。
1列目から順に実際の値が〜ー10%、ー10%〜+10%、+10%〜となった件数です。
つまり、実際の値は514件が「ー10%〜+10%」、71件が「+10%〜」となっています。

縦横を合算すると、

  • 514件は、予想結果とも「ー10%〜+10%」で正解
  • 71件は、予想「ー10%〜+10%」に対して結果「+10%〜」で不正解

となります。

※5万件くらい予想させましたが全部、「ー10%〜+10%」で予想しやがります。
f:id:kurupical:20170904002009p:plain:w400

Loss関数を交差エントロピーにして、もう一度やってみます。。
3分類法、自分としてはかなり名案だと思ったのですが…。

4.その他

「どの程度予想があたれば統計的優位性があると認められるか」という計算もしたのですが、力尽きたので今日はここまでにします。