機械学習 で株価分析にチャレンジ Part1

1.1 機械学習 にチャレンジ!

今回の記事は何シリーズかに分けて記載します。

株式投資を始めて5年ほどになりますが、ここで初めて機械学習を用いた株価予測にチャレンジしてみようと思います。もともと株式投資を始めた時にやってみようと思っていたのですが、プログラミング知識が浅かったため始めるまでにかなりの時間を要してしまいました。

記事に実装したモデルや評価方法を明記して残しておくことで、皆さんが機械学習をする際に少しで参考になればと思っています。本記事では、使用したモデルや特徴量について、極力ブラックボックスにならないように説明していく予定です。なお、プログラムはPythonで実装していきます。


プログラミング初心者でも読めるように、概念→直感→数式(必要最低限)→実装での位置づけの順で整理します。

内容ですが、(おそらく)下記の流れに沿っていきます。

  • 予測対象:何日後の株価を予測するか?(例:5日後)
  • モデル:機械学習をする上で使用するメカニズム
  • 特徴量:株価の分析に使用する指標。移動平均、ボリンジャーバンド、RSI、ATR、出来高変化、曜日循環、ラグなど
  • 評価:学習させる方法
  • 最終出力:予測株価の出力

重要:本記事は投資助言ではありません。機械学習は「統計的に有利な局面を見つけるための道具」であり、“必ず当たる”ことは一切保証できません!


1.2 「株価予測」はそもそも可能なの?

「市場は効率的だから、明日の価格は誰にもわからない」と言われます。一方で、短期のモメンタム(上がっているものはもう少し上がりやすい/下がっているものはもう少し下がりやすい)、ボラティリティのクラスター(荒い相場が続きやすい)など、統計的に観測される傾向があることも事実です。

機械学習の役割は、この“弱いシグナル”を人間の目・主観に頼らず、大量の過去データから一貫したルールとして抽出することにあります。
人間がチャートを見て「なんとなく感じる違和感」や「買われすぎ・売られすぎ」を、RSIやボリンジャーバンドの数値として取り込み、複数の指標を同時に非線形な関係まで含めて学習します。

イメージ
アナリストの「この銘柄、ちょっと行き過ぎ」に相当する感覚を、RSI>70価格/移動平均比>1.05などの数値で表し、機械に学習させるイメージです。


1.3 「当てる」ではなく「ぶれを減らす」

個別の1回の予測が外れても、“平均すると有利”であれば運用として意味があります。ここで重要なのは誤差の管理です。
本シリーズで使うMAE(平均絶対誤差)MAPE(平均絶対誤差率)は、「いくら(何%)ズレたのか」を客観的に測る物差しです。

  • MAE:金額のズレ。例)10円ズレた
  • MAPE:割合のズレ。例)10%ズレた

投資判断は確率とリスク管理の組み合わせです。機械学習は「期待値を少しだけ押し上げ、外れの大きさを抑える」ための補助輪だと考えてください。

脱線ですが、ポーカーなどの賭け事でも「期待値」というワードが出てくると思います。賭け事が上手い人は期待値の計算が上手いですよね。株価も究極的には期待値を加味して投資していけば成功確率は上がるということです。


1.4 本シリーズの設計思想(ざっくり全体像)

作成したプログラムの全体像をざっくりと書きます。

  1. 目的変数(ターゲット)は対数リターン
    • y=log(終値(x+H))−log(終値(x)) :xはある日、Hはどれくらい先を予測するかの日数
    • 対数にすることで、上昇/下落を対称的に扱い、外れ値の影響も和らげます。
    • さらに3日移動平均で平滑化してノイズを少し除去。
  2. 特徴量はテクニカルの基礎+時系列の文脈
    • SMA/EMA、ボリンジャーバンドZ、RSI、ATR、ヒストリカルボラ、出来高変化、曜日循環、ラグ等。
    • 使いすぎると過学習になるので、重要度Top-K(14個)だけ残す仕組みを採用。
  3. モデルは二刀流(アンサンブル)
    • LightGBM(分位回帰, τ=0.5):誤差の中央値を狙う設定で、外れ値に比較的ロバスト。
    • RandomForest:安定志向で“効くときは効く”古典派。
      → 0.6 : 0.4でブレンドしバイアス(系統誤差)バリアンス(ブレ)のバランスを取る。
  4. 予測地平(Horizon)はH∈{3,5,10}
    • 短期(H=3)・中期(H=5)・やや中期(H=10)をH=5に換算してブレンド。
    • 天気予報を複数期間で見た上で5日後に集約するイメージ。
  5. 検証法ローリング原点法
    • 未来の情報が混入しないよう、時間順に学習範囲を少しずつ後ろへ転がして検証。
    • 現実の運用に近い「将来予測力」を測れてフェア。
  6. 最新情報重視の重みづけ
    • 直近1ヶ月の重みを増し、さらに指数減衰(τ=140日)で古いデータの重みを落とす。
    • 直近相場のレジーム(相場の“空気”)を少し強調。


