Appendix E · Safety 안전장치 체크리스트 0%
📘 APPENDIX E

안전장치 체크리스트

Risk Guards · 실계좌 전환 검증 · 사고 대응 프로토콜

Section 1

1. 왜 안전장치인가

자동매매 시스템의 핵심 리스크는 "한 번의 실수가 모든 걸 날릴 수 있다"는 점입니다. 사람은 이상한 주문을 보면 '어? 이거 뭐지?' 하고 멈추지만, 자동화는 코드가 시키는 대로 끝까지 실행합니다.

실전 사고 사례
2012년 Knight Capital은 소프트웨어 배포 실수로 45분 동안 4억 6천만 달러를 잃고 파산. 가격 소수점 위치 하나 잘못된 탓. 2023년 개인 투자자 한 명은 무한 루프 버그로 하룻밤에 8천만 원 손실. 모든 사례의 공통점: 안전장치 부재.

안전장치의 3층 방어선

🛡️ 3중 방어선 (Defense in Depth)
1️⃣ Pre-Trade Guards: 주문 실행 전 검증
Position Sizing · Stop/Profit 가격 · Daily Loss Guard · Max Positions
2️⃣ In-Trade Monitoring: 체결 후 모니터링
Bracket Order 자동 청산 · 실시간 PnL 추적 · 이상 탐지
3️⃣ Circuit Breakers: 시스템 전체 차단
Max Drawdown 초과 시 전면 정지 · 수동 Kill Switch · 2단계 승인
⚠️ 핵심 원칙: 안전장치는 "과하다" 싶을 정도로 여러 겹 쌓아야 합니다. 하나가 뚫려도 다른 게 잡아줍니다. 어차피 대부분은 발동 안 되지만, 단 한 번의 사고를 막기 위해 존재합니다.
Section 2

2. Risk Guards 4단계

W8에서 배운 4단계 Guards. 모든 자동 주문은 이 4개를 순차 통과해야 합니다.

1
POSITION SIZING
포지션 사이징 (자본의 2~4% 룰)
목적: 한 포지션이 전체 자본을 망가뜨리지 못하게 제한.
Confidence자본 대비 할당비고
1 (매우 낮음)1%실행 스킵 권장
2 (낮음)1.5%-
3 (보통)2%기본값
5 (매우 높음)4%최대 한도
🚨 절대 금지: 한 종목이 자본의 5% 초과 금지. 아무리 확신해도. "분산 투자"의 수학적 의미는 "최대 5%".

✅ 체크리스트

  • 계산 로직 검증: qty × price ≤ equity × 0.04 공식 테스트
  • 최소 1주 보장: qty는 절대 0이 될 수 없음 (주문 실패)
  • 소숫점 주식 미지원 확인: int()로 반드시 정수화
  • 한국 주식 호가 단위: 가격이 호가 단위의 배수인지 체크
2
STOP LOSS
손절 (-5% 자동 청산)
목적: 하락 손실을 -5%에서 강제 차단. 감정적 판단으로 더 떨어지는 걸 못 보는 "물타기" 사고 방지.
# Bracket Order로 매수와 동시에 등록
def calculate_stop_loss(entry: float, stop_pct: float = 0.05) -> float:
    """손절가 + 손절-지정가 (slippage 보호)"""
    stop_trigger = entry * (1 - stop_pct)         # 트리거: -5%
    stop_limit   = entry * (1 - stop_pct) * 0.995  # 지정가: -5.5%
    return {'stop': round(stop_trigger, 2), 'limit': round(stop_limit, 2)}

변동성별 권장 손절 폭

저변동 ETF (SPY 등)-3%
중소형주-7~10%
암호화폐-8~15%

✅ 체크리스트

  • Bracket Order 사용: 매수 주문과 동시에 손절 걸기. 별도 주문 금지
  • stop_limit은 stop보다 낮게: 0.5% 슬리피지 버퍼
  • 시장가 손절 금지: 급락 시 체결가가 예상보다 훨씬 낮아짐
  • 손절 변경 금지: 일단 걸면 "그래도 기다려볼까"로 풀지 않기
