
【失敗談】自動売買ボットが1ヶ月以上まったく取引しなかった話
※本記事にはアフィリエイト広告(プロモーション)が含まれています。
自動売買ボットの失敗談というと「大損した話」を想像するかもしれませんが、実際に私が経験したのは真逆でした。ボットが1ヶ月以上、ただの一度も取引をしなかったのです。
症状: ログは正常、でも取引はゼロ
ボットは毎日ちゃんと動いていました。
- サービスは稼働中、エラーもなし
- 15分ごとに価格データを取得して、モデルの再学習も定期実行
- 毎時のサマリー通知も届く
それなのに、取引だけが一切発生しない。「今は相場が悪いから待機しているんだろう」と思って放置していましたが、あまりに続くのでログを徹底的に調べました。
原因: エントリー条件の「二重ゲート」
私のボットは機械学習モデル(LightGBM)が出す「上がる確率/下がる確率」が閾値を超えたらエントリーする設計です。調べて分かった原因はこうでした。
- シグナル判定部に閾値チェックがある(確率 60% 以上で発火)
- さらにメインループ側にも別の閾値チェックが残っていた(改修の名残)
- 二重のゲートの実効値が固定 60% になっていた
- 一方、確率の「較正」処理を入れた影響で、モデルが出す確率は 10〜25% 程度の帯域に集中するようになっていた
つまり、モデルの確率スケールが変わったのに、閾値が昔のままだった。確率が構造的に閾値へ届かないので、ボットは永遠に「待機」し続けていたわけです。
学んだこと
1. 「取引がない」も異常として監視する
エラーは監視していても「正常に見えて何もしていない」状態は見逃しがちです。今は「N日間取引ゼロが続いたら通知」という監視を入れています。異常の反対は正常ではなく、「異常が検出できていないだけ」の場合があります。
2. 確率の較正と閾値はセットで見直す
機械学習モデルの predict_proba は較正(calibration)処理の有無でスケールが大きく変わります。較正を入れたら、閾値も実データの確率分布を見て決め直す必要があります。
3. バックテストは「本番と同じコード経路」で
私の場合、バックテストではシグナル部だけをテストしていたため、ループ側の二重ゲートに気づけませんでした。検証は本番のエントリー判定をそのまま通すのが理想です。
その後
閾値を実際の確率分布に合わせて設計し直し(買い/売りで非対称に設定)、二重ゲートを一本化した結果、ボットは1日数回の適切なペースで取引するようになりました。修正後の構成は73日分のウォークフォワード・バックテスト(手数料込み)で検証してからデプロイしています。
バックテストで痛い目を見た話はこちらの記事で書いています。