<株進捗>9/3 株価の3分類予想(+10%over / -10%〜+10% / -10%under)
目次
- 今日やったこと
- 学習モデルの構築
- 出力イメージ
- その他
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乗和
- 交差エントロピー
出力層がソフトマックス関数の場合、交差エントロピーが損失関数としてセットになることが多いみたいです。
ここで疑問が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.出力イメージ
とりあえず実装。簡単に出してみました。
一番したにちょこっとでてる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%」で予想しやがります。
Loss関数を交差エントロピーにして、もう一度やってみます。。
3分類法、自分としてはかなり名案だと思ったのですが…。
4.その他
「どの程度予想があたれば統計的優位性があると認められるか」という計算もしたのですが、力尽きたので今日はここまでにします。