3
TAKE PROFIT
익절 (+10% 자동 청산)
목적: 욕심을 시스템이 제어. +10% 수익 나면 일단 확정.
💭 왜 "욕심 제어"가 중요한가: 개인 투자자의 가장 흔한 실수는 "+50% 갔다가 본전". 수익이 나기 시작하면 "더 갈 것 같은 느낌"이 들고, 결국 포지션을 오래 들고 있다가 역회전. 시스템이 +10%에 자동 팔아주면 이런 감정적 실수가 원천 차단됩니다.

리스크/리워드 비율 (R:R)

StopProfitR:R적합성
-3%+3%1:1스캘핑, 비추천
-5%+15%1:3추세 추종 전략
-3%+15%1:5브레이크아웃, 승률 낮음

✅ 체크리스트

  • Trailing Stop 고려: 수익 구간 들어서면 손절선도 함께 상향 (Advanced)
  • 부분 익절: 절반만 +10%에 매도, 나머지는 +20%에 (분할)
  • 수익 실현 로그: 실제 평균 익절가 vs 목표가 비교로 개선
4
DAILY LOSS GUARD
일일 손실 한도 (-2% 시 전면 중단)
목적: 연속 손실로 계좌 절반 날리는 사고 방지. 감정 격화 상태에서의 복수 매매 차단.
def daily_loss_guard(account) -> dict:
    equity = float(account['equity'])
    last_equity = float(account['last_equity'])
    daily_pnl_pct = (equity - last_equity) / last_equity * 100
    
    if daily_pnl_pct < -2.0:
        return {
            'allowed': False,
            'reason': f'Daily loss {daily_pnl_pct:.2f}% exceeds -2% limit',
            'action': 'HALT_ALL_TRADING'
        }
    
    if daily_pnl_pct < -1.5:   # 경고 영역
        return {
            'allowed': True,
            'warning': 'Approaching daily limit',
            'reduce_size_factor': 0.5   # 포지션 절반 축소
        }
    
    return {'allowed': True}

단계별 대응

일일 손실대응
0 ~ -1%정상 거래
-1% ~ -1.5%경고, 포지션 크기 50%로 축소
-1.5% ~ -2%심각 경고, 신규 매수 금지 (기존 포지션만 관리)
-2% 초과🚨 전면 중단, Discord 긴급 알림, 다음 영업일까지 거래 금지

✅ 체크리스트

  • 매 주문 전 체크: execute_verdict() 함수 초입에 필수
  • Workflow 전체 차단: Switch 노드로 후속 주문 모두 스킵
  • 자동 재개 금지: 다음날 수동 확인 후에만 재개 (사고 원인 파악 시간)
  • Discord 긴급 알림: @everyone 태그로 즉시 통보
🚨 Max Drawdown 추가 (선택적 5번째 Guard): 누적 손실이 -10%에 도달하면 30일간 시스템 완전 정지. 이 정도면 전략 자체를 재검토해야 할 신호입니다.
Section 3

3. 2단계 승인 시스템

자동화 수준을 점진적으로 높이는 안전장치. AI가 제안하고, 사람이 최종 승인하는 구조.

3가지 자동화 레벨

L1
ADVISORY ONLY
AI 제안 + 사람 수동 실행
적용 시기: 시스템 가동 첫 1~2개월. 학습·검증 단계.
AI가 "BUY 추천"을 Discord에 띄우면 사람이 증권사 앱에서 직접 주문. 시스템의 판단 품질을 실전 무손실로 평가할 수 있음.
L2
APPROVED AUTO
AI 제안 + Discord 버튼 승인 → 자동 실행
적용 시기: L1에서 2개월 이상 적절한 품질 확인 후.
Discord Webhook으로 verdict 전송 → 사용자가 ✅ / ❌ 버튼 클릭 → n8n이 응답 받아 실행.

Discord 인터랙션 구현 (n8n)

# 1. AI Agent 결과 → Discord에 "승인 대기" 메시지 발송
# 2. Webhook 노드로 Discord 버튼 응답 대기
# 3. 승인되면 주문 실행, 거부되면 로그만

