Day 1の誤解
最初は「過去データを大量に食わせれば、AIが勝ちパターンを見つける」と考えていました。実際に始めると、最初に詰まったのはAIではなくMT5接続でした。ZeroMQ、TCP、ファイル通信、ログ表現、256KB制限。自動売買の現実は、モデル以前にデータを壊さず渡すところから始まります。
結論: 機械学習EAは、AIプロジェクトである前にシステム統合プロジェクトです。
短文では書ききれなかった判断の理由を、開発記録・哲学・技術・実践教訓の4シリーズで。
最初は「過去データを大量に食わせれば、AIが勝ちパターンを見つける」と考えていました。実際に始めると、最初に詰まったのはAIではなくMT5接続でした。ZeroMQ、TCP、ファイル通信、ログ表現、256KB制限。自動売買の現実は、モデル以前にデータを壊さず渡すところから始まります。
結論: 機械学習EAは、AIプロジェクトである前にシステム統合プロジェクトです。
MT5とPythonをつなぐためにZeroMQを使おうとしました。しかしmacOS/Wine環境ではDLLが読み込めず、EAの初期化前に落ちました。ここでネットワーク通信へのこだわりを捨て、ファイルベース通信へ切り替えました。洗練されてはいませんが、壊れ方が見える。監査できる。自動売買では、この泥臭さが重要でした。
JSONでローソク足を受け渡ししていたら、データが途中で切れました。原因はMQL5側のサイズ制限。FILE_BIN化とページング取得を入れて回避しました。この経験で、データ取得は「成功したように見えて壊れている」ことがあると学びました。以後、件数・範囲・hash・manifestを残す設計に寄っていきます。
BTCUSDとXAUUSDをM5で学習し、threshold_pips、特徴量、GA最適化を繰り返しました。見た目はAIトレードらしい作業です。しかし片方向にしか入らない構造バグ、ターゲット変数の偏り、MTF特徴量の欠落など、基礎的な問題が多かった。AIは、こちらが作った歪んだ問題を忠実に学びます。
M5は検証回数が多く、改善サイクルが速い。しかしBTCUSDのようなコストが重い環境では、短期の微弱な優位性は簡単に消えます。そこでH1/H4文脈を使う方向へ移りました。短期のノイズを追うより、少し大きな構造を見た方が、トレードとして成立する可能性が高いと判断しました。
上位足を入れると、相場文脈は豊かになります。しかし、確定H1/H4は遅れます。古い上位足情報を使って新規発注すると、実際の相場と判断がズレます。そこでPartial H1、H4 freshness gate、age_minutesログを入れました。上位足は強力ですが、鮮度管理なしでは危険です。
暴落で負けたことより、「なぜその判断をしたのか」を十分に再現できなかったことが痛かった。TrendFilterが初動SELLを止め、CircuitBreakerがラッチし、旧モデルがstaleなH4文脈を抱えていました。この日以降、開発の重心はモデル精度から、preflight、replay parity、監査ログへ移りました。
暴落時、TrendFilterやCircuitBreakerは損失拡大を防ぐために存在しました。しかし、勝ち筋となる初動も止めていました。ガードは多ければ安全ではありません。止めるべき負けと、通すべき勝ちを区別するため、entry_context、entry_location_quality、entry_authority_basisが必要になりました。
モデルは確率を出します。しかし、確率が高いことと、今この位置で入るべきことは別です。そこでEntryPolicy層を入れました。AIは候補を出し、EntryPolicyが文脈・構造・位置・鮮度で止める。この分離により、負け方を「モデルのせい」だけにせず、判断経路として分析できるようになりました。
BUY/SELLだけでは改善できません。同じSELLでも、trend_continuation_sell、early_reversal_sell、neutral_momentum_sellでは意味が違います。負けトレードを改善するには、まず名前が必要です。entry_contextは、売買判断を改善可能な単位に分解するための言語でした。
固定TPはトレンドの伸びを削り、固定SLは高ATRで損失を膨らませます。TIME_EXITは便利ですが、勝ちも負けも機械的に切ります。Profit Protection、仮想TP、strong trend trailing、bailoutを入れて、出口も文脈化しました。自動売買は「どこで入るか」より「どう終えるか」が難しい。
exit_price=0、realized_pnl=0、exit_reason=null、raw_profit符号の矛盾。こうした会計系のバグは、戦略そのものを誤評価させます。モデルの良し悪し以前に、損益記録が正しいことを証明しないといけません。自動売買では、会計は研究基盤です。
モデルの確率だけでは、入る場所の良し悪しを表現しきれません。そこでsweep、BOS、pullback-rebreakなどのチャート構造をEntryPolicyに入れました。これは裁量を雑に自動化する試みではなく、構造的証拠の有無をログとして残すための仕組みです。
裁量手法として魅力的でも、単独戦略として統計的に強いとは限りません。上位足で第3波が出そうな方向を決め、下位足でも1波・2波・3波の成立を待つ手法は、単独では非推奨、observe-onlyの文脈情報として扱うのが妥当でした。手法名や納得感が強くても、期待値・分散・テール依存を見ないと、売買ロジックにはできません。
MT5 exportはUTCではありませんでした。サーバー表示時刻で、米国DST基準でGMT+2/GMT+3が切り替わります。11月は01:00台が重複し、3月は1時間飛びます。ここを誤ると、Binance orderflowとの整合が壊れ、モデルは存在しない関係を学びます。
11月の重複時間は、M5なら12本ずつあるはずです。もし欠損があれば、行順だけで割り当てると後続がすべて壊れます。そこでgroup lengthをassertし、欠損時はfailさせる方針にしました。時刻処理は「多分合っている」ではなく、壊れたら止まるべきです。
直近だけでは相場を知らなすぎる。数年分を学習すれば、AIは勝ちパターンを見つけるのではないか。これが長期学習の出発点でした。2021年末からのデータを使い、h12/h6/h3、rolling/expanding、合計18モデルを比較しました。
長期データを入れると、AUCは少し良くなる一方、actionable ratioが減りました。2022年の下落、2023年の低ボラ、2024年の上昇が混ざるため、同じ特徴量でも正解が反転します。モデルは確信を失い、0.5付近の確率を出しやすくなりました。
H12は60分先を見ます。大きな波の性質は比較的残りやすい。一方、H3は15分先で、短期orderflowの性質は数ヶ月で変わります。長期データはH12には薬になり得ますが、H3にはノイズになりやすい。時間軸ごとに最適な記憶長が違いました。
H12ラベルは未来12本を見ます。Train末尾のラベルがValidation先頭の価格を使っていたら、未来情報のカンニングです。PurgeはValidationを後ろにずらすだけでは不十分で、Train末尾を削る必要があります。これを単体テストで証明する方針にしました。
長期学習の中で、H12 expanding 2022が良さそうに見えました。OOF期待値+51.42 pips、P(mean>0)=99.3%。この数字だけ見ればshadow候補です。しかし後に、このheadlineは評価器の欠陥で過大だったと分かります。
OOFの期待値と同一backtestの平均損益が桁違いでした。そこで、barrier決着したバーだけで評価していないか、連続シグナルを独立扱いしていないかを調べました。結果、どちらも問題でした。良すぎる数字は、まず評価器を疑うべきです。
i.i.d. bootstrapでは、連続したH12シグナルを独立サンプルのように扱っていました。episode単位に畳むと、+51.42 pips / P=99.3%は+1.28 pips / P=0.524へ崩れました。有意性の大半は重複計上の産物でした。
barrierに届かなかったバーも、本番ではTIME_EXITなどで決済されます。これをhorizon終端リターンからコスト込みで評価すると、期待値は負になりました。評価対象から外していたno_hitバーが、実運用ではコストを払う存在だったのです。
特徴量を62から482へ増やしました。チャート構造、orderflow slope、market phaseなどを試しました。しかし広く効いたわけではなく、alpha_momentum_coreだけが一部baselineを上回りました。特徴量を増やせば勝ち筋が出る、という単純な話ではありませんでした。
482特徴量は、独立した482個の情報ではありません。多くは同じOHLCVと公開flowの変換です。情報源の天井を超えるには、変換ではなく新しい情報層が必要です。この理解が、オプションOI/gammaの収集基盤や、Alloraのような未実装候補の監査検討へつながりました。
同じCVDやADXでも、trend_down、range、high_vol_rangeで意味が変わります。修正済み評価器で分解すると、rangeやhigh_vol_rangeは明確に負でした。レジーム情報は、勝ち筋発見より先に、負ける局面を遮断する用途で効きました。
2026年を除外し、selection 2023-2024、holdout 2025、reference 2026に分けて検証しました。結果、primary仮説は不合格。2026だけ良く見えていたことも確認されました。循環検証を避けたことで、偽陽性を止められました。
trend_alignedでは、コスト前のgrossが4年連続でおおむね+20〜23 pipsありました。しかし往復コスト24.2 pipsにほぼ食われ、netはゼロ近辺。これは「信号がない」ではなく、「信号がコストを超えない」という結論です。
OHLCV+kline flow、長期学習、特徴量拡張、レジーム限定、episode評価。ここまでやって、netで通る仮説はありませんでした。だから同じ情報源で483本目の特徴量を探すのではなく、新しい情報層へ進む判断をしました。
良い失敗とは、次に何をやらないかが明確になる失敗です。D-1 crypto momentumはfailでしたが、gross/cost、decile崩壊、momentum crash、検定力不足が分かりました。これは価値のある失敗です。
結果を見てから閾値や分割を変えると、どんな仮説も復活できます。だから事前登録でselection、holdout、OOS、ゲート、gray条件を凍結しました。自由度を減らすことが、研究を前に進めます。
未使用データは資産です。死んだ仮説を何度もOOSで見直すと、次の本命候補の確証データがなくなります。評価に使うデータと、将来の確証に残すデータを分ける規律が必要です。
120日で一番重要だった成果は、強いモデルではなく、壊れた数字を殺せる計器でした。barrier条件付き評価、i.i.d. bootstrap、時刻ズレ、feature bleed。これらを止められるようになって、初めて研究できます。
次期アルファ探索では、「誰が、なぜ、自分に負けるのか」を一文で書けない仮説を原則棄却しました。汎用MLでなんとなく当てる、はもうやらない。相手の一文がない仮説は、探索の沼になりやすいからです。
どれだけ綺麗な信号でも、コストを超えなければ戦略になりません。だから次の探索では、手法より先にコスト構造を見ます。BTCUSD M5でgross≈costを見た後は、これは必須の順序です。
AIエージェントは実装を速くしますが、嘘の成功も速く作ります。テストが薄い、評価器が壊れている、前提がズレている。だから、AIに任せるほど、事前登録・テスト・監査ログが必要になります。
何度も外部意見で計画を修正しました。Purgeのoff-by-one、episode bootstrap、2026 reference格下げ、Deribitブロックの誤認。レビューで面倒な指摘を潰したことで、実弾事故を減らせました。
BTCオプションdealer positioningを見ようとして、Deribit直接APIを前提にしました。しかし日本居住者へのサービス停止が分かり、OKX/Binance proxyへピボットしました。データ入手性も仮説の一部です。
OHLCVと公開kline flowの変換を増やしても、情報天井を超えにくい。次に測るべきは、オプションOI/gammaなど、これまで使っていない情報層です。Allora集約予測は未実装の検討候補として、時刻契約と増分情報を監査してから扱います。
どの入力を、いつ、どの変換で、何行作ったか。これを残すだけで、後から検証できる範囲が大きく変わります。データ生成のmanifestは、機械学習トレードの防犯カメラです。
学習時のOHLCV/CVDと、本番でMT5から計算した値が一致していない問題がありました。モデルは学習時と違う世界を見ていた。parity監査なしでは、これはなかなか見つかりません。
SHAPはモデルが何を見たかを教えてくれます。しかし、入力データやラベルや評価器が壊れていれば、SHAPは壊れた世界の説明をしているだけです。説明可能性は、正しいデータ契約の上にしか立ちません。
AUCが上がっても、運用閾値を超えるシグナルがほぼゼロなら使えません。長期学習でH6/H3が慎重になりすぎた時、actionable ratioが問題を示していました。
閾値0.60を超えたら入る、という固定閾値は分かりやすい。しかしスコア分布が年ごとに動けば、同じ0.60の意味が変わります。閾値選定はselectionで凍結し、holdoutで1回だけ見る必要があります。
上位1%だけが良いモデルは、魅力的に見えます。しかしデータ分布が少し動くと崩れます。p95まで緩めても期待値が正かを見るのは、tail依存を殺すためです。
MarketPhaseを入れれば解決、とはなりませんでした。同じ価格系列から作った特徴量は、新しい情報を増やすわけではありません。効く場合もありますが、情報源の天井は超えにくい。
すべての部品が利益を生む必要はありません。rangeで負けることが安定して分かるなら、それは遮断filterとして価値があります。ただし、遮断後に正の戦略になるかは別問題です。
仮説が全滅した時にどうするかを、結果を見る前に書いておく。これをしないと、失敗後に新しい理由をつけて探索を続けてしまいます。撤退基準は、研究のブレーキです。
models/に何でも置くと、将来どれが本番候補か分からなくなります。ゲートとOOSを通ったものだけを置く規約を作り、旧モデルはarchiveへ退避しました。
最初に作るべきものは高性能モデルではありません。データ取得、時刻正規化、parity監査、backtest/live一致確認、コスト計算です。ここが壊れると、モデルは全部嘘を学びます。
コストは入っているか。時刻ズレはないか。ラベルリークはないか。重複horizonを独立扱いしていないか。未決着トレードを除外していないか。まずここです。
それは新しい情報源か、それとも同じ価格系列の別変換か。後者なら、情報量の上限はあまり変わらない可能性があります。特徴量数ではなく、情報源を見ます。
モデルが弱いのではなく、ラベルが実売買とズレている。評価器が条件付きになっている。コストを軽視している。時刻がズレている。このどれかが多いです。
モデル確率、entry_context、止めた理由、通した理由、構造証拠、上位足鮮度、exit_reason、実損益、データ時刻。後から説明できない判断は改善できません。
勝率が高くても、負けが大きければ意味がありません。AUCが高くても、コスト後期待値が負なら意味がありません。評価軸をトレードの現実に寄せる必要があります。
短期ほどシグナルは多いですが、コストとノイズに弱い。H3のような15分先予測では、古いデータがノイズになりやすい。短期モデルほど、記憶の賞味期限が短いです。
長期ほどコスト比は改善しますが、ラベルの不確実性とレジーム混在が増えます。長い時間軸も簡単ではありません。敵の種類が変わるだけです。
単純EAはルールを固定します。機械学習EAは、ルール候補の確率と文脈を学習します。ただし、最終判断には構造・リスク・コストのガードが必要です。
AIは勝ちパターンを自動で見つけてくれる魔法ではありません。むしろ、間違ったデータ・間違った評価・間違ったコスト前提を、もっともらしい数字に変える装置にもなります。