1.5 初心者のつまずきポイントを先回りで解消

A. 「時系列でシャッフルしたらダメ」の理由

通常のK-foldはデータをランダム分割しますが、時系列だと未来の形(ターゲット)に関係する情報が学習側に漏れる(リーク)危険が高い。
→ ローリング原点法で
「過去で学んで、未来で試す」**を徹底します。

B. 「価格」より「リターン」を予測する理由

価格は単位(円)に依存し、スケールが大きくなるほど学習が不安定に。リターン割合なのでスケールが安定し、分布も扱いやすい
→ 最後に指数関数で価格へ復元します(price * exp(pred_return))。

C. 指標は“多ければ良い”ではない

RSIやボリンジャー、ATRなどは役に立ちますが、似た情報を重複して入れると過学習の温床に。
→ 今回は重要度に基づくTop-K選択でスリム化します。

D. 「検証スコア」は運用での誤差感に翻訳する

  • MAE=20円は「平均的に±20円ズレる」。
  • **MAPE=3%**は「平均的に±3%ズレる」。
    取れるリスクと組み合わせて、損切りラインやポジションサイズを設計します。

1.6 直感がつかめるミニ例(紙と鉛筆でやる版)

状況:
今日の終値が1000円。3日後の終値は過去の傾向から+1%、-0.5%、+0.3%程度で揺れることが多かったと仮定します。
「+1%に寄りやすい」と判断したモデルの
中央値(τ=0.5近辺)が+0.5%だとしましょう。

  • 予測対数リターン ≈ +0.005(※小さいときはlog(1+r) ≈ r)
  • 予測価格 ≈ 1000 × exp(0.005) ≈ 1005円

これが分位回帰(τ=0.5)の持つ“中央値”の直感です。
外れ値(例えば+10%や-10%の異常日)が混じっていても、中央値は平均より引っ張られにくい=ロバスト


1.7 LightGBM×RandomForestの“二刀流”が効く理由

  • LightGBMは微妙な非線形と相互作用を“薄く広く”拾うのが得意。
  • RandomForestはノイズに強く、安定的に効く構造。
  • 二者を0.6:0.4で混ぜると、外れのときのダメージ(バリアンス)を抑えつつ、当たるときはDeepに拾う(バイアス低減)バランスになりやすい。

投資のメタ視点:
「単一モデルへの一点賭け」はリスク。アンサンブルは“モデルの分散投資”です。


1.8 マーケットの“空気感”を重みづけに反映

相場はレジーム(上昇・下落・もみ合い・高ボラ/低ボラ)が移り変わります。半年前のパターンが、今もそのまま有効とは限らない。
本シリーズでは、直近1ヶ月を×2で強調し、かつ
指数減衰(τ=140日)で古いデータの影響をゆっくり薄めます。
過度な直近偏重は危険ですが、適度な近似性の重視は短期予測に効きやすい実践的テクニックです。


1.9 リスクと限界——「外れ」を設計に織り込む

  • 決算・重大ニュース・政策変更など構造が一変するイベントには、過去学習は弱い。
  • 予測誤差が連続して拡大したら、モデルの再学習特徴量の見直し重みパラメータの再調整を検討。
  • 運用時は損切り・ポジションサイズとセットで。
  • ドローダウン(資産のピークからの最大下落)を想定内にすることが持続のコツ。


1.10 まとめ(第1章)

  • 機械学習は、人間の直感(勘)を数値化して再現・強化する道具。
  • 本シリーズは、時系列の原則を守りつつ、分位回帰LightGBM×RandomForestのアンサンブルで5営業日先を予測。
  • 重要なのは「当てる」ことではなく、誤差を管理し、平均的に有利に立つこと。
  • 直近の相場を適切に強調し、ローリング原点CV×MAE/MAPEで“運用に耐える現実的な精度”を目指す。

shota_py

メーカー勤務のエンジニアです。 自分の趣味である、「電気回路」、「ガジェット」「株式投資」、「Python」に関する記事をつらつらと書いています

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


ABOUT US
shota_py
メーカー勤務のエンジニアです。 自分の趣味である、「電気回路」、「ガジェット」「株式投資」、「Python」に関する記事をつらつらと書いています