# Discord embed payload 예시:
{
  "embeds": [{
    "title": "🤖 주문 승인 요청",
    "description": "AAPL BUY 10주 @ $180",
    "fields": [
      {"name": "Confidence", "value": "4/5", "inline": true},
      {"name": "Stop", "value": "$171 (-5%)", "inline": true},
      {"name": "Target", "value": "$198 (+10%)", "inline": true}
    ],
    "footer": {"text": "5분 내 응답 없으면 자동 취소"}
  }],
  "components": [{
    "type": 1,
    "components": [
      {"type": 2, "style": 3, "label": "✅ 승인", "custom_id": "approve_AAPL_20260422"},
      {"type": 2, "style": 4, "label": "❌ 거부", "custom_id": "reject_AAPL_20260422"}
    ]
  }]
}
타임아웃 설정
"5분 내 응답 없으면 자동 취소" 원칙. 사용자가 자리 비웠을 때 깜짝 주문 방지. n8n Wait 노드 + Webhook 조합으로 구현.
L3
FULL AUTO
완전 자동 실행 (⚠️ 위험)
적용 시기: L2에서 6개월 이상 검증 + Sharpe Ratio 안정적일 때.
승인 없이 자동 주문. 교육 과정에서는 절대 권장하지 않음.
L3 전환 전 필수 조건
✓ L2에서 최소 6개월 안정 운영
✓ 월간 수익률 일관성 확인 (varience 낮음)
✓ Max Drawdown이 -5% 이내로 유지됨
✓ 시스템 버그·예외 케이스 0건 유지
✓ Kill Switch 항상 접근 가능
하나라도 미달 시 L2 유지 강력 권장.
Section 4

4. 로깅 필수 항목

"기록되지 않은 것은 발생하지 않은 것"이라는 IT 업계 격언. 사고 발생 시 재현 가능성이 생명입니다.

3단계 로깅 구조

📝
LEVEL 1 — DECISION LOG
판단 과정 로그
Google Sheets 또는 CSV에 매 분석마다 저장:
  • timestamp — ISO 8601 형식
  • ticker — 분석 대상
  • input_data_snapshot — Price/News/Chart 결과 전체 JSON
  • verdict — BUY/SELL/HOLD/WATCH
  • confidence — 1~5
  • reasoning — AI 응답 전문
  • model_used — Haiku/Sonnet 구분
  • cost_usd — API 비용
📊
LEVEL 2 — ORDER LOG
주문 실행 로그
모든 주문 요청에 대해:
  • request_id — UUID
  • timestamp — 발송 시각
  • order_body — HashKey 생성에 사용된 Body 전문 (재현용)
  • response_code — rt_cd, msg_cd
  • order_id — 성공 시 거래소 주문번호 (ODNO)
  • filled_price — 체결가 (부분 체결 포함)
  • filled_qty — 체결 수량
  • guards_passed — 통과한 Guard 목록
🚨
LEVEL 3 — ERROR LOG
에러 및 예외 로그 (별도 시트)
별도 시트로 분리하는 것이 중요. 에러만 모아서 주간 리뷰.
  • error_type — RATE_LIMIT / AUTH_FAILURE / INSUFFICIENT_FUNDS / UNKNOWN
  • error_message — API 응답 그대로
  • context — 에러 발생 직전의 상태 스냅샷
  • retry_count — 재시도 횟수
  • resolution — 자동 해결 / 수동 개입 / 무시

로그 보관 주기

로그 레벨보관 기간이유
Decision Log최소 3개월전략 개선·백테스트 재현
Order Log최소 1년세무·분쟁·감사 대비
Error Log최소 6개월시스템 개선 패턴 분석
📦 백업 원칙: Google Sheets만 의지 말고, 매주 CSV export → 로컬 백업. 혹시 Sheets 계정 문제 생기면 복구 불가.
Section 5

5. 실계좌 전환 7대 검증

교육 과정 수강생 주의
이 섹션은 본 강의에서 실습하지 않습니다. 모의투자만으로 과정을 완료하세요. 아래는 과정 이후 개인적으로 실전 전환을 고민할 때 참고할 체크리스트입니다. 실전 전환은 본인 책임이며, 학원·강사는 어떤 손실도 책임지지 않습니다.

