今回は、予測用データ(検証データ)を改良して予測対象日を増やすことを考えてみた記録です。
データの改良
これまで作ってきた機械学習モデルは、主に2017年~2021年の株価を学習データとして2022年度の予測と結果検証を中心に行ってきました。
データの構造としては週次ベースでの騰落を見てましたので、学習データも検証データも週1回(原則火曜日)を基準日としたデータで行っていました。
これだと毎週火曜日のみが予測日となりますが、検証結果を見ていると予測数に大きな波があってある日に集中したりとか数か月対象がなかったりというケースも見て取れました。もう少し予測での推奨対象を増やすことができないかと思い、毎日予測できるように検証データ側を改良してみたいと思います。
やってみたことはデータの構造は変えずに、データ作成の基準日を週次⇒毎日化する改良です。イメージとしては以下のような感じですね。
データ変更のイメージ
予測用データ作成のプログラムを見直したついでに、学習データも毎日データを作れるようにしました。これで、
①:元々の2017年~2021年の学習データ
②:2017年から2021年の全ての取引日(毎日版)
③:②をベースに火曜だけに絞った版
の3つの学習データパターンとなりました。
①と③の違いですが、元のデータは火曜が祝日や非取引日の場合は週初の取引日(月曜も祝日なら水曜以降)のデータを作る仕様でした。②は完全に火曜だけのデータに絞ってるので少しだけ違う形になります。
データ改良後の正答率の変化
予測データを毎日化した後の正答率の変化を見てみたいと思います。学習データも3パターンになりましたのでそれぞれで。もちろんアルゴリズムはLightGBM版です。
予測データの比較対象は「元の予測用データ(火曜ベースの祝日対応あり(学習データの①と同等))」と「毎日対応版データ」の2パターンで年度は2022年度になります。アンダーさんプリンは5倍のみに固定。正答率はとにかく騰がったか(0%以上騰がったか)どうかのみ確認しました。
「買い」と「売り」両方を検証しています。まずは買いから。
買い(0%以上上昇したか?)の結果
採用閾値
学習データ①
学習データ②
学習データ③
元の予測データ
毎日化データ
元の予測データ
毎日化データ
元の予測データ
毎日化データ
×
〇
率
×
〇
率
×
〇
率
×
〇
率
×
〇
率
×
〇
率
45%以上
317
953
75.0%
1075
2408
69.1%
326
321
49.6%
1515
1440
48.7%
304
985
76.4%
990
2274
71.6%
50%以上
104
687
86.9%
319
1466
81.9%
102
105
50.7%
469
470
50.1%
112
694
86.1%
260
1411
84.4%
55%以上
49
490
90.9%
106
899
89.5%
25
33
56.9%
141
151
51.7%
43
501
92.1%
86
920
91.5%
60%以上
17
314
94.9%
39
503
92.8%
4
10
71.4%
44
45
50.6%
21
344
94.2%
36
578
94.1%
65%以上
10
181
94.8%
17
245
93.5%
1
2
66.7%
12
15
55.6%
11
192
94.6%
21
287
93.2%
ますは元々の学習データ①の中での毎日化の結果から。毎日化することで少し悪化しています。それでも閾値50%以上でも正答率は80%以上は維持してるので充分使えそうですね。対象も約3倍に増えてるので売買機会も増加が期待できそうです(日々の予測対象の発生有無の偏りまでは見てませんが)
次に②の学習データで見ると、ん?、成績も悪化してるし予測対象数も減っている。銘柄数を増やしたときには成績が圧倒的に上がったんですが、同じ銘柄数で対象日数増やすとこうなるんですね。過学習とか不均衡データなどの機械学習の問題なのか株価変動の特性なのか良く分かりませんが。
②のデータで火曜だけに絞った場合の③の学習データは①とほぼ近い値をたたき出してくれてます。大半のデータは同じはずなので当たり前でしょうが、少し成績が上がってるのがうれしいところですね。
ここで少し面白いことに気づきました。学習データが毎日化された②は、検証データが火曜のパターンと毎日化のパターンで予測対象数に約5倍の差があります。ほぼ曜日が増えた分だけきれいに対象数が増えてる感じです。これに比べて①と③は約3倍程度です。ここから見るとそもそも株価自体に曜日特性があって、火曜の変動パターンが見事にはまってくれてるのかもしれません。他の曜日でも同じ波動で動く上昇をうまくとらえて予測してくれてると思いました。まあとにかく最初に火曜を選択して学習データ作ったこと自体がラッキーだったのかもしれませんが火曜ベースの学習データは結構使えることが分かりました。
次に「売り」に関してです。まずは結果から
売り(0%以上下落したか?)の結果
採用閾値
学習データ①
学習データ②
学習データ③
元の予測データ
毎日化データ
元の予測データ
毎日化データ
元の予測データ
毎日化データ
×
〇
率
×
〇
率
×
〇
率
×
〇
率
×
〇
率
×
〇
率
65%以上
74
149
66.8%
1107
1284
53.7%
154
198
56.3%
821
1068
56.5%
79
177
69.1%
1028
1302
55.9%
70%以上
33
87
72.5%
570
739
56.5%
73
108
59.7%
342
575
62.7%
44
99
69.2%
543
739
57.6%
75%以上
11
49
81.7%
267
367
57.9%
21
48
69.6%
95
237
71.4%
14
55
79.7%
242
388
61.6%
80%以上
3
10
76.9%
115
165
58.9%
2
14
87.5%
18
52
74.3%
5
27
84.4%
92
155
62.8%
85%以上
0
3
100%
33
50
60.2%
0
3
100%
0
5
100%
1
9
90.0%
10
33
76.7%
売りの方は良く分かりません。とりあえず学習データ①も③毎日化で正答率が大幅に悪化。予測数も10倍に増えてる。なんで買いとこんなに変わるのかは分かりませんが、火曜オンリーのモデルな感じです。ただ、②のデータは予測データが火曜日ベースと毎日化で5倍程度の違いなのでとにかく学習データ②は買いでも売りでもまんべんなく平均的な動きを予測してるんだろうとは思います。
②の毎日化学習データで予測データも毎日化を対象とすると閾値75%以上だと正答率が70%超えてきてますのでこれは使えそうです。ここまでの仮装売買結果見てると正答率が70%超えてこれば確実に儲かる感じでしたし(仮想売買結果をここだけ見てみましたがやはり300万程度儲かっていた)。売りは②と③を予測日で使い分けたり組み合わせたりする感じですね。
②と③での予測対象の比較とか、曜日特性ももっと深堀するといろいろ見えてくるかもしれませんがここで止めておきます。
結果からみると「買いモデル」は①か③で毎日予測しても使えそうで、「売りモデル」は火曜日を①か③のモデルメインに他の曜日は②を使いつつという感じですね。(何度も同じこと書きますがあくまで22年に売買していた場合!ですけどね)