AI FXボットのためのキルスイッチフレームワーク
執筆者: FXマクロデータチーム
発行: May 21, 2026
条件が変わると十分速く止まらないため 失敗します モデルが 驚くような印刷物から 数分で 役に立つから危険な状態になるのです アメリカ合衆国 核心PCE 政策ショックが 日本銀行. Without hard halts, one bad loop becomes a week of drawdown.
このガイドは,任意のまたは半自動化ワークフローに接続できる実践的なキルスイッチフレームワークを提供します. ドル/JPYほら EUR/USD異なるマクロセンシティブペア
殺人 切り替える スタック
層の制御を使う リスクを停止するには 単一のトリガーで十分だ
- データ完全性スイッチ: 核入力が古くなったり 欠落したり 不一致しているときに停止します
- モデル行動スイッチ: 輸出スケーマ,信頼度,または推論の質が 逸脱すると停止します
- 実行異常スイッチ: ポリシーの範囲を超えた 充填行為や滑り値が停止する
- ポートフォリオの利用の切り替え: 累積損失がセッションや日限を超えると停止する.
- イベントウィンドウスイッチ: 頂点から離れる場所の近くで止まる リリースカレンダー 戦略がイベントに特化したものでない場合
監視ができない場合は,デフォルトで halt違う continueわかった
1) データ 完全性 スイッチ
監視すべきもの:
- 必要な各指標のタイムスタンプの新鮮度
- フィールドの完全性 (実際の,以前の,予想される場合の発表時間)
- 関連情報源の相互一致性チェック
FXMacroData からマクロ摂取のための保護例:
from datetime import datetime, timezone, timedelta
MAX_STALENESS = timedelta(hours=6)
def is_fresh(iso_dt: str) -> bool:
ts = datetime.fromisoformat(iso_dt.replace("Z", "+00:00"))
return datetime.now(timezone.utc) - ts <= MAX_STALENESS
def data_switch(payload: dict) -> tuple[bool, str]:
required = ["announcement_datetime", "value"]
for row in payload.get("data", [])[:5]:
for k in required:
if k not in row or row[k] in (None, ""):
return False, f"missing_field:{k}"
if not is_fresh(row["announcement_datetime"]):
return False, "stale_data"
return True, "ok"
モデルが起動する前に チェックを義務付けます
2) モデル行動の切り替え
信頼度だけでなく 輸出信頼性にも 切り替えをします
触発条件:
- スキーマ解析の失敗率は ローリングウィンドウの限界を超えています
- 厳しい政策規則に反復矛盾 (例えば最大リスクを超える規模)
- 信頼がマクロの合理性を支えるものなしに 値に達します
def model_switch(stats: dict) -> tuple[bool, str]:
if stats["schema_fail_rate_20"] > 0.10:
return False, "schema_drift"
if stats["policy_violation_count_20"] >= 3:
return False, "policy_violation_burst"
if stats["unsupported_high_confidence_count_20"] >= 2:
return False, "confidence_anomaly"
return True, "ok"
モデルが安全状態を自分で評価するのを許さない.安全状態はモデルの外で計算しなければならない.
3) 実行異常スイッチ
補填が劣化したら 早く止めろ 実行異常が有効な信号の質を消す
典型的なトリガー:
- N 連続取引における設定された値を超えた滑り
- 命令は正常基準線上の 値を拒絶する
- 満タン決定からの遅延は 許容された窓を超えています
def execution_switch(exec_stats: dict) -> tuple[bool, str]:
if exec_stats["slippage_bps_avg_10"] > 8:
return False, "slippage_spike"
if exec_stats["reject_rate_20"] > 0.15:
return False, "reject_spike"
if exec_stats["decision_to_fill_ms_p95"] > 1800:
return False, "latency_spike"
return True, "ok"
イベント駆動システムでは,セッションを考慮して,高変動の窓の周辺でより保守的に値下げすべきです.
4) 引き上げと露出の切り替え
ポートフォリオレベルの保護が 最後のブレーキです 関連損失では信号レベルの制御が不十分です
- セッションの引き上げ停止 (例えば -1.25%)
- 日々の引き上げ停止 (例えば -2.0%).
- 最大同時相関曝露制限
def risk_switch(risk: dict) -> tuple[bool, str]:
if risk["session_dd_pct"] <= -1.25:
return False, "session_drawdown_limit"
if risk["daily_dd_pct"] <= -2.00:
return False, "daily_drawdown_limit"
if risk["usd_beta_exposure_pct"] > 1.50:
return False, "concentration_limit"
return True, "ok"
5) イベント・ウィンドウ・スイッチ (しばしば見逃される)
ニュースリリースに合わせて戦略を立てていない場合は,トップレベルのリリース前後を一時停止してください. 国内外活動 混沌とした分間に偽の精度を避けるために
from datetime import timedelta
def event_window_switch(next_event_minutes: int, strategy_mode: str) -> tuple[bool, str]:
if strategy_mode != "event_trading" and abs(next_event_minutes) <= 15:
return False, "event_window_lock"
return True, "ok"
この単一の制御は,ベースライントレンドと平均逆転ボットで避けられる多くの損失を防ぐことができます.
統一停止制御装置の導入
すべてのスイッチは 取引可能なかどうかを決定する 機関に ロールアップする必要があります
def should_trade(state: dict) -> dict:
checks = {
"data": data_switch(state["data"]),
"model": model_switch(state["model_stats"]),
"execution": execution_switch(state["exec_stats"]),
"risk": risk_switch(state["risk"]),
"event": event_window_switch(state["next_event_minutes"], state["strategy_mode"]),
}
failed = [name for name, (ok, _) in checks.items() if not ok]
if failed:
reasons = {name: checks[name][1] for name in failed}
return {"tradable": False, "reasons": reasons}
return {"tradable": True, "reasons": {}}
停止理由をログに保存して 警告チャンネルを保存して すぐに原因を修正できます
スイッチが起動する時の操作説明書
- 新しい注文を直ちにブロックする
- リスク削減命令 (フラットまたはヘッジ) をのみ許可する.
- 誤ったスイッチとタイムスタンプを 送る
- 解錠コードで手動解錠を
- 自動化に戻る前に健康診断を繰り返す
このゲームブックで 暗号化されたキルスイッチを 真の保護に変える
結論
AI取引システムは平均的に正確であるため安全ではありません.仮定が破綻するとすぐに停止するため安全です. 層のキルスイッチフレームワークは,壊滅的な失敗モードを制限しながら自動化の向上性を保ちます.
次のステップは このフレームワークを 取引後の配分ループと組み合わせる 原因によって全ての拒絶信号をタグ付けし その分類をモデルプロンプトや ポリシースロージックに 戻すことです