자동매매 봇 리스크 관리 7가지

자동매매 봇, 왜 리스크 관리가 핵심인가

자동매매 봇을 만들면 가장 먼저 신경 쓰는 것이 진입 시그널입니다. 어떤 지표 조합으로 매수할지, 언제 매도할지에 집중합니다. 하지만 실전에서 계좌를 날리는 원인은 시그널이 아니라 리스크 관리의 부재입니다.

자동매매는 24시간 쉬지 않고 돌아갑니다. 사람이 자는 동안에도 포지션을 잡고, 급변하는 시장에서 연속 손실을 낼 수 있습니다. 리스크 관리 없는 자동매매 봇은 브레이크 없는 자동차와 같습니다.

실전에서 반드시 구현해야 할 리스크 관리 7가지

1. 포지션 사이징(Position Sizing)

한 번의 거래에 전체 자금의 몇 퍼센트를 투입할지 정하는 것이 포지션 사이징입니다. 프로 트레이더들은 보통 1~2% 룰을 따릅니다.


# 1% 리스크 포지션 사이징 예시
def calc_position_size(balance, entry_price, stop_loss_price, risk_pct=0.01):
    risk_amount = balance * risk_pct  # 계좌의 1%
    price_diff = abs(entry_price - stop_loss_price)
    position_size = risk_amount / price_diff
    return position_size

# 잔고 1000만원, 진입가 50000, 손절가 49000
# → 리스크 금액 10만원, 포지션 100개

이 방식이면 10연패를 해도 계좌의 약 10%만 잃습니다. 생존이 곧 수익의 전제조건입니다.

2. 일일 최대 손실 한도(Daily Loss Limit)

하루 손실이 일정 금액을 넘으면 봇을 자동으로 정지시켜야 합니다. 추세가 불리한 날 계속 거래하면 손실이 눈덩이처럼 불어납니다.


# 일일 손실 한도 체크
class DailyLossGuard:
    def __init__(self, max_daily_loss_pct=0.03):
        self.max_daily_loss_pct = max_daily_loss_pct
        self.daily_start_balance = None
    
    def should_stop(self, current_balance):
        if self.daily_start_balance is None:
            return False
        loss_pct = (self.daily_start_balance - current_balance) / self.daily_start_balance
        return loss_pct >= self.max_daily_loss_pct  # 3% 이상 손실 시 정지

3. 최대 동시 포지션 제한

여러 종목에 동시 진입하면 리스크가 분산되는 것처럼 보이지만, 시장 전체가 하락할 때는 모든 포지션이 동시에 손실을 냅니다. 동시 보유 포지션 수를 제한하세요.

계좌 규모 권장 최대 동시 포지션 포지션당 최대 비중
500만원 이하 2~3개 30%
500만~3000만원 3~5개 20%
3000만원 이상 5~10개 10%

4. 연속 손실 시 거래량 축소

3연패 이상이면 포지션 크기를 절반으로 줄이는 로직을 넣으세요. 연속 손실은 시장 환경이 전략에 불리하다는 신호입니다. 이때 풀 사이즈로 계속 거래하면 회복 불가능한 낙폭에 빠집니다.


# 연속 손실 감지 및 사이즈 축소
def adjusted_size(base_size, consecutive_losses):
    if consecutive_losses >= 5:
        return base_size * 0.25  # 75% 축소
    elif consecutive_losses >= 3:
        return base_size * 0.5   # 50% 축소
    return base_size

5. 손절(Stop-Loss)은 선택이 아니라 필수

자동매매에서 손절 없는 포지션은 시한폭탄입니다. 모든 진입에는 반드시 손절가가 함께 설정되어야 합니다. “조금만 더 기다리면 올라올 것”이라는 기대는 사람이 하는 실수지만, 봇에 손절을 안 넣는 것은 개발자의 실수입니다.

6. API 장애·네트워크 에러 대응

자동매매 봇이 간과하기 쉬운 리스크가 기술적 장애입니다. 거래소 API가 응답하지 않거나, 네트워크가 끊기거나, 주문이 체결되지 않는 상황을 반드시 처리해야 합니다.

  • 주문 후 체결 확인을 반드시 검증
  • API 타임아웃 시 재시도 로직(최대 3회)
  • 연속 에러 시 봇 자동 정지 + 알림 발송
  • 미체결 주문 주기적 정리(Stale Order Cleanup)

7. 드로우다운(Drawdown) 모니터링

전고점 대비 현재 잔고의 하락 비율인 최대 낙폭(MDD)을 실시간으로 추적하세요. MDD가 설정한 임계값(예: 15%)을 넘으면 봇을 멈추고 전략을 재점검해야 합니다.


# MDD 추적
class DrawdownMonitor:
    def __init__(self, max_drawdown=0.15):
        self.peak = 0
        self.max_drawdown = max_drawdown
    
    def update(self, balance):
        self.peak = max(self.peak, balance)
        drawdown = (self.peak - balance) / self.peak
        if drawdown >= self.max_drawdown:
            return "STOP"  # 봇 정지 신호
        return "OK"

리스크 관리 체크리스트

자동매매 봇을 실전에 배포하기 전, 아래 항목을 반드시 확인하세요.

  • ☑️ 포지션 사이징 로직이 구현되어 있는가
  • ☑️ 모든 포지션에 손절이 설정되는가
  • ☑️ 일일 최대 손실 한도가 있는가
  • ☑️ 동시 포지션 수가 제한되어 있는가
  • ☑️ 연속 손실 시 사이즈를 줄이는가
  • ☑️ API 에러·타임아웃 처리가 되어 있는가
  • ☑️ MDD 모니터링이 작동하는가
  • ☑️ 봇 정지 시 알림이 오는가

결론: 수익보다 생존이 먼저다

자동매매 봇의 진짜 경쟁력은 화려한 수익률이 아니라 위기 상황에서 계좌를 지키는 능력입니다. 리스크 관리가 탄탄한 봇은 일시적으로 손실을 내더라도 반드시 회복합니다. 반대로 리스크 관리가 없는 봇은 아무리 좋은 전략이라도 결국 계좌를 날립니다.

먼저 살아남으세요. 수익은 그 다음입니다.

관련 글도 함께 읽어보세요:

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux