슬리피지와 체결 품질 관리: 시장가 vs 지정가

🌐 English

백테스트 곡선은 우상향인데 실계좌만 제자리인 경험, 자동매매를 해본 사람이라면 압니다. 원인의 대부분은 전략이 아니라 체결에 있습니다. 화면에 뜬 가격과 내 주문이 실제로 채워진 가격의 차이 — 이것이 슬리피지(slippage)입니다.

⚠️ 이 글은 교육·정보 제공 목적입니다. 특정 기법의 수익을 보장하지 않으며, 투자 손실 책임은 본인에게 있습니다.

1. 슬리피지는 어디서 생기나

백테스트는 보통 "종가에 체결됐다"고 가정합니다. 하지만 실전에서 시장가 주문은 호가창을 위에서부터 먹어 들어갑니다. 매도 1호가 물량이 내 주문보다 적으면, 남은 수량은 2호가·3호가로 넘어가 평균 체결가가 밀립니다.

매수 시장가 500주를 넣으면:

  매도1호가 10,000원 × 300주  → 300주 체결

  매도2호가 10,005원 × 200주  → 200주 체결

평균 체결가 = (10,000×300 + 10,005×200) / 500 = 10,002원

→ 화면가 10,000 대비 2원(0.02%) 슬리피지

스프레드가 넓거나 호가가 얇은 종목일수록, 주문이 클수록 이 손실은 커집니다. 왕복(진입+청산) 매매라면 슬리피지도 왕복으로 두 번 물립니다.

2. 시장가 vs 지정가 — 무엇을 포기할 것인가

증권사 API에서 주문 유형은 대개 코드로 구분됩니다. 실제 봇 코드에서도 이렇게 다룹니다.

OrderType string // "00" 지정가, "01" 시장가
  • 시장가("01"): 체결은 거의 보장되지만 가격을 포기합니다. 급한 청산·손절에 적합. 대신 슬리피지를 감수.
  • 지정가("00"): 가격을 통제하지만 체결을 포기할 수 있습니다. 원하는 값에 안 오면 미체결로 남습니다.

핵심은 "무엇이 더 아픈가"입니다. 차익거래·페어처럼 진입가가 곧 엣지인 전략은 지정가가 원칙입니다. 반대로 추세가 꺾여 반드시 빠져나와야 하는 손절은 시장가가 안전합니다.

3. 호가 깊이 대비 주문 크기

실시간 호가(잔량)를 구독하면, 주문 전에 내 물량이 몇 호가를 먹을지 미리 계산할 수 있습니다. 봇은 호가 데이터를 이렇게 들고 있습니다.

type RealtimeQuote struct {

    AskPrice float64 // 매도1호가

    BidPrice float64 // 매수1호가

    AskQty   int64   // 매도1호가 잔량

    BidQty   int64   // 매수1호가 잔량

}

// 주문이 1호가 잔량을 넘으면 슬리피지 경고

func checkDepth(orderQty, askQty int64) bool {

    if orderQty > askQty {

        // 1호가로 다 못 먹음 → 분할 or 지정가 검토

        return false

    }

    return true

}

주문이 1호가 잔량 안에 들어오면 슬리피지는 사실상 0에 가깝습니다. 넘어간다면 주문을 쪼개(분할 체결) 여러 번에 나눠 넣거나, 아예 지정가로 바꿔 시장이 오길 기다리는 편이 낫습니다.

4. 미체결 대응 — 주문은 걸고 끝이 아니다

지정가를 쓰면 반드시 미체결 관리가 따라옵니다. 걸어둔 주문이 방치되면, 시장이 이미 떠난 뒤 뒤늦게 체결돼 원치 않는 포지션을 안게 됩니다.

  • 타임아웃 취소: N초 안에 안 채워지면 주문을 취소하고 재평가. "이 가격은 이제 유효하지 않다"를 인정하는 장치.
  • 재주문(chase): 취소 후 현재 호가에 맞춰 한 틱 따라가며 다시 건다. 단, 무한 추격은 슬리피지를 자초하므로 횟수를 제한.
  • 부분 체결 처리: 500주 중 300주만 채워진 상태를 정확히 추적해야 합니다. 남은 200주를 다시 계산에 넣지 않으면 포지션이 어긋납니다.
if !filled && elapsed > orderTimeout {

    cancelOrder(orderID)         // 미체결 취소

    if retries < maxChase {

        placeLimit(currentBid)   // 현재가로 재주문

        retries++

    } else {

        placeMarket()            // 포기하고 시장가로 확실히

    }

}

정리

  • 백테스트와 실전의 괴리는 대부분 슬리피지에서 온다 — 종가 체결 가정은 거짓말
  • 시장가는 체결을, 지정가는 가격을 산다. 전략의 엣지가 가격이면 지정가
  • 주문 전 호가 잔량과 주문 크기를 비교해 슬리피지를 예측·분할
  • 지정가는 타임아웃·재주문·부분체결 관리가 세트

화려한 진입 신호보다, 그 신호를 손실 없이 체결로 옮기는 기술이 실전 수익률을 가릅니다. 슬리피지 0.1%는 작아 보여도, 하루 수십 번 왕복하는 봇에게는 전략 전체를 적자로 뒤집는 크기입니다.

댓글

이 블로그의 인기 게시물

한국투자증권 KIS API로 실시간 시세 받기 (WebSocket 실전)

파이썬으로 업비트 API 연동하기 — 시세 조회부터 주문까지 기초

Go로 자동매매 신호봇 프레임워크 설계하기