日本株の過去10年分のデータを使い、LightGBM と LSTM で「来月上がる株」を予測できるかを検証しました。上がるかはほぼ当たらず、当たったのは値動きの荒さだけ。生存者バイアスで一度だまされた経緯も含めて、結果をまとめます。
「急落した優良株は買い」「上がっている株に乗れ」「配当の高い株が有利」。株の本やネットには、こうした経験則がたくさんあります。機械学習や深層学習で株価を予測する話もよく見かけます。
それらは本当に効くのか。自分の売買のルールを決める前に、日本株の過去 10 年分のデータを使って、機械学習(LightGBM)と深層学習(LSTM)で確かめました。この記事はその分析の結果です。
結論を先に
- 来月どの株が上がるかは、ほとんど当てられませんでした。 経験則でも、機械学習でも、深層学習でも同じです。
- 当てられたのは「どれだけ値動きが荒いか」だけで、こちらは 9 割近く当たりました。
- ここ数年に限れば、割安な株と配当の多い株が勝っていました。ただし、その前の数年は負けています。
- 検証のやり方を少し間違えるだけで、「勝てる方法」が簡単に見つかってしまいます。 実際に一度だまされました。
これは個人が自分の売買のルールを決めるために行った検証の記録で、投資の助言ではありません。対象は日本株です。過去に効いたことが、これからも効くとは限りません。
「効く・効かない」をどう測ったか
この記事の数字は、すべて同じやり方で測っています。
「差 +3」は、その基準で選んだ方が、全部を買うより 1 年あたり 3% 多く増えたという意味です。マイナスなら、選ばない方がましだったことになります。
大事な決まりが 1 つあります。並べるときには、その時点までに分かっていた情報しか使いません。 たとえば 2020 年 3 月末の並べ替えに、4 月に発表された決算は使いません。
使ったデータ
| データ | 出どころ | 量 |
|---|---|---|
| 毎日の株価と出来高 | J-Quants(日本取引所グループのデータ配信サービス) | 2,441 日 × 5,392 銘柄 |
| 決算と業績予想 | J-Quants | 189,622 件 |
| 各時点の上場会社の一覧 | J-Quants | 121 か月分 |
| 米国の金利・為替・恐怖指数(VIX)など | Yahoo Finance | 15 年分 |
主な対象は TOPIX500(東証に上場する会社のうち、規模の大きい約 500 社)です。
1. 「上がるか」は当たらない。「荒れるか」は当たる
同じ機械学習のモデルに、2 種類の予測をさせました。1 つは「来月、ほかの株より上がるか」、もう 1 つは「来月、ほかの株より値動きが荒いか」です。
「上がるか」は 52.6% で、でたらめとほぼ同じです。「荒れるか」は 88.6% で、10 回に 9 回近く当たります。
値動きの荒い株は、来月も荒い。これははっきりした性質で、機械学習を使わなくても「過去 1 年に荒かった株」を選ぶだけで 86.6% 当たります。一方で、上がった株が来月も上がるとは限りません。
予測した順位と実際の順位の似かたを表す順位相関(0 ならでたらめ、1 なら完全に一致)で見ても、「上がるか」は 0.03、「荒れるか」は 0.64 でした。
過去の値動きから分かるのは「危ない株」であって、「儲かる株」ではありません。
2. 高度な方法を使っても、単純な方法に勝てなかった
手がかりを増やしたり、深層学習を使ったりすれば当たるようになるのか。単純な方法(過去 6 か月に上がった株を買うだけ)と、機械学習・深層学習を、同じ条件で比べました。
手がかりを 16 個から 26 個に増やしても(出来高や、米国の金利・為替などの相場全体の数字を追加)、成績は変わりませんでした。
深層学習の LSTM には、過去 120 営業日の値動きと出来高の並びをそのまま読ませました。結果はでたらめと同じです。チャートの形から来月を読むことは、少なくともこの方法ではできませんでした。
深層学習の設定は 1 通りしか試していません。設定を何十通りも試せば良い数字は出ますが、それは過去のデータに合わせただけになります。
3. 検証のやり方を間違えると、「勝てる方法」が見つかってしまう
前の章で「年 3〜4% 勝てる」と出た方法は、本物だったのか。答えは「いいえ」でした。
最初の検証には、気づきにくい間違いがありました。対象を「今、大きい 500 社」にしていたのです。
今の 500 社には、「この 10 年で株価が大きく上がったから、大きい会社の仲間入りをした会社」が含まれます。逆に、業績が落ちて外れた会社や、上場廃止になった会社は入っていません。つまり、勝ち残った会社だけを集めて、過去にさかのぼっていたことになります。これでは「最近上がっている株を買う」方法が、実際より良く見えてしまいます。
J-Quants には「その時点で、どの会社が大きい 500 社だったか」の記録があります。それを使って対象を直すと、延べ 619 社になりました。うち 118 社は今は 500 社から外れていて、54 社は上場廃止などで株価が付いていません。
「最近上がった株を買う」方法の優位は、消えました。年 3% の差は、対象の選び方が作り出した見かけでした。全部を買った場合の成績も、年 12.7% から 10.6% に下がっています。
この現象は生存者バイアスと呼ばれ、投資の検証でいちばん有名な落とし穴の 1 つです。知っていても、実際に踏みました。
過去のデータで「勝てる方法」を見つけたら、方法より先に、データの集め方を疑ってください。
4. 効いていたのは「割安さ」。ただし、時期による
株価の動きではなく、会社の業績を見れば差が出るのか。10 年分の決算(約 19 万件)を使い、7 つの基準を試しました。決算の数字は、発表された日より後にだけ使っています。
| 買う株の選び方 | 2018〜2020 年 | 2021〜2023 年 | 2024 年〜 | 全期間 |
|---|---|---|---|---|
| 資産に比べて株価が安い(PBR が低い) | −6.4 | +13.2 | +10.9 | +4.9 |
| 利益に比べて株価が安い(PER が低い) | −5.6 | +15.1 | +4.1 | +3.8 |
| 配当が多い(配当利回りが高い) | −3.5 | +17.1 | +4.6 | +5.5 |
| 決算の発表日に株価が上がった | +0.5 | −1.2 | +2.4 | +0.5 |
| 会社が業績予想を引き上げた | −2.2 | +1.1 | +0.9 | −0.2 |
| 利益の伸びが大きい | −1.4 | +0.6 | −0.2 | −0.4 |
| 稼ぐ力が高い(ROE が高い) | +5.6 | −3.2 | −1.9 | +0.4 |
数字は、全部を買った場合との 1 年あたりの差(ポイント)です。
差が出たのは、割安さを測る基準(上の 3 行)でした。偶然でこうなりにくいかの目安になる t 値(2 を超えると偶然では出にくい)で見ても、2 を超えたのは割安さと配当だけです。
「決算が良かった会社を買う」という基準(下の 4 行)は、大きな会社ではほとんど差が出ていません。良い決算は、発表されたその日のうちに株価に織り込まれてしまうようです。
ただし、割安な株も配当の多い株も、2018〜2020 年には負けています。勝ち始めた 2021 年以降は、世界的に金利が上がり始めた時期です。2023 年 3 月には、東京証券取引所が上場企業に、株価が純資産を下回っている状態の改善を求めました。「割安株は常に勝つ」ではなく、「この数年は割安株の時代だった」と読むのが安全です。
5. 「業績が良いのに急落した株」を買っても、勝つのは半分以下
「良い会社の株が一時的な理由で急落したときは買い時」という有名な経験則を確かめました。「1 年の高値から 30% 以上下げた株」を買って 12 か月持った場合と、そのうち業績が良い会社(売上も利益も増えていて、業績予想を下げていない)に絞った場合を比べています。
どの条件でも、勝ったのは半分以下でした。業績の良い会社に絞ると、平均の成績は少し良くなります(全部を買った場合との差が +3.0% から +4.6% に)。それでも勝った割合は 44% です。
「平均はプラスなのに、勝つのは半分以下」というのは、少数の大当たりが平均を引き上げているということです。急落した株を 1 つか 2 つ買っても、その大当たりを引ける見込みは低く、多くの場合は平均に負けます。
6. 小さな会社では差が大きく出る。そして、急落は逆効果
注目する人が少ない小さな会社なら、まだ差が残っているのではないか。大きい 500 社の外にある会社(毎月の平均で 1,752 社。ほとんど売買されていない会社は除く)で、同じ検証をしました。
割安さの差は、小さな会社の方が大きく出ました。大きな会社では効かなかった「業績予想を引き上げた会社を買う」も、小さな会社では効いています。
一方で、急落した小さな会社の株は、その後も負け続けました。 12 か月後に平均より良かったのは 36% だけです。小さな会社の急落には、たいてい本当に悪い理由があるようです。
ただし、小さな会社の株は、思った値段で買えない・売れないことが多く、実際の成績はこれより悪くなります。
まとめ
| 問い | 答え | どのくらい確かか |
|---|---|---|
| 過去の値動きから、上がる株を当てられるか | ほぼ当てられない | 確か。経験則・機械学習・深層学習のどれでも同じ |
| 値動きの荒い株は当てられるか | 当てられる(約 9 割) | 確か |
| 上がっている株に乗る方法は効くか | 正しく検証すると、差は無い | まずまず。検証できたのは 9 年分 |
| 割安な株・配当の多い株は有利か | この 5〜6 年は有利だった | 弱い。負けた時期と勝った時期が 1 回ずつ |
| 急落した株を買うのは有利か | 大きな会社ではほぼ差が無い。小さな会社では不利 | まずまず |
| 業績が良ければ、急落は買い時か | 平均は少し良いが、勝つのは 44% | まずまず。「業績が良い」の決め方は簡易なもの |
個人の売買にとっての意味は、次の 4 つだと考えています。
- 市場全体をまとめて買う方法(インデックス投資)を土台にするのは、理にかなっています。 どの検証でも、確実に勝てる選び方は見つかりませんでした。
- 個別の株を買うなら、「当てる」より「1 つあたりの金額を小さくする」。 当てられない以上、外れたときの傷を小さくすることが、いちばん確かな守りです。
- 値動きの荒さは、金額を決める材料になります。 荒い株ほど少なく買う、という決め方には裏付けがあります。
- 「勝てる方法を見つけた」という話は、検証のやり方を確かめてから信じる。
技術的にしたこと
ここからは、分析の中身を知りたい方向けです。
未来の情報を混ぜない
過去のデータで検証するときにいちばん多い失敗は、「その時点では知りえなかった情報」をうっかり使ってしまうことです。少しでも混ざると、成績は実際よりずっと良く見えます。次の対策をしました。
| 落とし穴 | 何が起きるか | した対策 |
|---|---|---|
| 未来のデータで学習する | 答えを見てから問題を解くことになる | 予測する年より前のデータだけで学習し、1 年進むたびに学習し直す(ウォークフォワード)。前年 12 月の分は正解がまだ出ていないので学習から外す |
| 決算を、発表より前に使う | 良い決算の会社を、発表前に買えたことになる | 決算は発表日で管理。取引が終わる 15 時以降の発表は、翌営業日から使う |
| 海外の指標の時差 | 東京の取引終了時点では、同じ日付の米国の数字はまだ出ていない | 米国の指標と為替は、前日の値を使う |
| 勝ち残った会社だけを使う | 3 章のとおり | 各月末時点の上場会社の一覧から、対象を決め直す |
| 上場廃止になった会社 | 消えた会社の損が、成績から抜け落ちる | 翌月に株価が無いときは、最後に付いた値段で売ったことにする |
| 株式分割 | 1 株を 2 株に分けると株価が半分になり、暴落に見える | 分割を調整した株価を使い、1 株あたりの利益や配当も同じ比率でそろえる |
| 成績を見て設定を調整する | 何十通りも試せば、偶然うまくいく設定が必ず見つかる | モデルの設定は最初に決めて変えない。乱数を変えた複数回の平均を使う |
| 売買の費用を無視する | 毎月たくさん入れ替える方法ほど良く見える | 入れ替えた分に 0.1% の費用がかかるとして、引いた成績も出す |
予測に使ったモデル
| モデル | どういうものか | 設定 |
|---|---|---|
| LightGBM | 条件分岐(決定木)を何百本も組み合わせる方法。表の形のデータに強く、この種の問題の定番 | 木 300 本、学習率 0.03、葉 15 枚。乱数を変えた 5 回の平均。CPU で 1 分ほど |
| LSTM | 時間の順に並んだデータを読む深層学習。過去 120 営業日の毎日の値動きと出来高をそのまま読ませた | 2 層、隠れ状態 64、6 エポック。乱数を変えた 3 回の平均。GPU(NVIDIA RTX 3060)で数分 |
どちらのモデルにも、当てさせたのは「来月、その株の上昇率が、全部の会社の中で何番目か」です。株価そのもの(来月いくらになるか)は予測させていません。株価は相場全体の上げ下げに大きく左右されるので、「ほかの株と比べてどうか」に絞った方が、銘柄選びの力を測れるからです。
モデルに渡した手がかり(特徴量)
| 種類 | 数 | 中身 |
|---|---|---|
| 値動き | 16 | 過去 1・3・6・12 か月と 3 年の上昇率、1 年の高値・安値からの距離、値動きの荒さ、移動平均からの離れ具合、配当利回りなど |
| 出来高 | 3 | 売買される金額の大きさ、最近の売買の増え方 |
| 相場全体 | 7 | 米国の金利、為替、日経平均の下げ幅、恐怖指数(VIX)など |
| 業績 | 8 | 割安さ(PER・PBR の逆数)、ROE、配当利回り、売上と利益の伸び、業績予想の修正、決算発表日の株価の反応 |
会社ごとの数字は、毎月、全部の会社の中での順位(0〜1)に直してから渡しています。「PER 10 倍」が安いか高いかは時代によって変わるので、「その月の中で何番目に安いか」にそろえるためです。
動かした環境
自宅の Linux サーバー(12 コア、メモリ 32GB、GPU は NVIDIA RTX 3060 12GB)で、Docker のコンテナの中で実行しました。言語は Python で、pandas(表の計算)、LightGBM、PyTorch(深層学習)を使っています。データの取得に約 1 時間、検証の計算は全部で 10 分ほどでした。
このAI技術、御社の業務にも導入できます
AI導入・業務自動化
ChatGPT活用や業務自動化など、最新のAI技術を御社に合わせてご提案します
※ 通常1営業日以内にご返信します
この分析の限界
- 第三者の確認を受けていません。 3 章のような間違いが、ほかにも残っているかもしれません。
- 期間が 9 年です。 割安な株が負けた時期と勝った時期が、1 回ずつ入っているだけです。
- 配当は近似です。 会社が予想した年間の配当を、年 2 回に分けて受け取ったとして計算しています。
- 税金を入れていません。 毎月入れ替える方法は、利益が出るたびに約 20% の税金がかかります。
- 月末の終値で売買できたと仮定しています。 特に小さな会社では、実際にはその値段で買えないことがあります。
- 2 章の数字は、3 章で分かった間違いを含んだままです。 直した後のデータ(2021〜2026 年)でも、業績の手がかりを足した機械学習(全部を買った場合との差 年 +5.3)は、「資産に比べて安い順に買う」だけの方法(年 +12.1)に及びませんでした。