AI生成の売買コードで最初に潰す3つの穴

利食安男「動いても安心できない穴3つ」

生成AIに「移動平均のクロスでエントリーして、ATRの2倍で損切りするコードを書いて」と頼むと、数十秒で動くスクリプトが返ってきます。エラーも出ず、バックテストの損益曲線まで描画される。ここで多くの人がつまずくのは、コードが間違っているからではなく、間違っていないように見えるからです。

この記事では、AIに売買ルールのコードを書かせたときに繰り返し現れる3種類の欠陥と、それを自分で検出するための手順を整理します。結論を先に言えば、確認すべきは「未来参照」「執行の前提」「時刻とデータ境界」の3点です。いずれも損益曲線を眺めるだけでは見つかりません。意図的に壊しにいくテストが要ります。

なぜAIのコードは「もっともらしく動く」のか

生成AIは、大量のサンプルコードの統計的なパターンから出力を組み立てます。バックテストのコードは世の中に大量にあり、その多くが初学者向けの簡略版です。つまり簡略化された前提ごと学習されていると考えたほうが自然です。

加えて、AIは指示されなかった前提を勝手に埋めます。「スプレッドをどう扱うか」「シグナル確定とエントリーのタイミングをどうずらすか」を明示しなければ、AIは最も書きやすい形、つまり最も有利に見える形で埋める傾向があります。悪意ではなく、それが典型的なサンプルコードの形だからです。

この性質は、AIの出力を「仮説の下書き」として扱い、検証を人間側に残すという方針と相性が良い一方、そのまま回すと危険です。この境界線についてはAIのチャート読みは「仮説生成」までが安全圏でも触れた通りで、コード生成でも同じ構図が当てはまります。

落とし穴1:未来参照 — まだ知り得ない値を使っていないか

未来参照(ルックアヘッド・バイアス)とは、その時点ではまだ確定していない情報を使って過去の売買判断を下してしまうことです。現実には取れない成績が出るため、バックテストだけが異常に綺麗になります。

典型的なパターンを整理します。

パターン 何が起きているか
同一バー内の判定と約定 その足の終値でシグナル判定し、同じ足の始値や安値で約定させている
シフト忘れ 指標計算の結果をずらさず、当該足の終値を含む値で当該足を売買している
全期間の統計量での正規化 データ全体の平均・標準偏差で標準化しており、将来の分布を過去に混ぜている
リペイント系の指標 後からピークや谷が確定する種類の指標(ジグザグ系など)を、確定済みとして扱っている
最高値・最安値の参照 期間内の高値/安値を使うロジックで、計算期間の終端が現在以降に及んでいる

検出のための3つのテスト

  1. 切断テスト:データを全期間で流した結果と、途中(たとえば全体の7割の地点)で打ち切って流した結果を比べます。打ち切り前の区間のシグナル列が1本でも変われば、未来の情報が混入しています。
  2. 1本ずらしテスト:全シグナルを意図的に1バー遅らせます。成績が緩やかに劣化するだけなら許容範囲ですが、プラスからマイナスへ裏返るほど崩れるなら、そのエッジは実行可能性より時点の細かさに依存しています。関連する考え方は確定足を1本待つのは「フィルタ」ではなく「コストの付け替え」であるで扱いました。
  3. 将来列の破壊テスト:判定に使っている時点より後のデータを、乱数や定数で上書きしてから再実行します。成績が変わるなら、後の情報を読んでいる証拠です。

AIにコードを書かせる段階では、「エントリーは、シグナルが確定したバーの次のバーの始値で執行する」と明示的に指定しておくと、少なくとも最も多い形の混入は減らせます。ただし指定しても別の箇所で混ざることがあるため、上の3テストは省略できません。

落とし穴2:執行の前提 — その価格で約定したことになっていないか

2つ目は、約定の扱いです。AIが生成するバックテストは、多くの場合「終値ちょうどで、必ず、希望数量が約定する」という前提で書かれます。現実にはスプレッド、スリッページ、約定拒否、部分約定があります。

確認すべき項目を並べます。

  • スプレッドの扱い:買いと売りで異なる価格を使っているか。ビッド系列だけで往復させていないか。
  • 手数料とスワップ:コード内で加算されているか。ゼロのまま放置されていないか。
  • 注文種別:成行のつもりが指値になっていないか。逆指値(ストップ)が指値として処理され、不利な側でなく有利な側で約定していないか。
  • 同一バー内で損切りと利確の両方に触れた場合:どちらが先に成立した扱いか。有利な側を優先していると成績は体系的に過大評価されます。保守的には不利な側を優先します。
  • ポジションの重複:既にポジションがあるのに新規が積み上がっていないか。想定していないロット膨張が起きていないか。

