튜토리얼약 4분 읽기

슬리피지 이해하기 — 시장가 주문이 위험할 수 있는 이유

백테스트 가격과 실제 체결 가격이 다르다

백테스팅 함정에서 백테스트 성과가 실전과 다를 수 있는 여러 이유를 짚었는데, 그중 자주 빠지는 요인이 슬리피지(slippage)다. 백테스트는 보통 "그 시점의 가격"으로 체결됐다고 가정하지만, 실제 시장에서는 주문을 낸 가격과 실제로 체결된 가격 사이에 차이가 생긴다. 이 차이가 슬리피지다.

이 글은 특정 종목이나 실제 체결 사례를 다루지 않는다. 슬리피지가 왜 생기는지, 자동매매 설계에서 어떻게 고려해야 하는지 개념 위주로 다룬다.

슬리피지가 생기는 이유 — 호가창은 계단이다

시장에는 "지금 가격"이라는 단일한 숫자가 있는 게 아니라, 매수·매도 각각 여러 단계의 호가와 수량으로 이루어진 호가창(order book)이 있다. 시장가 주문은 "지금 살 수 있는 가장 좋은 가격부터 순서대로" 체결되는데, 주문 수량이 한 단계의 물량보다 크면 다음 단계, 그다음 단계로 넘어가며 체결된다. 그 결과 평균 체결가가 처음 보였던 가격보다 불리해진다.

python 코드 보기
def estimate_market_fill(order_book_asks, qty):
    """order_book_asks: [(price, available_qty), ...] 가격 오름차순"""
    remaining = qty
    total_cost = 0
    for price, available in order_book_asks:
        fill_qty = min(remaining, available)
        total_cost += fill_qty * price
        remaining -= fill_qty
        if remaining <= 0:
            break
    if remaining > 0:
        raise ValueError("호가창 물량이 부족해 전량 체결 불가")
    return total_cost / qty  # 평균 체결가

이 계산이 보여주는 건, 주문 수량이 클수록 그리고 호가창의 물량(유동성)이 얇을수록 평균 체결가가 처음 봤던 가격에서 더 멀어진다는 점이다.

유동성이 낮을 때 더 위험해진다

거래량이 적은 종목이나 시장이 급변하는 순간에는 호가창의 물량이 얇아진다. 이럴 때 시장가 주문을 크게 넣으면 슬리피지가 커질 수 있고, 극단적으로는 예상보다 훨씬 불리한 가격에 체결될 수 있다. 주문 유형별 단가 필드에서 다룬 것처럼 지정가 주문은 원하는 가격 이상으로 불리해지지 않는다는 보장이 있지만, 대신 체결이 안 될 수도 있다는 trade-off가 있다.

자동매매 코드에서 고려할 것

  1. 시장가·지정가를 상황에 맞게 구분한다. 즉시 체결이 중요한지, 가격 보장이 중요한지에 따라 선택이 달라진다.
  2. 큰 수량은 나눠서 낸다. 한 번에 큰 물량을 시장가로 넣는 대신, 여러 번에 걸쳐 나눠 넣으면 슬리피지를 줄일 수 있다.
  3. 백테스트에 슬리피지 가정을 포함한다. 체결가를 항상 이상적인 값으로 가정하면 실전과의 괴리가 커진다. 보수적인 슬리피지 값을 백테스트에 반영해두면 기대치를 현실에 가깝게 맞출 수 있다.

오늘의 정리

  1. 슬리피지는 호가창이 여러 단계로 이루어져 있기 때문에 생기며, 주문 수량이 클수록·유동성이 낮을수록 커진다.
  2. 시장가 주문은 즉시 체결을 보장하지만 가격은 보장하지 않고, 지정가 주문은 그 반대의 trade-off를 갖는다.
  3. 자동매매 설계에서는 큰 수량을 나눠 내는 것과, 백테스트에 현실적인 슬리피지 가정을 반영하는 것이 실전과의 괴리를 줄이는 데 도움이 된다.

이 글의 코드는 슬리피지 개념을 설명하기 위한 예시이며, 실제 거래소 호가창 데이터나 실거래 시스템의 구현이 아닙니다. 투자 조언이 아니며 특정 종목이나 매매기법을 추천하지 않습니다. 수익 보장은 없으며, 투자 손실에 대한 책임은 투자자 본인에게 있습니다.

← 전체 글 목록