자동매매 봇, 왜 터지는가?
자동매매 봇을 만들고 백테스트까지 통과하면 “이제 돈 벌겠다”는 기대가 생깁니다. 하지만 실전에서 봇이 계좌를 날리는 사례는 셀 수 없이 많습니다. 대부분의 원인은 전략이 아니라 리스크 관리의 부재입니다. 이 글에서는 자동매매 봇에 반드시 구현해야 할 리스크 관리 핵심 요소를 정리합니다.
1. 포지션 사이징: 한 번에 얼마나 걸 것인가
가장 기본이면서도 가장 많이 무시되는 영역입니다. 전체 자본 대비 한 포지션에 몇 퍼센트를 투입할지 결정하는 것이 포지션 사이징(Position Sizing)입니다.
- 고정 비율법: 총 자본의 1~2%만 한 포지션에 위험 노출
- 켈리 기준(Kelly Criterion): 승률과 손익비로 최적 비율 계산
- 변동성 기반: ATR(Average True Range)로 변동성에 따라 포지션 크기 자동 조절
핵심 원칙은 단순합니다. 한 번의 손실로 전체 자본의 2%를 넘기지 않는 것입니다. 손실 한도 규칙을 봇에도 반드시 하드코딩해야 합니다.
2. 일일 손실 한도(Daily Drawdown Limit)
하루 동안 봇이 잃을 수 있는 최대 금액을 설정해야 합니다. 이를 초과하면 봇이 자동으로 모든 포지션을 청산하고 거래를 중단해야 합니다.
| 한도 유형 | 권장 기준 | 초과 시 행동 |
|---|---|---|
| 1회 손실 | 자본의 1~2% | 해당 포지션 즉시 청산 |
| 일일 손실 | 자본의 3~5% | 당일 거래 전면 중단 |
| 주간 손실 | 자본의 7~10% | 전략 재검토 후 수동 재개 |
| 최대 낙폭(MDD) | 자본의 15~20% | 봇 완전 중단, 전략 폐기 검토 |
3. API 장애와 네트워크 예외 처리
자동매매 봇에서 가장 위험한 순간은 거래소 API가 응답하지 않을 때입니다. 주문은 나갔는데 응답이 안 오면, 봇은 주문이 안 된 줄 알고 중복 주문을 넣습니다.
- 멱등성(Idempotency): 같은 주문을 두 번 보내도 한 번만 체결되도록 주문 ID 관리
- 타임아웃 처리: API 응답이 5초 이상 없으면 재시도 전 포지션 상태 먼저 확인
- 재연결 로직: 웹소켓 끊김 시 자동 재연결 + 미체결 주문 동기화
- 킬 스위치: 연속 3회 이상 API 오류 시 모든 거래 중단
4. 슬리피지 모니터링
봇이 의도한 가격과 실제 체결 가격의 차이를 실시간으로 추적해야 합니다. 슬리피지가 백테스트 가정치를 초과하면 전략의 기대 수익이 무너집니다.
class SlippageMonitor:
def __init__(self, max_avg_slippage_pct=0.1):
self.records = []
self.max_avg = max_avg_slippage_pct
def record(self, intended_price, filled_price):
slip = abs(filled_price - intended_price) / intended_price * 100
self.records.append(slip)
def check(self):
if len(self.records) < 10:
return True
avg = sum(self.records[-50:]) / len(self.records[-50:])
if avg > self.max_avg:
# 슬리피지 초과 → 경고 또는 거래 중단
return False
return True
5. 동시 포지션 제한과 상관관계 관리
BTC 롱, ETH 롱, SOL 롱을 동시에 들고 있다면 실질적으로 하나의 거대한 포지션과 다름없습니다. 암호화폐 간 상관관계가 높기 때문입니다.
- 동시 보유 포지션 수를 3~5개로 제한
- 같은 방향(롱/숏) 포지션이 3개 이상이면 신규 진입 차단
- 상관계수 0.7 이상인 자산은 하나의 포지션으로 간주
6. 로깅과 알림 시스템
봇이 24시간 돌아가는데 로그가 없으면 문제가 생겨도 원인을 알 수 없습니다. 최소한 다음 이벤트는 반드시 기록하고 알림을 보내야 합니다:
- 모든 주문 생성·체결·취소 기록
- 손실 한도 도달 시 즉시 알림 (텔레그램, 디스코드)
- API 오류·연결 끊김 알림
- 일일 PnL 리포트 자동 발송
- 비정상적 거래 패턴 감지 (예: 1분 내 10회 이상 주문)
7. 페이퍼 트레이딩 단계를 건너뛰지 말 것
실전 투입 전 최소 2~4주간 페이퍼 트레이딩(모의 거래)을 진행해야 합니다. 이 과정에서 확인할 것은 수익률이 아니라 시스템 안정성입니다. 복구매매 패턴이 봇 로직에 숨어있지 않은지도 반드시 점검하세요.
- 연속 손실 시 봇의 행동이 정상적인가?
- 급등·급락 시 슬리피지가 허용 범위 내인가?
- API 장애 상황에서 포지션이 안전하게 관리되는가?
- 메모리 누수나 프로세스 중단 없이 24시간 안정 구동되는가?
결론: 봇은 전략이 아니라 리스크로 생존한다
수익을 내는 전략보다 손실을 통제하는 시스템이 먼저입니다. 세계 최고의 퀀트 펀드들도 수익 극대화가 아닌 리스크 최소화에 자원의 80%를 투입합니다. 자동매매 봇을 만든다면, 전략 코드보다 리스크 관리 코드가 더 길어야 정상입니다.