호가창 읽기: 시장 미시구조 기초

🌐 English

대부분의 초보자는 차트(체결된 과거)를 봅니다. 하지만 시장이 지금 무엇을 원하는지는 호가창(아직 체결되지 않은 미래의 의사)에 있습니다. 봇을 만들며 호가를 다루다 보니, 차트만 볼 때는 안 보이던 것들이 보였습니다.

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

1. 호가창의 구조

호가창은 사려는 사람(매수 호가)팔려는 사람(매도 호가)의 대기 주문 목록입니다. 국내 증권사 실시간 시세는 보통 매수·매도 각 10호가와 잔량을 함께 줍니다.

       가격        잔량

매도10  10,050      1,200

 ...

매도2   10,010        800

매도1   10,005        300   ← 지금 사면 여기서 체결

------- 스프레드 5원 -------

매수1   10,000        500   ← 지금 팔면 여기서 체결

매수2    9,995        900

 ...

매수10   9,955      2,000

실시간 봇은 이 데이터를 이렇게 파싱해 들고 있습니다. KIS 웹소켓 호가(H0STASP0)에서 매도1호가·매수1호가와 각 잔량을 뽑는 식입니다.

type RealtimeQuote struct {

    AskPrice float64 // 매도1호가 (내가 사는 값)

    BidPrice float64 // 매수1호가 (내가 파는 값)

    AskQty   int64   // 매도1호가 잔량

    BidQty   int64   // 매수1호가 잔량

}

2. 스프레드 — 거래 비용의 하한

스프레드 = 매도1호가 − 매수1호가. 지금 사서 곧바로 팔면 이 차이만큼 즉시 손해입니다. 즉 스프레드는 왕복 거래의 최소 비용이자, 그 종목의 유동성을 재는 첫 번째 지표입니다.

spread := q.AskPrice - q.BidPrice

spreadPct := spread / q.BidPrice * 100

// 스프레드가 넓으면 단타 진입 자체를 보류

if spreadPct > 0.30 {

    // 유동성 부족 — 체결 비용이 엣지를 잡아먹음

    return skip

}

스프레드가 좁으면(대형 우량주·주요 ETF) 언제든 낮은 비용으로 드나들 수 있고, 넓으면(소형주·거래 한산) 들어가는 순간 이미 지고 시작합니다.

3. 잔량이 말하는 것 — 그리고 속이는 것

매수 잔량이 매도보다 두껍다면 매수 대기 압력이 크다고 읽을 수 있습니다. 호가 불균형(imbalance)은 단기 방향의 힌트가 됩니다.

imbalance := float64(q.BidQty-q.AskQty) / float64(q.BidQty+q.AskQty)

// +1에 가까움 → 매수 우위, -1에 가까움 → 매도 우위

다만 호가 잔량은 약속이 아닙니다. 대기 주문은 언제든 취소되고, 실제로 두꺼운 벽처럼 보이던 잔량이 체결 직전 사라지기도 합니다(스푸핑). 그래서 잔량은 참고 신호일 뿐, 단독 근거로 삼지 않습니다. 한 순간의 스냅숏보다 잔량이 쌓이고 걷히는 흐름이 더 믿을 만합니다.

4. 봇은 호가를 어떻게 쓰나

봇에게 호가는 세 가지 실전 용도가 있습니다.

  • 진짜 체결가 추정: 신호는 현재가로 나지만, 실제로 사는 값은 매도1호가입니다. 봇은 AskPrice·BidPrice실제 진입 비용을 미리 계산합니다. 차익거래에서는 이 한 틱 차이가 수익/손실을 가릅니다.
  • 유동성 게이트: 스프레드가 넓거나 1호가 잔량이 내 주문보다 얇으면 진입을 건너뜁니다. "좋은 신호"라도 빠져나올 수 없는 자리면 들어가지 않습니다.
  • 주문 크기 결정: 1호가 잔량 안에서 체결되도록 수량을 맞추면 슬리피지가 최소화됩니다(슬리피지 편 참고).
// 현재가가 아니라 실제 체결가로 갭 재계산

if q != nil && q.AskPrice > 0 && q.BidPrice > 0 {

    askNavGap = (q.AskPrice - nav) / nav * 100.0 // 살 때 기준

    bidNavGap = (q.BidPrice - nav) / nav * 100.0 // 팔 때 기준

}

정리

  • 차트는 과거, 호가창은 지금의 의사 — 봇은 둘 다 본다
  • 스프레드는 왕복 거래의 최소 비용이자 유동성의 첫 지표
  • 잔량 불균형은 힌트지만 취소·스푸핑으로 속일 수 있다 — 흐름으로 읽기
  • 봇은 호가로 실제 체결가 추정·유동성 게이트·주문 크기를 결정

호가창을 읽는다는 건 미래를 맞히는 게 아니라, 지금 이 자리에서 사고팔 수 있는 실제 조건을 정직하게 보는 일입니다. 그 정직함이 백테스트와 실전의 간극을 좁힙니다.

댓글

이 블로그의 인기 게시물

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

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

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