「次に上がる株をデータで予測できたら」と考えたことはありませんか。
個人の勘や経験だけに頼る投資には限界がありますが、Pythonと機械学習を組み合わせれば、客観的なデータに基づいた銘柄選定が可能になります。
本記事では、数ある手法の中でも特に投資と相性が良い「ランダムフォレスト」を使い、銘柄選定モデルを構築する手順を解説します。
特に、モデルの知能を左右する「特徴量エンジニアリング」に焦点を当て、今日から使える実践的なコードを紹介していきます。
なぜ銘柄選定にランダムフォレストが使われるのか?
機械学習には多くの手法がありますが、なぜ投資のプロやデータサイエンティストは「ランダムフォレスト」を好むのでしょうか。
その理由は、株価という予測困難でノイズの多いデータに対して、この手法が非常にタフで、かつ「中身が分かりやすい」という特徴を持っているからです。
この章では、ランダムフォレストが銘柄選定において発揮する3つの大きな強みを解説します。
なぜ他の複雑なAIモデルよりも初心者に適しており、それでいて実戦的なのか、その理由を紐解いていきましょう。
複雑な株価の動きをパターンとして捉えられる
株価の動きは単純な右肩上がりや右肩下がりではありません。
「RSIが低いけれど、移動平均線からは乖離していない」といった、複数の条件が重なったときに初めて意味を持つパターンが数多く存在します。
ランダムフォレストは、こうした「もし〜なら(If-Then)」という条件分岐を無数に組み合わせることで、複雑な相場の状況を捉えます。
例えば、単一の指標では捉えきれない「売られすぎからのリバウンド」を、複数のテクニカル指標の組み合わせとして学習できるのです。
深層学習(ディープラーニング)のように膨大な計算資源を必要とせず、手元のパソコンでも十分に高精度な分析ができる点も魅力です。
特定のトレンドに偏らず、多様な視点から株価を評価できるため、銘柄選定の精度を底上げする強力な武器になります。
どの指標が効いているのかを数値で確認できる
投資において「なぜこの銘柄を選んだのか」という根拠は、納得感を持って運用を続けるために欠かせません。
ランダムフォレストには、予測に貢献した指標をランキング形式で表示する「特徴量の重要度」という機能が備わっています。
これを使えば、「今回の予測では移動平均乖離率が一番効いていた」といった事実が数値で分かります。
中身がブラックボックスになりがちな他のAI手法と違い、人間が判断のプロセスをチェックできるのは、大切なお金を扱う投資において大きな安心材料です。
もちろん、数値が高いからといって必ずしも将来を保証するわけではありませんが、自分の投資戦略に自信を持つための強力な裏付けになります。
根拠が明確であれば、もし予測が外れたときでも「どの前提が違っていたのか」を冷静に振り返ることができます。
異常値に強く初心者でもモデルが壊れにくい
株価データには、突然の暴騰や暴落といった「異常値」が頻繁に含まれます。
一般的な統計モデルはこうした外れ値に弱く、予測が大きく狂ってしまうことがありますが、ランダムフォレストはそうした影響を受けにくい仕組みを持っています。
これは、たくさんの「決定木」という小さなモデルを作って多数決をとる手法だからです。
一部の木が異常値に惑わされても、他の多くの木が正常な判断をしていれば、モデル全体としての回答は安定します。
以下の表に、一般的なモデルとランダムフォレストの違いをまとめました。
| 特徴 | 一般的な線形モデル | ランダムフォレスト |
| 複雑な関係の把握 | 苦手 | 得意 |
| 異常値への耐性 | 低い | 高い |
| 判断根拠の可視化 | 普通 | 分かりやすい |
| 必要なデータ量 | 少なめ | 中程度 |
このように、データの扱いに慣れていない初心者でも、比較的安定した結果を出しやすいのがランダムフォレストのメリットです。
銘柄選定モデルを作るための開発環境を整える
モデルを作る前に、まずは道具を揃えましょう。
Pythonには、世界中の投資家が愛用しているライブラリが豊富に揃っており、これらを組み合わせるだけでプロ級の分析環境が整います。
この章では、データの取得から加工、そして機械学習の実行に欠かせない3つのステップを紹介します。
Google Colabを使えば、自分のパソコンに何もインストールすることなく、ブラウザだけで今すぐ作業を始められます。
必須ライブラリをまとめてインストールしよう
Pythonで株価分析を行うには、いくつかの「道具箱(ライブラリ)」が必要です。
データの形を整えるもの、計算を行うもの、そして学習を実行するものを、以下のコマンドで一気に読み込みましょう。
import pandas as pd
import numpy as np
import yfinance as yf
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
これらは、データ分析の現場では「呼吸をするように使う」基本のライブラリです。
特に scikit-learn(sklearn)に含まれるランダムフォレストは、非常に使い勝手が良く、世界標準の手法として知られています。
最初は呪文のように感じるかもしれませんが、これらがあるおかげで、本来なら何千行も書く必要がある複雑な計算を、たった数行で終わらせることができるのです。
道具を揃えることは、効率的な開発の第一歩です。
yfinanceを使って最新の株価データを取得する
次に、分析の材料となる株価データを取得します。
「yfinance」を使えば、Yahoo Financeから米国株や日本株のヒストリカルデータ(過去の価格)を無料で手に入れることができます。
以下のコードは、トヨタ自動車(7203.T)の過去数年分のデータを取得する例です。
# 銘柄と期間を指定
ticker = "7203.T"
df = yf.download(ticker, start="2020-01-01", end="2024-12-31")
print(df.head())
日本株を扱う場合は、証券コードのあとに「.T」を付けるのがルールです。
これだけで、日付ごとの始値、高値、安値、終値、そして出来高が手に入ります。
自分でExcelに入力する手間を考えれば、これがいかに革命的であるかが分かるはずです。
データさえ手に入れば、あとはあなたのアイデア次第でどのような分析も可能になります。
取得したデータの欠損値をきれいに掃除する
取得したばかりの生データには、祝日で価格が入っていなかったり、エラーで数値が抜けていたりすることがあります。
これをそのまま学習に使うと、モデルがエラーを起こして止まってしまいます。
不足しているデータをどう扱うかは、モデルの精度に直結する重要な作業です。
dropna():データが欠けている行を丸ごと削除するfillna(method='ffill'):前の日の価格で埋める- そもそもデータが少ない期間は分析対象から外す
このように、データを「磨き上げる」工程をデータクレンジングと呼びます。
機械学習の世界には「ゴミを入れればゴミが出てくる(GIGO)」という言葉がありますが、綺麗なデータを用意することこそが、優れた銘柄選定モデルを作る秘訣です。
特徴量エンジニアリングでモデルに「投資の視点」を教える
ランダムフォレストは賢い手法ですが、生の株価をそのまま渡しても「次に何が起きるか」を理解するのは困難です。
そこで、株価を「移動平均線からの乖離率」や「RSI」といった、投資判断に役立つ指標に変換してあげる必要があります。
この作業を「特徴量エンジニアリング」と呼び、モデルの性能を左右する最もクリエイティブな工程です。
この章では、実際にモデルに教えるべき「投資の知恵」を、Pythonのコードでどう表現するか具体的に解説していきます。
移動平均線からの乖離率を数値化して投入する
投資家が「今の株価は売られすぎか、買われすぎか」を判断する際、最もよく使うのが移動平均線との距離です。
株価は移動平均線から大きく離れると、磁石のように引き寄せられて戻ってくる性質があるからです。
この乖離率を特徴量として加えることで、モデルは「行き過ぎた相場」を認識できるようになります。
# 25日移動平均線からの乖離率を計算
df['MA25'] = df['Adj Close'].rolling(window=25).mean()
df['Diff_MA25'] = (df['Adj Close'] - df['MA25']) / df['MA25']
具体的には、乖離率がマイナス10%を超えると反発しやすくなるといったパターンを、ランダムフォレストが自動で見つけ出してくれます。
単なる価格の数字ではなく、「平均と比べてどうなのか」という相対的な視点を与えることが重要です。
これにより、モデルは単なるデータの羅列を、意味のある「チャンスのシグナル」として捉え直すことができるようになります。
RSIやボリンジャーバンドで買われすぎを判断させる
乖離率以外にも、テクニカル指標には相場の過熱感を教えてくれるものがたくさんあります。
例えばRSIは、直近の上げ幅と下げ幅の比率から、市場のエネルギーがどちらに傾いているかを0から100の数字で表します。
これらの指標を複数組み合わせることで、モデルは「多角的な健康診断」を行えるようになります。
- RSI:買われすぎ(70以上)や売られすぎ(30以下)を察知する
- ボリンジャーバンド:統計的な変動範囲(±2σなど)を超えたかを判定する
- MACD:トレンドの勢いや転換点を捉える
指標を増やしすぎると「ノイズ」になることもありますが、まずは代表的なものを3〜5個程度入れてみるのがおすすめです。
それぞれの指標が持つ「異なる視点」をモデルに提供することで、多角的な判断が可能な銘柄選定モデルへと成長します。
過去数日間の騰落率を「ラグ変数」として追加する
今日の株価がどうなるかは、昨日や一昨日の動きと無関係ではありません。
株価の「勢い」を教えるために、過去数日間のリターンを特徴量として持たせる手法を「ラグ変数の導入」と呼びます。
「3日連続で上昇したあとの4日目はどうなりやすいか」といった、時系列の連鎖反応を学習させるのが狙いです。
# 前日比の騰落率を作成
df['Return_1d'] = df['Adj Close'].pct_change(1)
df['Return_3d'] = df['Adj Close'].pct_change(3)
この「過去の自分」との比較データがあることで、モデルは今の相場が加速しているのか、それとも減速しているのかを感じ取れるようになります。
静止画としての株価ではなく、動画のような「流れ」を認識させることが、予測精度を高める大きなポイントです。
指標同士を組み合わせて新しい「気づき」を作る
単体の指標だけでなく、それらを掛け合わせることで新しい意味が生まれることがあります。
例えば「出来高が急増している」かつ「乖離率が大きくマイナス」という2つの条件が揃ったときは、セリングクライマックス(大底)の可能性が高まります。
ランダムフォレストはこうした条件の組み合わせ(交互作用)を見つけるのが得意ですが、あらかじめ人間が「意味のある組み合わせ」を特徴量として作ってあげると、より学習がスムーズになります。
例えば、「価格の変動幅 × 出来高」といった指標を作れば、それは「どれくらいのエネルギーで価格が動いたか」という新しい尺度になります。
あなたの投資経験からくる「この組み合わせは鉄板だ」という直感を、数式にしてモデルに授けてあげましょう。
ランダムフォレストを実行して銘柄を選定する
特徴量が揃ったら、いよいよランダムフォレストに学習をさせます。
しかし、ただデータを流し込めばいいわけではありません。何を「正解」とするかを決め、データを正しく分ける必要があります。
この章では、モデル構築の心臓部となる「ラベル付け」と「データの分割」、そして実際の学習コードについて解説します。
ここを正しく行わないと、過去のデータでは完璧でも、未来の予測には全く使えない「見かけ倒しのモデル」になってしまうため、注意深く進めましょう。
未来の騰落を予測するための「ラベル」を作成しよう
機械学習に何を予測させるかを決めるのが「ラベル(目的変数)」作りです。
今回は銘柄選定が目的なので、「5日後に株価が3%以上上がっていれば1、そうでなければ0」といったルールを作ります。
# 5日後のリターンを計算
df['Target_Return'] = df['Adj Close'].shift(-5) / df['Adj Close'] - 1
# 3%以上上昇したら1、それ以外は0にする
df['Label'] = np.where(df['Target_Return'] > 0.03, 1, 0)
ここで大切なのは、あまりに高すぎる目標(例:5日で20%上昇)に設定しないことです。
正解が少なすぎると、モデルは何を学習すればいいか分からず、「常に0」と答えるような無気力なAIになってしまいます。
全体の2〜3割程度が「1」になるような、現実的な目標設定を心がけましょう。
この「ラベル」こそが、モデルが目指すべきゴールとなります。
学習用とテスト用にデータを正しく分割する
モデルが本当に実力を持っているか試すには、学習に使っていない「未知のデータ」でテストする必要があります。
ただし、株価データの場合は「ランダムな分割」は厳禁です。
株価は時間の流れが重要なので、必ず「過去のデータで学習し、それより未来のデータでテストする」という時系列順の分割を行います。
# 時系列で8:2に分割する
train_size = int(len(df) * 0.8)
train_df = df.iloc[:train_size]
test_df = df.iloc[train_size:]
もし2023年のデータの中に2024年のデータを混ぜて学習させてしまうと、モデルは「未来を知っている」状態で学習することになり、テスト結果が異常に良くなってしまいます。
これを「データリーク」と呼び、初心者が最も陥りやすい罠の一つです。
常に「明日のことは誰も知らない」という状況を再現してテストを行うことが、実戦で通用するモデルを作る鉄則です。
Scikit-learnでランダムフォレストを学習させるコード
準備がすべて整いました。Scikit-learnを使って、ランダムフォレストのモデルを作成し、学習を開始しましょう。
コードは驚くほどシンプルです。
# 特徴量(X)とラベル(y)に分ける
features = ['Diff_MA25', 'RSI', 'Return_3d']
X_train = train_df[features].dropna()
y_train = train_df.loc[X_train.index, 'Label']
# モデルの作成と学習
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
model.fit(X_train, y_train)
ここで指定している n_estimators は作成する木の数、max_depth は木の深さ(複雑さ)です。
深すぎると過去のデータに細かく合わせすぎてしまい、将来の予測に弱くなる(過学習)ため、最初は5〜10程度の控えめな数値から始めるのがコツです。
「fit」という関数を呼んだ瞬間、モデルは過去の膨大なパターンから、上昇する銘柄の共通点を見つけ出そうと猛烈に計算を始めます。
作成したモデルの予測精度を評価する
学習が終わったら、次はモデルの「通信簿」を確認しましょう。
「正解率が80%だった!」と喜ぶのはまだ早いです。投資の世界では、正解率よりも「当たったときの利益」と「外れたときの損失」のバランスが重要だからです。
この章では、モデルの実力を多角的に評価する方法を解説します。
数字の裏に隠された真実を見抜き、本当に自分の資金を託せるモデルかどうかを冷静に判断する目を持ってください。
正解率だけで判断しないための「混合行列」の使い方
株価の予測において、「正解率(Accuracy)」はあまり当てになりません。
例えば、100日のうち上昇する日が10日しかない場合、モデルが「毎日上がらない」と答え続ければ、それだけで正解率は90%になってしまうからです。
そこで重要になるのが「精度(Precision)」と「再現率(Recall)」という考え方です。
| 指標 | 意味 | 投資における解釈 |
| 精度 (Precision) | 「上がる」と予測したうち、本当に上がった割合 | 買いシグナルの信頼度 |
| 再現率 (Recall) | 実際に上がった日のうち、予測が的中した割合 | チャンスの見逃しにくさ |
| F1スコア | 精度と再現率のバランス | モデルの総合的な優秀さ |
投資家にとって特に大切なのは「精度(Precision)」です。
チャンスを見逃しても(再現率が低くても)実害はありませんが、上がると信じて買ったのに下がった(精度が低い)場合は損失に直結するからです。
「下手な鉄砲」を撃つのではなく、確実な場面を狙い撃てているかをチェックしましょう。
バックテストを行って実際の運用に近い成績を見る
指標としての精度を確認したら、次は「もしこのモデルに従って売買していたら、いくら増えたか」をシミュレーションします。
これが「バックテスト」です。
モデルが「1(上昇)」と予測した日に株を買い、5日後に売るという動作を過去のデータ上で再現します。
単に予測が当たったかどうかだけでなく、手数料を引いたあとの「資産曲線」が右肩上がりになっているかを確認しましょう。
的中率が高くても、1回の負けが大きすぎてトータルでマイナスになっていないか。
あるいは、特定の好景気の期間だけ調子が良く、それ以外はボロボロではないか。
グラフにして可視化することで、数字だけでは見えなかったモデルの癖が浮き彫りになります。
予測が外れやすい相場パターンを特定する
完璧なモデルは存在しません。大切なのは、自分のモデルが「どんなときに間違えるのか」を知っておくことです。
例えば、ボラティリティ(値動きの激しさ)が極端に高いパニック相場では、過去のパターンが通用しにくくなります。
予測が外れた日のチャートを振り返り、共通点を探してみましょう。
- 決算発表の直後で、突発的な動きをしていた
- 指数全体(日経平均など)が急落していた
- 特徴量として入れた指標が、効かないほど一方的なトレンドだった
こうした「苦手分野」が分かれば、特定の状況ではモデルの判断を無視して休む、といった高度な運用ができるようになります。
AIに丸投げするのではなく、AIの弱点を人間がカバーする。
この協力関係こそが、安定した利益を生むための秘訣です。
どの特徴量が効いたのかを可視化して分析する
「モデルがなぜその銘柄を選んだのか」を理解することは、投資家としての成長にも繋がります。
ランダムフォレストの大きなメリットの一つは、判断の根拠となった指標を可視化できる点にあります。
この章では、モデルの頭の中を覗き見する方法と、それをどう次の改善に活かすかを解説します。
データに基づいた発見は、あなたのこれまでの投資観を大きく変えるかもしれません。
特徴量の重要度(Feature Importance)を取り出す
学習済みのモデルから、各指標がどれくらい予測に貢献したかを抽出してみましょう。
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
# グラフにして表示
plt.bar(range(len(features)), importances[indices])
plt.xticks(range(len(features)), [features[i] for i in indices])
plt.title("Feature Importance")
plt.show()
このグラフを見れば、「移動平均乖離率」が圧倒的に重要なのか、それとも「RSI」が鍵を握っているのかが一目瞭然です。
もし、自分が重要だと思っていた指標のランキングが低かったら、それは新しい発見です。
「自分の直感とは違うけれど、データ上はこちらの指標の方が有効らしい」という気づきは、あなたのトレードスタイルをより客観的なものへと進化させてくれます。
投資家としての直感とモデルの判断を比較しよう
モデルの結果を鵜呑みにするのではなく、自分の直感と対話させてみましょう。
「モデルは買いと言っているけれど、自分はまだ下がる気がする」という場面こそ、分析を深めるチャンスです。
共感文になりますが、最初は自分の感覚を否定されるようでモヤモヤするかもしれません。
しかし、その違和感の正体を突き止めることで、モデルに足りない特徴量が見えてくることがあります。
例えば、モデルは財務指標を見ていないために、赤字転落した銘柄を「テクニカル的に割安だ」と誤判定しているのかもしれません。
その場合は、次のステップとしてファンダメンタルズ(財務データ)を特徴量に加えることを検討しましょう。
AIとの対話を通じて、あなたの投資モデルはより「厚み」のあるものになっていきます。
不要な指標を削ってモデルを軽量化する
ランキングを表示してみて、ほとんど予測に寄与していない(重要度がゼロに近い)指標があれば、思い切って削除しましょう。
指標が多ければ多いほど良いと思われがちですが、実は「ノイズ」が増えて予測精度を下げる原因(次元の呪い)になることがあります。
不要なデータを削るメリットは3つあります。
- 過学習の防止:偶然の一致で学習してしまうのを防ぐ
- 計算の高速化:より多くの銘柄を短時間で分析できる
- 解釈のしやすさ:何が要因で動いているかがより鮮明になる
「削る勇気」を持つことで、モデルはより本質的なパターンを捉えられるようになります。
筋肉質な、無駄のないモデルこそが、変化の激しい相場において長生きできるのです。
機械学習モデルを運用する際の注意点
いよいよ実戦投入ですが、その前に知っておくべき「運用の心得」があります。
機械学習モデルは「ナマモノ」です。一度作れば一生稼いでくれる魔法の杖ではありません。
この章では、長期にわたってモデルを健全に保つためのメンテナンス方法と、現実の取引で直面するコストの問題についてお伝えします。
ここを軽視すると、シミュレーションでは勝てていたのに、口座残高は減っていく……という悲劇を招きかねません。
過去に合わせすぎる「過学習」の罠を回避する
バックテストの結果が良すぎるとき、それは「過学習(オーバーフィッティング)」のサインかもしれません。
これは、モデルが過去の特定の動きを「暗記」してしまい、全く同じことが起きるのを待っている状態です。
しかし、相場で全く同じことが二度起きることはありません。
- 木の深さ(max_depth)を制限する
- 特徴量を厳選し、数を絞る
- 異なる期間のデータで何度も検証する(交差検証)
これらの対策を講じることで、モデルに「応用力」を持たせることができます。
過去の100点満点を目指すのではなく、未知の未来で70点を出し続けられるような、柔軟なモデルを目指しましょう。
「少し緩いくらいのモデル」の方が、実戦では使い勝手が良いことが多いのです。
時代遅れのモデルにならないよう定期的に学習し直す
相場の性質は、数年単位でガラリと変わります。
低金利時代に有効だったパターンが、利上げ局面では全く通用しなくなることは珍しくありません。
これを「データドリフト(概念ドリフト)」と呼び、モデルの精度が時間とともに低下していく現象です。
これを防ぐためには、定期的な「再学習」が欠かせません。
- 3ヶ月に一度、直近のデータを加えて学習し直す
- 大幅な相場環境の変化(ショック安など)のあとに更新する
- 常に最新の精度をモニターし、劣化にいち早く気づく
常に新しい情報を教え続けることで、モデルは今の相場感覚を保つことができます。
「モデルを育てる」という意識を持つことが、安定した運用の秘訣です。
手数料や滑り(スリッページ)を考慮してシミュレーションする
シミュレーションの数字を鵜呑みにしてはいけない最後の理由は「取引コスト」です。
1回のトレードで0.5%の利益が出るモデルでも、手数料で0.2%引かれ、さらに注文が希望価格からズレる(スリッページ)ことで0.2%損をすれば、利益はほとんど残りません。
特に売買頻度が高いモデルを作る場合は、このわずかなコストが致命傷になります。
バックテストの際には、あらかじめ手数料を多めに見積もった条件でシミュレーションを行いましょう。
シビアな条件を乗り越えてなお利益が残る銘柄だけを選ぶ。
それくらいの慎重さこそが、あなたの資産を守り、着実に増やしていくための防衛線になります。
まとめ:データに基づく銘柄選定で投資をアップデート
この記事では、ランダムフォレストを使った銘柄選定モデルの作り方から、特徴量エンジニアリングの重要性、そして運用の注意点までを解説してきました。
- ランダムフォレスト は複雑な条件分岐を捉えるのが得意で、判断根拠も分かりやすい
- 特徴量エンジニアリング こそがモデルに「投資の知恵」を授ける最重要工程である
- 時系列での評価とメンテナンス を怠らないことが、実戦で勝ち続ける鍵となる
AIや機械学習は、決して人間の勘を否定するものではありません。
むしろ、あなたの投資アイデアが正しいのか、どの指標が本当に機能しているのかを教えてくれる「最強の鏡」です。
まずは気になる1銘柄のデータを取得し、1つだけ特徴量を作ってみることから始めてください。
自分の手で動かしたコードが、これまでとは違う相場の景色を見せてくれるはずです。

