본문으로 건너뛰기

운영 인시던트 대응 (Daily -5% 자동 중단)

가장 흔한 실전 인시던트인 일일 -5% 룰 발동 시나리오를 처음부터 끝까지 따라갑니다.

학습 목표

  • RiskManager v2가 일일 -5%를 계산하는 방식
  • Telegram + Grafana 알림이 트리거되는 임계값
  • 자동 거래 중단 후 봇·라이브의 동결 동작
  • 24h 후 다음 영업일 자동 복구 절차

사전 준비

  • 페이퍼 또는 라이브 모드에서 봇이 실행 중
  • Telegram bot + chat_id 설정 (SettingsNotifications)
  • Grafana 대시보드 접근 (운영자용)

1단계: -3% 알림 (사전 경보)

자산군 합산 일일 PnL이 -3%에 도달하면 사전 경보가 발송됩니다.

[quant-ai] WARNING: Daily PnL approaching limit
user_id: 42
daily_pnl_usd: -298.50 (-3.05%)
threshold: -5.0%
asset_classes: us_equity (-3.5%), crypto (-2.3%)
ts: 2026-04-26T17:11:53Z

2단계: -5% 자동 중단

-5% 도달 즉시:

  1. RiskManager.daily_loss_limit_breached=true 플래그 설정
  2. 모든 신규 시그널이 RISK_RULE_VIOLATION으로 거부
  3. 모든 새 주문 (페이퍼/라이브) 422 거부
  4. WebSocket으로 bot_status: "halted" 메시지 브로드캐스트

알림 예시:

[quant-ai] CRITICAL: Daily loss limit reached - bot halted
user_id: 42
daily_pnl_usd: -512.45 (-5.21%)
halted_at: 2026-04-26T18:42:01Z
resume_at: 2026-04-27T00:00:00Z (UTC midnight)
open_positions: 3 (will be flatten via stop-loss only)

3단계: 동결 상태 검증

curl -H "Authorization: Bearer $JWT" \
http://localhost:8000/api/bot/status

응답:

{
"is_running": true,
"is_halted": true,
"halt_reason": "daily_loss_limit",
"halted_at": "2026-04-26T18:42:01Z",
"resume_at": "2026-04-27T00:00:00Z",
"open_positions_count": 3
}

이 시간 동안:

  • 신규 진입은 모두 거부 (스탑로스/트레일링 청산만 허용)
  • LLM 분석 요청은 계속 가능 (시그널을 받아도 거부됨)
  • 백테스트는 정상 동작

4단계: 24h 후 자동 복구

다음 UTC 자정에 RiskManager가 일일 카운터를 리셋하고 자동 거래가 재개됩니다.

[quant-ai] INFO: Daily loss limit reset - bot resumed
user_id: 42
resumed_at: 2026-04-27T00:00:00Z
prev_day_pnl_usd: -512.45
account_equity: 9682.20

5단계: 사후 분석

복구 직후 다음을 점검합니다.

  1. 트레이드 내역 검토: /api/trades?from=2026-04-26&asset_class=all
  2. 보고서 분석: 손실이 발생한 거래의 report_uuid 추적, 결정 신호 vs 실제 결과 비교
  3. 백테스트 재검증: 같은 기간을 백테스트로 시뮬레이션해서 전략 가정이 깨졌는지 확인
  4. 전략 일시 중단 (선택): Bot 페이지에서 의심 전략을 disable 처리

수동 강제 중단 / 강제 재개

운영자는 24h를 기다리지 않고도 강제 중단/재개를 할 수 있습니다 (admin 토큰 필요).

# 강제 중단
curl -X POST http://localhost:8000/api/bot/halt \
-H "Authorization: Bearer $ADMIN_JWT" \
-d '{"reason": "manual_emergency_stop"}'

# 강제 재개 (rate limit 발동 직후엔 권장하지 않음)
curl -X POST http://localhost:8000/api/bot/resume \
-H "Authorization: Bearer $ADMIN_JWT"

자세한 운영 플레이북은 운영: 비상 정지 참조.

검증

  • -3% 알림이 Telegram으로 도착
  • -5% 도달 즉시 신규 주문 422 거부
  • 동결 상태에서 분석 요청은 정상 동작
  • UTC 자정에 자동 복구 + 알림 발송

다음 단계