検出手順はシンプルです。コスト感応度を測ること。往復コストを0から段階的に引き上げ、損益がどこでゼロを割るかを記録します。たとえばコストを1pips刻みで上げていき、2pipsで利益が消えるなら、その戦略は実効コストの変動に対してほぼ無防備だと分かります。実効コストの考え方そのものは口座はスプレッドでなく実効コストで選ぶで整理しています。

もう一つ有効なのが、約定ログの目視です。全件は無理でも、ランダムに10〜20件抜き出して、その時刻のバーの高値・安値の範囲内に約定価格が収まっているかを確認します。範囲外の価格で約定している取引が1件でもあれば、執行ロジックに穴があります。

落とし穴3:時刻とデータ境界 — バーの時刻は何を指しているか

3つ目は地味ですが、影響が広範囲に及びます。バーに付いているタイムスタンプが「そのバーの開始時刻」なのか「終了時刻」なのかで、1本分のずれが発生します。1時間足なら1時間、日足なら1日の未来参照に化けます。

確認項目 見るべきこと
タイムスタンプの規約 開始時刻か終了時刻か。データ提供元の仕様と、コードの前提が一致しているか
タイムゾーン UTCか、サーバ時間か、現地時間か。複数ソースを結合するとき統一されているか
夏時間の切替 切替週に1時間ずれたバーが発生していないか。セッション判定が崩れていないか
日足の区切り どの時刻を日替わりとするか。区切り位置で日足の形は変わる
ウォームアップ期間 長期移動平均などの計算に必要な本数が揃う前の区間を、集計から除外しているか
欠損と休場 欠損バーを前値で埋めていないか。埋めた値で売買が成立していないか

特に注意したいのが欠損の補完です。AIは欠損データに対して前方補完(直前の値で埋める)を自動的に入れることがあります。埋めた値は実在しない価格なので、そこで約定した取引は全て架空です。

セッションや時間帯を条件に組み込む戦略では、ずれがそのまま結果を反転させます。時間帯の効果を扱うときの前提整理はセッション別の「性格差」は信じる前に自分のデータで測り直すも参考になります。

3つを潰しても残るもの、そしてこの手順が効かない場面

上の3点を全て確認しても、それは「コードが仕様どおりに動いている」ことの確認にすぎません。仕様そのものが過去に合わせ込まれている問題は別途切り分ける必要があります。パラメータ探索を繰り返した結果としてのカーブフィットは、未来参照を全て除去した綺麗なコードでも普通に起こります。この切り分けはバックテストが崩れるのは「未来が違う」からではないで扱った観点と組み合わせてください。

また、ここで挙げた検証手順が機能しにくい条件もあります。

  • 取引回数が極端に少ない戦略:コスト感応度テストも1本ずらしテストも、サンプルが数十件しかなければ差が偶然に埋もれます。回数が足りないときは、検証結果の符号を信じないほうが安全です。
  • ティック精度が本質的に必要な戦略:バー内の約定順序が成績を左右するスキャルピング的なロジックでは、バーデータでの検証自体に限界があります。穴を潰しても精度は上がりません。
  • 流動性が薄い時間帯や銘柄:約定の前提が崩れやすく、ヒストリカルデータの気配値と実際に出せる注文の乖離が大きくなります。コストを一定値で置くモデル自体が合いません。
  • イベント直後のような特殊局面:執行コストが支配的になる時間帯では、平均的なコスト仮定が無意味になります。

まとめ

AIに売買ルールのコードを書かせるとき、確認すべきは次の3点に集約されます。

  1. 未来参照:切断テスト、1本ずらしテスト、将来列の破壊テストで混入を検出する
  2. 執行の前提:コスト感応度を段階的に測り、約定ログを抜き取りで目視する
  3. 時刻とデータ境界:タイムスタンプの規約、タイムゾーン、ウォームアップ、欠損補完を確認する

いずれも「損益曲線が綺麗かどうか」では判定できません。むしろ、綺麗すぎる曲線はこれら3点のどこかが抜けているサインとして扱うほうが実務的です。AIが生成したコードは、動くかどうかではなく壊したときにどう壊れるかで評価してください。

最後に注意点です。本記事は検証手順の整理であり、特定の売買手法や将来の値動きについて述べるものではありません。バックテストで良好な結果が出たとしても、将来の成績を保証するものではなく、相場環境の変化によって損失が発生する可能性があります。実資金での運用判断は、ご自身の責任と資金管理のもとで行ってください。

この記事は情報の提供を目的としたもので、特定の金融商品の売買をすすめるものではありません。売買の判断は、ご自身の責任で行ってください。(運営者情報)

運営者を応援する

AIとトレード の他の記事

AIとトレード

AI要約が落とす6つの情報と確認手順

AI要約では条件節・程度表現・発言者の属性・時点・比較基準、そして「書かれなかったこと」が構造的に落ちます。抜けやすい6類型の一覧と、原文に戻る確認手順、要約が機能しない相場条件を整理しました。