7대 검증 기준 (모두 Pass해야 실전 전환 가능)

1
VERIFICATION 1
최소 3개월 모의투자 운영
  • 연속 3개월, 매일 정상 작동 확인
  • 최소 100건 이상 체결 경험
  • 월별 수익률 일관성 (변동성 낮음)
  • 시스템 개입 없이 자동 운영되는 구간 포함
2
VERIFICATION 2
Sharpe Ratio ≥ 1.0
위험 대비 수익률 지표. 1.0 이상이어야 "운이 아닌 실력" 구분 가능.
Sharpe = (mean_return - risk_free) / std_deviation

# 일별 수익률 기준
daily_returns = df['daily_return_pct'] / 100
sharpe = (daily_returns.mean() * 252) / (daily_returns.std() * 15.87)
print(f'Annualized Sharpe: {sharpe:.2f}')
판정: < 0.5 불합격 / 0.5~1.0 재검토 / > 1.0 양호 / > 2.0 우수
3
VERIFICATION 3
Max Drawdown ≤ -10%
최고점 대비 최대 하락폭. -10% 넘었으면 전략 재검토.
df['cummax'] = df['equity'].cummax()
df['drawdown'] = (df['equity'] - df['cummax']) / df['cummax'] * 100
max_dd = df['drawdown'].min()
print(f'Max Drawdown: {max_dd:.2f}%')
4
VERIFICATION 4
승률 + R:R 조합 검증
기대값 공식:
E = (승률 × 평균수익) - (패율 × 평균손실)

양의 기대값 (E > 0) 필수. 예:
승률 50% + 평균수익 +10% / 평균손실 -5% → E = 0.5×10 - 0.5×5 = +2.5% ✓
승률 60% + 평균수익 +3% / 평균손실 -5% → E = 0.6×3 - 0.4×5 = -0.2% ✗
5
VERIFICATION 5
예외 처리 완전성 테스트
아래 시나리오를 모두 의도적으로 발생시켜 시스템이 적절히 대응하는지 확인:
  • API 키 만료 → 재발급 로직 작동?
  • Rate Limit 초과 → Exponential Backoff?
  • Discord Webhook 불능 → 대체 로그 기록?
  • 장 중 API 서버 다운 → 진행 중 주문 적절한 처리?
  • Claude API 에러 → 안전한 기본 동작 (HOLD)?
  • 네트워크 끊김 → 재시도 후 적절한 실패 처리?
  • 잘못된 종목 코드 → 주문 전 검증 차단?
6
VERIFICATION 6
자본 재시드 테스트
실전 전환 시작 자본은 "잃어도 생활에 지장 없는 금액".

권장 단계:
  1. 1개월차: 총 자산의 1~2% (예: 100만원)
  2. 2~3개월차: 3~5% (안정 시 증액)
  3. 4~6개월차: 5~10%
  4. 6개월 이후: 본인 리스크 판단
🚨 절대 금지: 대출·카드론으로 자동매매 자본 조달. 잃어도 되는 돈만.
7
VERIFICATION 7
Kill Switch 접근성 + 모바일 알림
언제든 30초 내에 시스템 완전 중단 가능해야:
  • n8n Active 토글 OFF — 모바일에서 가능
  • 전체 포지션 즉시 청산 명령 — 별도 워크플로 준비
  • Discord 모바일 앱 알림 설정 — 긴급 알림 즉시 인지
  • 가족/지인에게도 Kill Switch 방법 공유 (본인 부재 시)
  • 물리적 Kill Switch: "모든 주문 취소" SOS 버튼 구현
# Kill Switch — 전 포지션 즉시 청산
def emergency_close_all():
    """모든 포지션 시장가 청산 + 워크플로 중단."""
    # 1. 대기 주문 전량 취소
    requests.delete(f'{BASE_URL}/v2/orders', headers=HEADERS)
    
    # 2. 모든 포지션 청산
    positions = get_positions()
    for p in positions:
        requests.delete(f'{BASE_URL}/v2/positions/{p.symbol}', headers=HEADERS)
    
    # 3. Discord 알림
    notify('🚨 Emergency close executed')
