「年率63%!これはすごい戦略ができた!」
そう思った瞬間が、私の最大の失敗の始まりでした。
今回は、AIと一緒にトレーディングシステムを作る中で遭遇した3つの失敗談をお話しします。特に「先読みバイアス」という、見た目は完璧なのに実際には使えない戦略になってしまう罠について、詳しく書きます。
AIは確かに便利ですが、万能ではありません。人間の直感と、仕組みで防ぐ工夫が必要でした。
失敗①:未来が見えていた戦略(先読みバイアス)
年率63%という異常な数字
バックテストのv4(バージョン4)を回したとき、結果は衝撃的でした。
• 年率リターン:63.27%
• 勝率:56.2%
• 最大ドローダウン:-18.3%
普通は年率10-15%。これは明らかに異常。
普通、年率10-15%出れば優秀な戦略です。プロの運用でも20%を超えれば一流。それが63%。しかもドローダウン(最大の損失幅)は20%未満。
「天才か?」と一瞬思いましたが、すぐに冷静になりました。うまくいきすぎている。何かがおかしい。
バグを疑った理由
実は、このバージョンで大きな変更を加えていました。それは「ポジションサイズの計算方法」です。
以前は固定金額で売買していましたが、v4では株価に応じて調整するようにしました。高い株は少なく、安い株は多く買う。リスクを均等にするための工夫です。
でも、このロジックを組み込んだ瞬間に成績が跳ね上がった。変更と結果のタイミングが一致しすぎていました。
発見:未来の情報を使っていた
コードをじっくり見直しました。そして見つけたのが、この一行。
# ポジションサイズ = 目標金額 ÷ 当日の終値
一見、何も問題なさそうに見えます。でも、よく考えてください。
当日の終値は、取引する時点ではまだ見えていません。
私の戦略は「寄り付き(朝の取引開始時)で買う」というものです。朝9時の時点で、その日の夕方15時につく終値はわかりません。でも、バックテストでは「当日の終値」を使って計算していたのです。
これを「先読みバイアス(ルックアヘッドバイアス)」と言います。未来の情報を使ってしまうバグです。
具体例で見る怖さ
例えば、ある株が:
- 前日終値:1,000円
- 当日始値:1,050円(+5%ギャップアップ)
- 当日終値:1,100円(さらに上昇)
私のバグったコードは、1,100円でポジションサイズを計算していました。つまり、「1,100円になると知っている」前提で、1,050円で買う判断をしていたのです。
当然、勝率は上がります。でも現実には、朝の時点で夕方の終値はわかりません。
修正内容:全部前日ベースに
この発見から、徹底的に修正しました。
修正前:
- ポジションサイズ → 当日終値で計算
- ストップロス判定 → 当日の値動きで判断
- 決済 → 当日の終値で即日決済
修正後:
- ポジションサイズ → 前日終値で計算
- ストップロス判定 → 前日引け値基準で判断
- 決済 → 即日ではなく翌日の寄り付きで決済
つまり、「今見えている情報だけ」で判断するように変えました。
修正後の結果:年率31%
修正版を走らせました。結果は:
- 年率リターン:31.48%
- 勝率:52.1%
- 最大ドローダウン:-24.7%
63%から31%へ、ほぼ半減しました。
ショックでした。でも、これが本当の実力です。それでも年率30%なら十分優秀な戦略です。大事なのは、「現実に再現できる数字」であることでした。
なぜ発見できたのか
実は、私はAIに「自動レビュー機能(Skills)」を仕込んでいました。コードを書くたびに、AIが自動でチェックリストを走らせます。
その中に、こういう項目がありました:
- 「未来の情報を使っていないか?」
- 「取引時点で見えるデータだけで判断しているか?」
- 「タイムスタンプは正しいか?」
AIがこのチェックリストで警告を出してくれたので、怪しい部分を重点的に調べることができました。
もしこの仕組みがなかったら、「年率63%の天才戦略!」と勘違いして、実際のお金を投入していたかもしれません。結果は大損です。
先読みバイアスの怖さ
この失敗で学んだのは、先読みバイアスの本当の怖さです。
- バックテストの見た目は完璧
- エラーも出ない
- コードも一見正しく見える
- でも、現実では絶対に再現できない
完璧に見えるからこそ、気づきにくい。だからこそ、致命的です。
失敗②:決算で3,100円が消えた話(決算跨ぎ事故)
ある朝の衝撃
2026年2月12日の朝、ペーパートレード(仮想の取引)のログを見て、絶句しました。
5016 JX金属:
想定エントリー価格2,779円 → 実際の計算価格3,100円
差額321円(+11.5%のズレ)
何が起きたのか。2月10日の引け後、JX金属が決算を発表していました。内容が良かったのですが、翌11日は祝日で市場は休み。2月12日の朝、寄り付きで大きくギャップアップ(窓を開けて上昇)したのです。
私の戦略は「下がった株を拾う逆張り」です。想定していた2,779円なら妥当な買い場でした。でも、いきなり3,100円でスタートされたら、もう買い場ではありません。高値掴みです。
原因:2つのミス
調査した結果、2つのミスが重なっていました。
ミス1:決算カレンダーの未設定
決算発表日を回避する仕組みは一応ありました。でも、データベースに決算日が入っていませんでした。仕組みはあるのに、データがない。意味がありませんでした。
ミス2:発注日の1日ズレバグ
コードに微妙なロジックミスがあり、「決算発表の翌日」を「前日」と誤認識していました。だから、決算翌日の大ギャップアップに突っ込む形になっていました。
不幸中の幸い:ペーパートレード中だった
この事故が起きたのは、まだペーパートレード(仮想の取引)中でした。実際のお金は動いていません。
もし実運用に入っていたら、本当に3,100円で買い注文が入っていたかもしれません。損失は数十万円です。
ペーパートレードは面倒です。でも、こういう事故を実弾前に発見できるから、やる価値があります。
対応:決算データを全部入れた
まず、決算カレンダーのデータを整備しました。
- 過去10年分の決算発表日:157,716件
日本取引所グループ(JPX)が公開している決算短信データを全部取り込みました。これで、「決算前後は取引しない」ルールが機能するようになりました。
意外な発見:決算回避は逆効果だった
せっかく15万件以上のデータを入れたので、決算の影響を統計的に分析してみました。
すると、意外な結果が出ました。
「決算前に取引を避ける」は、逆張り戦略では逆効果だった。
普通は「決算はギャンブルだから避けろ」と言われます。でも、私の戦略は「下がった株を拾う逆張り」です。
決算で大きく下がった株(ギャップダウン)は、実は良質なエントリーシグナルでした。過剰反応で売られすぎた株が、その後リバウンドするケースが多かったのです。
直感に反する結論でしたが、データは明確でした。
結局、「決算前は避ける」ルールは外し、「ギャップアップの日は避ける(高値掴みを防ぐ)」ルールだけ残しました。
教訓:直感とデータは違う
この失敗で学んだのは、「直感で決めずに、データで検証する」ことの重要性です。
- 直感:「決算は危険だから避けるべき」
- データ:「逆張り戦略では決算ギャップダウンは良い機会」
もしデータを見ずに直感だけで決めていたら、逆に収益機会を失っていました。
失敗③:3%のデータで180度違う結論が出た話
最初の分析:「決算はプラスイベント」
決算の影響を最初に分析したとき(v1)、データ量は4,966件でした。
結果は:
- 決算前後で買った銘柄のリターン:+2.3%
- 決算を避けた銘柄のリターン:+1.8%
「決算はプラスイベントだ。積極的に狙うべき」という結論でした。
データを増やしたら結論が反転
でも、気になったので全期間のデータを取り込みました(v2)。件数は157,716件。元の31倍です。
結果は:
- 決算前後で買った銘柄のリターン:+1.1%
- 決算を避けた銘柄のリターン:+1.9%
結論が真逆になりました。
最初の4,966件は、全体の約3%でした。たった3%のサンプルで判断していたら、間違った結論にたどり着いていました。
なぜこんなことが起きたのか
おそらく、最初の4,966件は「データが取りやすかった期間」に偏っていました。具体的には、比較的相場が良かった2020-2022年あたりです。
この期間は全体的に株価が上がりやすく、決算後のギャップアップも多かった。だから「決算はプラス」という結論になったのでしょう。
でも、全期間(2015-2024年)で見ると、リーマンショック後の調整やコロナショックなど、厳しい相場も含まれます。すると、決算のギャップダウンによるダメージも大きくなり、結論が変わりました。
データ量が結論を変える
この経験から学んだのは:
- サンプル数が少ないと、結論が偏る
- データの期間が偏ると、結論が偏る
- 「とりあえず分析した」では足りない
統計の教科書には「サンプルサイズが大事」と書いてありますが、実際に体験すると、その重要性が骨身に染みます。
AIは万能じゃない。でも、仕組みで防げる
AIが見逃すミス
今回の3つの失敗、実はどれもAIが最初に書いたコードに含まれていました。
- 先読みバイアス:AIが「当日終値でサイジング」と書いた
- 決算跨ぎ:AIが決算カレンダーのセットアップを忘れた
- データ偏り:AIが「とりあえず取れたデータで分析」と提案した
AIは便利です。でも、致命的なミスを見逃します。
仕組みで防ぐ3つの工夫
だからこそ、私は3つの仕組みを作りました。
①ルール文書(CLAUDE.md)
AIに渡す指示書です。こういう項目を書いています:
- 「未来の情報を使ってはいけない」
- 「タイムスタンプは必ず前日以前にする」
- 「決済は翌日寄り付き以降にする」
これを毎回AIに読ませることで、同じミスを繰り返さないようにしています。
②自動レビュー(Skills)
AIがコードを書いたら、自動でチェックリストを走らせます。
- 先読みバイアスチェック
- データ範囲チェック
- タイムスタンプ検証
人間がレビューする前に、AIが自分で自分をチェックする仕組みです。
③ペーパートレード
どんなに注意しても、バグは出ます。だから、実際のお金を使う前に、仮想の取引で検証します。
JX金属の事故も、ペーパートレード中だったから実害ゼロでした。もし実運用だったら、数十万円の損失でした。
まとめ:失敗から学ぶ
3つの失敗から得た教訓
失敗①:先読みバイアス
- うまくいきすぎているときこそ疑え
- 未来の情報を使っていないか、徹底的にチェック
- 自動レビューの仕組みが命を救う
失敗②:決算跨ぎ事故
- 仕組みはあってもデータがなければ意味がない
- 直感とデータは違う。検証が必須
- ペーパートレードは面倒でも絶対やる
失敗③:データ量で結論が反転
- サンプル数が少ないと結論が偏る
- できる限り全期間のデータを使う
- 「とりあえず」の分析は危険
AIは道具。使い方が全て
AIは確かにすごいです。私一人では絶対に作れなかったシステムを、数ヶ月で作れました。
でも、AIは万能ではありません。致命的なミスも平気で見逃します。
だからこそ:
- ルール(CLAUDE.md)で制約を与える
- 自動レビュー(Skills)でセルフチェックさせる
- ペーパートレードで実弾前に検証する
- 失敗を文書化して同じミスを繰り返さない
この4つの仕組みがあるから、私はAIを信頼して使えています。
失敗は恥ずかしくない
正直、この記事を書くのは恥ずかしいです。「年率63%のはずが31%でした」なんて、失敗を晒しているようなものです。
でも、失敗から学ぶことのほうが、成功から学ぶことより多い。
そして、私の失敗を共有することで、誰かが同じ失敗を避けられるなら、それは価値があると思います。
💭 バックテストで失敗した経験はありますか?
感想・質問はこちら → @daisuki_koshian