FX自動売買Botに時間帯フィルタを入れてノイズ売買を減らす設計
背景
FX自動売買Botは、24時間動かせること自体が強みのように見えます。ただし、常時稼働させるほど不要な時間帯のシグナルまで拾いやすくなり、検証結果と実運用の差が広がることがあります。
今回の設計では、売買判断そのものだけでなく「いつ実行するか」を明示的に制御します。
方針
Botは次の時間帯だけ処理を進めます。
- 0:0X
- 2:0X
- 4:0X
それ以外の時間は、シグナル計算や注文処理に進まずスキップします。目的は、エントリー回数を増やすことではなく、検証済みの時間帯だけで判断を安定させることです。
実装イメージ
実装では、注文ロジックの手前に実行時間フィルタを置きます。
from datetime import datetime
ALLOWED_HOURS = {0, 2, 4}
def should_run(now: datetime) -> bool:
return now.hour in ALLOWED_HOURS and 0 <= now.minute <= 9
def run_bot(now: datetime) -> None:
if not should_run(now):
log_skip(now, reason="outside_execution_window")
return
signal = calculate_signal(now)
if signal is None:
log_skip(now, reason="no_signal")
return
place_order(signal)
ポイントは、時間外でもBotを落とすのではなく、スキップ理由をログに残すことです。あとから「動かなかった」のか「意図して動かさなかった」のかを判別できます。
ログで確認する項目
最低限、次の情報を残します。
- 実行判定時刻
- 実行したか、スキップしたか
- スキップ理由
- 採用した戦略
- シグナル値
- 注文有無
- 口座残高や評価損益のスナップショット
時間帯フィルタは単純な条件分岐ですが、運用時にはログがないと効果を検証できません。特に自動売買では、売買した履歴だけでなく、売買しなかった履歴も重要です。
検証観点
この設計を入れた後は、次の比較を行います。
- 全時間帯で動かしたバックテスト
- 0時台、2時台、4時台だけに絞ったバックテスト
- フォワードテストでの約定回数
- スキップされた時間帯の仮想シグナル
- 最大ドローダウンと勝率の変化
時間を絞ったことで利益機会が減る可能性はあります。一方で、不要なノイズ売買を減らせれば、ドローダウンや手数料負けを抑えやすくなります。
まとめ
自動売買Botでは、ロジックを増やすことだけが改善ではありません。動かす時間を限定し、動かさない判断を明示するだけでも、運用の安定性は変わります。
今回の時間帯フィルタは、裁量なしでBotを回すための基礎制御です。今後は、このフィルタと相場状態分類、戦略切り替え、リスク停止条件を組み合わせて、実運用に耐える構成へ近づけていきます。
