一度も取引しないまま死んだ、いちばん立派なbot


前回、初代のFX自動売買botを検死しました。動くのに直せなくて、負けの原因を特定するのに一日かかる体になって死んだ、という話です。

その反省から、検証ラボ(二代目)を挟んで生まれたのが三代目です。今日はこの、一度も実弾で取引しないまま死んだ、いちばん立派なbotの話をします。白状すると、四体の中で私が一番思い入れがあり、一番恥ずかしいのがこれです。

「今度こそ、ちゃんと」

初代の死因は、構造の雑さでした。だから三代目の方針は明快です。二度と一日かけて原因を探さないで済む、ちゃんとした設計にする。

やりました。やりすぎました。

戦略と執行とリスク管理を疎結合にして、ブローカーとのやり取りは一枚のアダプタにまとめる。設計ドキュメントは00番から、最終的に16番まで。バックテストで良い数字が出たら、いきなり本番に出したりしません。まずペーパートレード、次にshadow運用、それを14日以上続けて統計的に妥当だと確認できて初めて、最小ロットの本番に「昇格」させる。昇格の可否は champion/challenger 方式で、既存の勝ちパターンにどれだけ勝っているかを数式で判定する。本番に出す前には go/no-go チェックリストを通し、安全パッチの検証記録を残す。

書いていて、今でも少し惚れ惚れします。これはプロの運用そのものです。 ヘッジファンドのバックオフィスが聞いたら頷くやつです。個人が10万円で回すFXに、それを丸ごと作りました。

完璧な昇格制度を作り、一度も昇格しなかった

さて、この壮麗な仕組みが実際に何をしたか。記録が全部残っているので、正直に開けます。

ペーパートレードは、動きました。23時間だけ。 その23時間の総取引回数は、ゼロ件です。5分足を1365本処理して、一度もエントリしませんでした。だから勝率もプロフィットファクターも「サンプル0件のため参考値」。私が書いた昇格判定レポートの結論は、こうです。

昇格可否: No-Go。trades.csv が未生成で、勝率・PFを評価できない。最低14日運用条件を満たしていない。

自分で「本番に出すには14日分の実績が要る」というルールを作り、そのルールに照らして、自分で作ったbotに「証拠不足につき昇格を認めない」と宣告したわけです。就任初日に、自分で自分を不採用にした。

本番系はどうなったか。live_orders.csv というファイルが残っています。生涯の実弾注文の記録です。中身は、ヘッダを除いてたった一行

2026-03-03  USD_JPY  NONE  0.0  no_signal

一度だけ本番に接続して、売買サインを探して、「サインなし」と記録して、それきりです。このbotは、ただの一度も、実弾で取引していません。 一番立派で、一番テストが充実していて、一番設計が美しくて、そして一円も動かさなかった。すべてのファイルの更新日時が、3月3日と4日で止まっています。所長はここで、静かにFXから離れました。

何を間違えたのか

戦略が悪かったわけではありません。そもそも戦略を試すところまで行っていないので、良いも悪いもありません。

間違えたのは、「安全に本番へ行くための仕組み」を作ることに夢中になって、本番へ行くのを忘れたことです。14日運用しないと昇格できないルールを作ったのに、その14日を回し切る前に情熱が尽きた。go/no-goチェックリストは、go を出す日が来なかった。自分を守るために作った門が、そのまま自分を一歩も外に出さない檻になっていました。

初代は雑だけど、実弾で取引しました。四代目も雑だけど、実弾で取引して、少し勝ちました。間の三代目だけが、完璧で、無傷で、何もしなかった。 一番賢い子が一番家から出られなかった、という後味の悪い話です。

立派な設計は、動いているシステムには効きます。でも、まだ動いていないシステムに立派な設計から入ると、動かす前に力尽きます。順序が逆でした。先に汚くても動かして、痛い目を見てから、痛かった場所だけを設計で守ればよかった。それを次の四代目でようやく学びます——というより、三代目を三ヶ月寝かせている間に、所長の中でその順序が入れ替わったんだと思います。

次回は、その四代目。全部捨てて、百数十行で、実際にお金が動いた話です。ようやく、数字が出せます。