Section 6

6. 사고 대응 프로토콜

사고는 준비된 사람만이 빠르게 복구합니다. 아래 순서를 사전에 반복 연습하세요.

🚨 즉시 중단 프로토콜 (10분 내 완료)

T+0이상 탐지 (0초)
Discord 긴급 알림 수신 / 수동 발견 / Guard 4번 발동 등. 당황하지 말고 일단 심호흡.
T+30sn8n Workflow 중단 (30초)
n8n 웹/모바일 접속 → 관련 워크플로 Active 토글 OFF. 신규 주문 발생 차단.
T+2m현재 포지션 확인 (2분)
증권사 공식 앱에서 직접 확인. n8n 로그가 아니라 실제 계좌 상태를 우선. 대기 주문도 확인.
T+3m대기 주문 전량 취소 (3분)
증권사 앱에서 직접 전량 취소. API 호출은 아직 쓰지 말 것 (버그가 있을 수 있음).
T+5m포지션 청산 여부 결정 (5분)
상황에 따라:
  • 시스템 버그인 경우: 즉시 전량 청산 (재해킹/재실행 리스크)
  • 시장 이상인 경우: 기존 포지션은 유지, 손절선만 재확인
  • 의심스러운 거래 발견 시: 증권사 고객센터 즉시 연락
T+10m로그 스냅샷 보존 (10분)
n8n Executions 탭 스크린샷. Decision Log + Order Log CSV export. 사고 원인 분석용.

사고 유형별 대응

증상가능한 원인1차 대응
예상 외 주문 체결 프롬프트 버그 / AI 오판 해당 워크플로 중단 → 포지션 유지 가능성 판단
연속 Guard 4 발동 시장 급변 / 전략 부적합 시스템 중단 → 1주일 이상 관망 → 전략 재검토
주문 중복 체결 Rate Limit 대응 재시도 실수 즉시 중단 → 중복 분량 수동 청산
API 인증 에러 폭주 토큰 만료 / 키 유출 API 키 즉시 재발급 → 보안 점검
계정 접근 불가 해킹 가능성 증권사 고객센터 긴급 연락 → 모든 키 교체
🚨 가장 중요한 원칙: 사고 발생 시 절대 "해결책"을 즉흥적으로 추가하지 말 것. 스트레스 상태의 코드 수정은 사고를 키웁니다. 중단 → 분석 → 개선 → 테스트 → 재배포 순서를 지키세요.
Section 7

7. 최종 배포 체크리스트

모의투자 단계에서도 배포 전 이 리스트를 전부 체크하는 습관을 들이세요. 실전에서는 필수입니다.

🔐 보안 체크

⚙️ 시스템 체크

🛡️ 안전장치 체크

📊 모니터링 체크

📋 문서화 체크

✅ 이 체크리스트를 완료하면: 8주 과정의 교육용 시스템을 프로덕션 품질로 끌어올린 상태입니다. 안전장치 없이 자동매매를 돌리는 건 브레이크 없는 자동차를 타는 것과 같습니다. 느리더라도 안전한 길을 가세요.
최종 당부의 말
자동매매는 돈을 벌기 위한 도구가 아니라 돈을 벌 수 있는 구조를 만드는 도구입니다. 전략 없이 자동화만 한다고 수익이 나지 않습니다. 본 강의에서 만든 시스템은 교육용 프로토타입이며, 실전 수익 창출은 별개의 영역입니다.

시장에는 여러분보다 자본·기술·경험이 수십 배 많은 전문 트레이더들이 있습니다. 초보가 8주 학습으로 그들을 이기기는 어렵습니다. 자동매매를 "수익 수단"이 아니라 "AI/엔지니어링 학습 경험"으로 접근하면, 훨씬 많은 것을 얻을 수 있습니다.

건강하고 지속 가능한 여정이 되기를 바랍니다. 🙏
📘 APPENDIX E COMPLETE
안전장치 체크리스트
4 Risk Guards · 3 Auto Levels · 7 Verifications
2026 · ZeroOneAI Education