🛠️ Dev & Tools (투자 도구 개발)

[계좌 리팩토링] 18편(자원 관리 상). "종목을 고르지 마라, 슬롯을 관리하라!" KIS API 제한과 선필터링 전략

코딩버핏 2026. 6. 1. 21:27

KIS API 제한과 선필터링 전략

1. 들어가며: 웹소켓의 축복, 그리고 40개의 장벽

안녕하세요! 내 계좌를 지키는 견고한 자동매매 시스템, [계좌 리팩토링] 시리즈 18편입니다. 지난 17편에서는 1초의 지연도 허용하지 않기 위해 REST API 폴링 방식을 버리고, 시장의 숨결을 실시간으로 느끼는 웹소켓(WebSocket) 엔진을 도입했습니다.

0.1초 단위로 쏟아지는 틱(Tick) 데이터를 보며 "이제 완벽하다!"라고 환호했던 것도 잠시, 저는 증권사(KIS) API가 가진 아주 냉혹하고 현실적인 물리적 제약에 부딪히게 되었습니다. 바로 '웹소켓 최대 연결 수 40개 제한'입니다.

"전 종목을 다 감시하면서 기회가 올 때마다 낚아채려고 했는데, 고작 40개 종목만 실시간으로 볼 수 있다고?"

이 40개라는 숫자는 트레이딩 봇의 구조를 근본적으로 뒤바꾸는 계기가 되었습니다. 이번 편에서는 "왜 종목을 고르는 게 아니라 슬롯(Slot)을 관리해야 하는가"에 대한 깊은 고민과, 기회비용을 최소화하는 전략적 접근법을 공유합니다.

2. 문제 정의: "거래량 상위 30개 무지성 구독"의 함정

처음 40개 제한을 알았을 때 가장 먼저 떠올린, 그리고 가장 쉽게 짤 수 있는 로직은 이것이었습니다. "오늘 거래대금이 가장 많이 터진 상위 30개 종목을 골라서 무작정 웹소켓을 연결(구독)하자!"

하지만 이 방식은 실전에서 엄청난 기회비용(Opportunity Cost)을 발생시킵니다.

  • 질 낮은 종목의 슬롯 점유: 거래량이 많다고 해서 반드시 우상향하는 것은 아닙니다. 하루 종일 거대한 매물대에 막혀 횡보만 하거나, 장대음봉을 맞고 폭락 중인 종목도 거래량 상위에 랭크됩니다.
  • 진짜 기회의 상실: 이런 '질 낮은' 종목들이 귀중한 40개의 웹소켓 슬롯 중 하나를 꿰차고 있는 동안, 정작 41위 밖에서 거래량이 붙으며 전고점을 돌파하는 '진짜 예쁜 눌림목 종목'은 봇의 시야에서 완전히 사라지게 됩니다.

즉, 아무 종목이나 웹소켓에 물려놓는 것은 한정된 VIP 좌석에 아무나 앉혀놓고 정작 귀빈을 돌려보내는 것과 같습니다.

3. 해결 전략: 후보는 넓게, 바인딩(Binding)은 좁게

이 문제를 해결하기 위해 저는 패러다임을 완전히 바꿨습니다. 봇의 목표를 "어떤 종목을 매수할까?"가 아니라, "이 한정된 40개의 슬롯(웹소켓 커넥션)에 누구를 앉힐까?"로 재정의한 것입니다.

먼저, 봇이 감시할 '초기 예비 후보군(Pool)'을 대폭 넓혔습니다.

  • 국내 주식(KR): KOSPI 거래대금 상위 30개 + KOSDAQ 상위 30개 = 60개
  • 미국 주식(US): 나스닥/S&P 주요 변동성 종목 및 레버리지 ETF 60개

이렇게 최대 120개의 후보를 확보합니다. 40개밖에 연결 못 하는데 120개 후보가 무슨 소용이냐고요? 바로 여기서 '선필터링(Pre-filtering)'이라는 핵심 아키텍처가 등장합니다.

4. 선필터링 기준 설계: 깐깐한 VIP 입장 조건

120개의 후보 종목 모두에게 웹소켓을 연결해 줄 수는 없습니다. 웹소켓이라는 '비싼 리소스'를 할당하기 전에, 가벼운 REST API 호출을 통해 이 종목이 현재 VIP 좌석에 앉을 자격이 있는지 1차 면접을 봅니다.

선필터링의 기준은 우리의 핵심 매매 로직인 'VWAP + EMA 눌림목' 전략의 전제 조건과 정확히 일치합니다.

  1. VWAP 필터: 현재가가 당일의 VWAP(거래량 가중 평균가)보다 아래에 있는가?
    "추세가 꺾인 역추세 종목이군. 가차 없이 버린다(제외)."
  2. PMH / 전일 고가 필터: 현재 주가가 전일 고가나 프리마켓 고점(PMH)을 뚫어내지 못하고 비실대고 있는가?
    "상승 모멘텀이 부족하다. 횡보할 확률이 높으니 버린다(제외)."

이 깐깐한 두 가지 면접을 통과한 종목은 120개 중에서 생각보다 많지 않습니다. 하락장이거나 횡보장일 때는 10~20개만 간신히 살아남기도 합니다.

5. '거름망'이 만들어낸 압도적 효율성

이렇게 선필터링을 거치면, 귀중한 40개의 웹소켓 슬롯은 오직 '당일 시장의 주도주이면서, 상승 추세를 타고 있는 강력한 모멘텀 종목'들로만 채워지게 됩니다. 봇은 쓸데없는 하락 종목을 쳐다보며 연산력을 낭비하지 않고, 진짜 돈이 되는 타점(눌림목)이 언제 나오는지에만 100% 집중할 수 있게 된 것이죠.

투자의 세계에서 제약 조건은 언제나 창의적인 전략을 낳습니다. 증권사 API의 40개 제한이 오히려 봇의 진입 승률을 극적으로 끌어올리는 필터링 시스템을 탄생시켰으니까요.

다음 19편(자원 관리 하)에서는 이 120개의 후보를 루프(Loop) 돌리며 선필터링하고, 40개 슬롯에 안전하게 욱여넣는 파이프라인의 실제 코드 구현 흐름을 살펴봅니다. 그리고 이 과정이 백엔드 서버의 'DB 커넥션 풀(Connection Pool)' 관리와 얼마나 소름 돋게 닮아있는지, 소프트웨어 엔지니어링의 일반화된 원칙으로 확장해 보겠습니다. 기대해 주세요!