AI の投資判断はバックテストできない|先読みバイアスと、先の相場で確かめる設計

AI の投資判断はバックテストできない|先読みバイアスと、先の相場で確かめる設計 開発記録

開発記録(第1回)。AI に日本株の売買判断をさせるシステムを個人で開発しています。全体像は目次記事にまとめています。

この記事の要点

  • AI(大規模言語モデル)は、学習した時点までの相場で何が起きたかを知っています。過去の相場で判断させると、答えを知った状態の成績になります
  • そのため、AI の判断はバックテストではなく、これから先の相場での仮想売買(フォワードテスト)で確かめることにしました
  • AI を使わない部分でも、その時点では知り得なかった情報を使わないための決まりを設けています

やりたかったこと

売買ルールの検証には、バックテストを使うのが一般的です。バックテストとは、過去のデータを使って「このルールで売買していたらどうなったか」を計算することです。このシステムでも、ルールの部分はバックテストで検証しました。

最初は、AI の判断も同じ方法で検証するつもりでした。たとえば、2020年のある日の決算やニュースを AI に渡して「この銘柄を買うか」を判断させ、その後の値動きと突き合わせる、という方法です。

しかし設計を始めた初日(2026年9月14日)に、この方法は使えないと判断しました。

過去のデータで AI を検証できない理由

AI はその後の値動きを知っている

大規模言語モデルは、大量の文章を学習して作られています。その文章には、過去の相場で何が起きたかも含まれています。

2020年3月の日本株を例にします。AI は、この時期に新型コロナウイルスの影響で株価が大きく下がり、その後に回復したことを知っています。この時期の決算やニュースを渡して判断させても、AI がその知識を使わずに判断したかどうかは確かめられません。

AI から見た相場の時間軸。学習の締め切りより前は結末を知っている期間でバックテストに使えない。締め切りから今までは知らない期間だが短い。確かめられるのはこれから先の相場

このように、判断した時点では知り得なかった情報が判断に混ざることを、先読みバイアス(ルックアヘッドバイアス)と呼びます。先読みバイアスがあると、成績は実力以上に良く見えます。

「その日までの情報だけで判断して」と指示しても防げない

プロンプトで「2020年3月2日までの情報だけで判断してください」と指示することはできます。しかし、AI が学習した知識を消せるわけではありません。知識をどの程度使ったのかも、外からは分かりません。

指示どおりに判断しているように見えても、成績が良かった理由が判断の力なのか、結末の知識なのかを区別できません。

学習の締め切りより後の期間なら使えるか

AI の学習データには締め切りがあり、それより後の出来事は知りません。締め切りから今までの期間なら、AI は結末を知らないことになります。

ただ、この期間は長くても1年程度のことが多く、数日から数週間で売買するスイングトレードでは、判定に足りる回数の取引が集まりません。さらに、AI のモデルが新しくなると締め切りも動くため、同じ条件で検証し直すこともできません。

どう確かめるか:これから先の相場での仮想売買

結論として、AI の判断はこれから先の相場で確かめることにしました。実際のお金は使わず、判断どおりに売買したと仮定して損益を記録します。ペーパートレード、またはフォワードテストと呼ばれる方法です。

方法 使う期間 AI の判断の検証に使えるか 弱点
バックテスト 過去 使えない(結末を知っている)
フォワードテスト これから先 使える 結果が出るまで時間がかかる

弱点は時間がかかることです。このシステムでは、判定の目安を「3か月以上、かつ30回以上の取引」としています。

AI あり/なしの口座を同じ条件で並べる

AI の判断の効果だけを取り出すため、仮想の口座を2つ並べて動かす設計にしました。

ルールの売買シグナルを、AI の判断を通して AI ありの口座に、そのままルールだけの口座に流す。TOPIX 連動 ETF を持ち続けた場合と合わせて、3本の資産推移を比べる

口座 内容
ルールだけの口座 ルールどおりに売買する。AI の判断は一切使わない
AI ありの口座 同じルールの判断に、AI の判断を加える。資金とリスクの設定はルールだけの口座と同じ
比較用 TOPIX 連動 ETF を持ち続けた場合の資産推移

2つの口座の差は、AI の判断からだけ生まれます。AI にはルールの判断を覆す権限を持たせますが、覆してよいのはリスクを減らす方向(買わない、早めに手仕舞うなど)だけです。

AI の処理が時間内に終わらなかった日や、AI の利用枠に達した日は、AI ありの口座も「AI の判断なし」として計算します。AI が動かなかった日の分まで、AI の成績に数えないためです。

AI の見通しも答え合わせする

取引の回数が少ないうちは、売買の成績だけでは偶然の影響が大きくなります。そこで、AI が売買を提案するときに「何日後に何%動くと見ているか」と、その確信度も記録させることにしました。期限が来たら、実際の値動きと自動で照合します。

確信度が高い予測ほど当たっているかを見れば、AI の判断をどこまで信頼してよいかが分かります。この答え合わせは、実際に売買したかどうかとは別に行います。

AI を使わない部分の先読みバイアス

先読みバイアスは、AI に限った問題ではありません。ルールのバックテストでも、その時点では知り得なかった情報が混ざれば、成績は良く見えます。このシステムでは、次の決まりを設けています。

場面 起きやすい先読み このシステムの決まり
約定 その日の終値を見て判断し、同じ日の終値で買えたことにする 判断した注文は、翌営業日以降にしか約定させない
決算 引け後に出た決算を、その日の判断に使う 株価が決算に反応できる最初の営業日を計算して使う
銘柄の選定 今の市場区分(プライムなど)で、過去の対象銘柄を選ぶ その時点の売買代金と株価で選ぶ
ニュース 後から見つけた記事を、当時からあった情報として扱う 取得した時刻と出典を必ず記録する

決算は、発表の時刻によって「株価が最初に反応できる日」を決めています。実際のコードは次のとおりです(コメントの一部を省略しています)。

def reaction_date(session: Session, announced_at: datetime) -> date:
    """株価が最初に決算に反応できた営業日。

    9:00 より前の発表はその日(休場日なら次の営業日)、それ以外(場中・引け後)は翌営業日。
    """
    jst = to_jst(announced_at)
    d = jst.date()
    if jst.time() < JP_OPEN and is_trading_day(session, d):
        return d
    return next_trading_day(session, d)

取引時間中に発表された決算は、その日のうちに株価が動き始めます。ただ、1日単位のデータ(日足)で判断するバックテストでは、発表の前と後を区別できません。そのため、取引時間中の発表も翌営業日から使うことにして、安全側に倒しています。

ニュースについては、記事の公開日時を正確に判定する方法がまだ決まっていません。これは残っている課題です。

実際にどう進めているか

2026年9月時点では、ルールだけの口座を動かしている段階です。AI ありの口座は設計を終えていて、ルールだけの口座の稼働確認が済んでから実装に入ります。

ルールの部分はバックテストで検証しましたが、試した8種類とも、事前に決めた合格基準には届きませんでした。その経緯は、この連載の後の回で書きます。

AI ありの口座を動かし始めたら、ルールだけの口座との差をペーパートレード実績で公開していきます。


次回:Python で日本株の日足・開示・ニュースを毎日集める|無料のデータ源でつまずいた5点

当サイトは情報提供を目的としており、投資助言を行うものではありません。掲載している売買記録は仮想売買(ペーパートレード)であり、実際の取引の結果ではありません。投資判断はご自身の責任で行ってください。詳しくは免責事項をご覧ください。

タイトルとURLをコピーしました