Build in public · 開発記録

嘘の勝ちを、殺す。

機械学習の自動売買システムを、120日で作った。
分かったのは──勝てるAIを作るより先に、負けを正しく測れる計器を作らないといけない、ということだった。

期間 120日 対象 BTCUSD / XAUUSD / USDJPY 他 手法 LightGBM × MT5 連載 短文120・長文60・記事20

Thesis / この記録の主題

「AIなら勝てる」は幻想でした。120日やって分かったのは、AIより先に必要なのは、データ・時刻・コスト・検証器の正しさだったということです。

自動売買で一番怖いのは、負けることではありません。なぜ負けたのか分からないまま、次の修正をしてしまうことです。この連載は、勝ちパターン探しの旅というより、AIが嘘をつかない環境を作る旅の記録です。

「勝てるモデル」を作る前に、「勝てない理由を分解できるシステム」を作る必要がありました。

The Journey / 12章の道のり

接続地獄から、評価器の崩壊まで

派手な成功譚ではありません。詰まった所、壊れた会計、止まらなかった暴落、そして一番効いた「地味な正しさ」を、順番に残します。より詳しい長文は深掘り60、まとめ記事は記事20へ。

01

なぜ機械学習EAを作ったのか

相場の判断を、感覚ではなく再現可能な検証単位に分解したかった。

  • 「AIなら勝てる」は幻想でした。先に必要なのは、データ・時刻・コスト・検証器の正しさでした。
  • この開発で一番増えたのは、勝ちトレードではなく、失敗を分類する言葉でした。
  • 120日後に残った結論は厳しい。OHLCVと公開kline flowだけでは、BTCUSD M5のエッジはコストにほぼ食われました。
02

MT5接続地獄

最初の敵はモデルではなく、外部システムと正しく会話することだった。

  • ZeroMQはWine/macOSでDLLが読めず、EAのOnInit前に死にました。かっこよさより壊れにくさを優先し、ファイル通信へ。
  • MQL5の256KB制限でJSONが切断。AI以前に、データが途中で壊れていました。以後「大きなデータは必ず壊れる前提」に。
  • 他EAのポジションを触らないことは、利益を出すことより先に守るべき安全条件でした。
03

最初のモデルとM5スキャル

機械学習トレードらしい出発点。でも土台がまだ弱かった。

  • 初期モデルには片方向にしか入らない構造バグが。BUY/SELLの対称性すら壊れていました。
  • M5スキャルは取引回数が多く検証も速い。しかしコストに一番弱い時間軸でもありました。
  • 「モデル精度改善」は危険な言葉です。実売買損益と一致しているかを定義しないと意味がありません。
04

M5からH1/H4文脈へ

短期ノイズより大きな波へ。すると今度は上位足の鮮度と出口が難所に。

  • H1/H4を入れるほど、時刻の正しさが重要になります。5分のズレが上位足文脈のズレになります。
  • 古い上位足情報で新規発注するリスクを止めるため、H4 freshness gate を入れました。
  • 時間軸を長くすれば簡単になるわけではない。短期はコスト、中期は出口、長期はレジーム混在が敵でした。
05

4/2暴落インシデント

損失より痛かったのは、「システムが何をしたか検証しきれない」ことだった。

  • 初動のSELLをTrendFilterが止め、その後CircuitBreakerがラッチ。安全装置が、勝ち筋も止めていました。
  • ガードは増やせば安全になるわけではない。止めるべき負けと、通すべき勝ちを分ける必要があります。
  • 以後、開発の中心はモデル精度から評価基盤と監査性へ。Live Preflight と Replay Parity を導入。
06

方向予測から path barrier へ

上がる/下がるではなく、TP/SLのどちらに先に届くか。実運用に近づけるほど難しくなる。

  • ラベルを実売買に近づけるほど、AUCは伸びなくなります。でも、それが現実に近い評価です。
  • path barrier化は、機械学習EAを「予想屋」から「取引候補の評価器」へ近づける変更でした。
  • 正しい方向でしたが、評価器まで正しくしないと、強い数字を“作れて”しまいます。
07

AIを直接発注させない

モデルは確率を出すだけ。入るかは文脈・位置・構造・鮮度・リスクで決める。

  • 文脈がないエントリーは改善できません。負けても「BUYが悪い」しか言えないからです。
  • Fresh entry、contra_regime、post_tp_continuation。名前を付けると、負け方が見えるようになります。
  • 勝ちパターンを探す前に、負けパターンに名前を付ける。EntryPolicyはそのための言語でした。
08

出口、会計、リスク制御

入口より難しかった出口。そして、会計が壊れると全評価が信用できなくなる。

  • exit_price=0、realized_pnl=0の誤会計もありました。売買ロジック以前に、決済確定の扱いが壊れていた。
  • raw_profitの符号が価格方向と矛盾。会計が壊れると、バックテストもライブ評価も信用できません。
  • 損益は入口の賢さだけでなく、出口・会計・ロット・監査の総合点です。
09

チャート構造と波形文脈

裁量の「ここは入れる」を機械へ。納得感が強くても、統計的には弱いことがある。

  • 方向が合っていても、構造が弱い場所では入らない。裁量の言語を機械に近づける試みでした。
  • 裁量手法をそのままEAにすると、期待ほど勝てません。テール依存になりやすいからです。
  • observe-onlyでログに出し、後から検証する。いきなり売買に反映しないのが安全でした。
10

時刻同期の罠

MT5 exportはUTCではなかった。1本のズレが、特徴量の意味を壊す。

  • サーバー表示時刻で、米国DST基準でGMT+2/GMT+3が切替。11月のDST終了では01:00〜01:55が2回出ます。
  • 最も怖いのは、ズレていてもモデルが学習“できてしまう”こと。数字が出るからこそ危険です。
  • 時刻契約が崩れると、モデルは存在しない関係(偽アルファ)を学びます。
11

長期学習と18モデル

数年分を食わせれば勝ちパターンは見えるのか? 結果は単純ではなかった。

  • AUCは少し良くなる一方、actionable ratioは大きく減少。矛盾する相場を見すぎ、確率が0.5付近へ寄りました。
  • H12は長期と相性が良く、H3は長期化で信号が消えやすい。時間軸で記憶の賞味期限が違いました。
  • 最大の成果は強いモデルではなく、評価契約とPurge監査を厳密にしたことでした。
12

headlineの崩壊

一度、有望に見えた数字。それは「本番では知り得ない条件付き評価」だった。

+51.42 pips
当初のheadline(barrier決着バーのみ / i.i.d.)
+1.28 pips
episode単位で再評価(P=0.524)。未決着まで含めると負に。
  • 重複horizonの系列相関を無視すると、モデルは強く見えます。実際の取引機会はそんなに独立していません。
  • 痛い結果でしたが、評価器が信用できるようになった瞬間でもありました。

Conclusion / 120日の結論

勝つAIより先に、嘘の勝ちを殺せる評価器が必要でした。
headlineが死んで、ようやく本当の研究が始まりました。

この120日で残ったのは、派手な必勝法ではありません。仮説・失敗・撤退判断をログに残し、偽陽性を事前登録で止め、OOSを燃やさず、実測コストを最初に置く──そういう規律でした。次は、その計器の上で、生き残った仮説だけを慎重に検証していきます。

続きを読む → 深掘り60(開発記録・哲学・技術・実践教訓) / 記事20(テーマ別まとめ)