주식 스크리너 만들기 | 거래량 급증 종목 검색 파이썬 개발기 1편



안녕하세요, 육성라이프입니다 😊

퇴근하고 유튜브를 보다가 이런 주장을 들었습니다. “거래량이 평소의 몇 배로 터졌는데 주가가 거의 움직이지 않았다면, 누군가 쏟아지는 매도 물량을 조용히 받아내고 있다는 뜻이다.” 큰손이 주가를 띄우기 전에 물량을 모으는 흔적, 이른바 ‘흡수(Absorption)’라는 개념입니다.

그럴듯했습니다. 그런데 저는 평범한 직장인이라 장중에 호가창을 볼 시간이 없습니다. 그래서 코스피·코스닥 전 종목에서 이 조건을 자동으로 찾아 주는 주식 스크리너를 파이썬으로 직접 만들어 보기로 했습니다. 코딩은 AI 코딩 도우미의 도움을 받았고, 판단 기준과 검증 방식은 하나하나 직접 정했습니다.

이 시리즈는 그 과정을 숨김없이 기록한 개발기입니다. 미리 말씀드리면 처음 아이디어는 10년치 데이터 앞에서 무너졌고, 여러 번 방향을 바꾼 끝에 아주 작은 우위 하나를 찾았습니다. 1편에서는 첫 번째 스크리너를 어떤 조건으로, 어떤 데이터로 만들었는지 정리합니다.

✅ 이 글에서 얻을 수 있는 것
① ‘거래량 급증 + 주가 정체’ 종목을 찾는 구체적인 조건 ② 무료로 한국 주식 데이터를 받는 방법(pykrx) ③ 스크리너를 만들 때 반드시 넣어야 할 품질 필터

1. ‘흡수 거래량’이란 무엇인가

주가는 사려는 사람과 팔려는 사람이 만나는 지점에서 결정됩니다. 거래량이 평소보다 크게 늘었다는 건 그날 손바뀜이 많았다는 뜻이죠. 보통은 거래량이 터지면 주가도 크게 움직입니다. 호재가 나와 급등하거나, 악재로 급락하거나요.

그런데 거래량은 3배 이상 터졌는데 주가는 ±3% 안에서 끝난 날이 있습니다. 흡수 이론은 이걸 이렇게 해석합니다.

  • 누군가 대량으로 팔았는데 주가가 밀리지 않았다 → 반대편에서 그 물량을 받아준 매수자가 있었다
  • 그 매수자가 기관이나 큰손이라면, 물량을 다 모은 뒤 주가를 끌어올릴 수 있다
  • 따라서 흡수가 일어난 종목을 미리 찾아 두면 상승 초입을 잡을 수 있다

논리는 깔끔합니다. 문제는 이게 실제로 돈이 되는지였습니다. 그걸 확인하려면 먼저 조건을 숫자로 정확히 정의해야 했습니다.

여의도 증권가 빌딩 숲과 한강
증권사와 운용사가 모여 있는 서울 여의도. 흡수 이론은 ‘큰손이 조용히 물량을 모은다’는 가정에서 출발합니다.
사진: heecheol890102 (Pixabay) · Wikimedia Commons (CC0)

2. 스크리너 조건을 숫자로 정의하기

“거래량이 많다”, “주가가 버텼다”는 말은 사람마다 다르게 해석합니다. 프로그램은 모호한 말을 이해하지 못하니 조건부터 숫자로 못 박았습니다.

구분조건이렇게 정한 이유
거래량 급증당일 거래량 ≥ 직전 20거래일 평균 × 3평균에 당일을 빼야 합니다. 당일을 넣으면 평균 자체가 커져 조건이 거의 안 걸립니다.
주가 정체당일 종가 등락률 ±3% 이내물량을 받아냈다면 가격이 크게 밀리지도, 튀지도 않았어야 합니다.
장중 변동폭고가와 저가 차이 6% 이하장중에 위아래로 크게 흔들린 날은 ‘버틴’ 날로 보기 어렵습니다.
거래대금10억 원 이상거래가 적은 종목은 몇 건의 주문만으로도 3배가 됩니다.
거래정지직전 20일 안에 정지 이력 없음재개 직후의 비정상 거래량을 걸러냅니다.
가격 왜곡하루 ±31% 넘는 변동 종목 제외, 스팩 제외액면분할·병합으로 가격이 끊긴 종목은 계산이 틀어집니다.

여기에 ‘강화 조건’을 따로 두어 기본 조건과 성적을 비교할 수 있게 했습니다.

  • 종가 위치 0.5 이상: 그날 고가와 저가 사이에서 위쪽 절반에서 마감 → 매수 쪽이 물량을 받아냈다는 해석에 더 가깝습니다.
  • 바닥권: 최근 120거래일 가격 범위의 아래쪽 절반 → 고점에서 큰손이 물량을 넘기는 ‘분산’과 구분하려는 장치입니다.
  • 시장 추세 필터: 해당 시장 지수가 20일 이동평균 위에 있을 때만 신규 진입합니다.
주식 차트의 캔들과 거래량 막대
캔들 차트 아래의 거래량 막대. 스크리너는 이 막대가 평소의 3배를 넘었는데 캔들 몸통은 짧은 날을 찾습니다.
사진: Rafael Minguet Delgado · Pexels (Pexels 라이선스)

3. 매매 규칙까지 정해야 백테스트가 가능하다

종목만 찾아서는 성과를 계산할 수 없습니다. 언제 사고 언제 파는지까지 정해야 과거 데이터로 “이 방법을 1년 동안 썼다면 얼마가 됐을까”를 계산할 수 있습니다. 그래서 다음 규칙을 정했습니다.

  1. 진입: 신호가 나온 날 이후 5거래일 안에 그날 고가를 돌파하면 매수합니다. 갭상승으로 시작하면 시가에 산 것으로 봅니다.
  2. 무효: 돌파 전에 신호일 저가를 깨면 감시를 끝냅니다.
  3. 손절: 신호일 저가를 이탈하면 팝니다.
  4. 1차 익절: 손절폭의 2배만큼 오르면 절반을 팔고, 나머지의 손절선을 본전으로 올립니다.
  5. 나머지 청산: 종가가 10일 이동평균 아래로 내려가면 다음 날 시가에 팔고, 최대 40거래일까지만 보유합니다.
  6. 자금 관리: 최대 3종목, 종목당 자산의 1/3, 1주 단위로만 매수합니다.
💡 미래 정보 금지가 가장 중요합니다. 신호는 그날 종가가 나온 뒤에야 알 수 있으므로, 진입 판단은 반드시 다음 날부터 합니다. 장중 고가와 저가 중 무엇이 먼저 찍혔는지 모를 때는 불리한 쪽(손절)이 먼저 일어났다고 가정했습니다. 수수료·거래세·슬리피지도 모두 뺐습니다.

4. 데이터는 어디서 받았나 — pykrx와 KRX 정보데이터시스템

한국 주식 시세는 한국거래소(KRX)가 운영하는 정보데이터시스템에서 무료로 볼 수 있습니다. 파이썬에서는 pykrx라는 오픈소스 라이브러리로 이 데이터를 받아올 수 있습니다. 하루 한 번 호출로 그날 전 종목의 시가·고가·저가·종가·거래량을 받을 수 있어서 스크리너에 딱 맞습니다.

  • 설치: pip install -U pykrx pandas
  • 최근 버전부터는 KRX 정보데이터시스템 무료 회원 로그인 정보를 환경변수로 넣어야 데이터를 받을 수 있습니다.
  • 받은 데이터는 날짜별 파일로 저장(캐시)해 두고, 다음 실행부터는 새 거래일만 받도록 했습니다.
부산에 있는 한국거래소 건물
부산에 본사를 둔 한국거래소(KRX). 스크리너가 쓰는 시세·거래량 데이터는 모두 KRX 정보데이터시스템에서 받았습니다.
사진: hyolee2 · Wikimedia Commons (CC BY-SA 3.0)

여기서 한 번 크게 데였습니다. 10년치를 한꺼번에 받으려고 요청을 쉬지 않고 보냈더니 데이터 제공처에서 접속이 차단된 겁니다. 그 뒤로는 다음 원칙을 지킵니다.

  • 요청 사이에 1.5~2.5초 무작위로 쉬기
  • 한 번 실행할 때 최대 900건까지만 받기 → 10년치는 며칠에 나눠 받기
  • 최신 날짜부터 받고, 중간에 끊겨도 받은 만큼은 저장해 두었다가 이어 받기
  • 응답이 빈 채로 계속 오면 차단으로 보고 스스로 멈추기
⚠️ 무료 공개 데이터라도 짧은 시간에 대량으로 요청하면 차단될 수 있습니다. 직접 만들어 보실 분은 반드시 속도 제한과 저장 기능부터 넣으세요.

5. 완성된 1차 스크리너의 모습

처음 버전은 명령 창에서 실행하는 형태였지만, 매일 쓰기 편하도록 더블클릭 한 번으로 실행되는 배치 파일로 바꿨습니다. 결과는 엑셀 파일로 나오고, 다음 내용을 담았습니다.

결과 항목내용
오늘 신호조건을 만족한 종목, 거래량 배수, 등락률, 종가 위치, 바닥권 여부
진입 대기 목록최근 5거래일 안에 신호가 나온 종목의 돌파가·손절가·목표가
백테스트최근 1년(기간 지정 가능), 100만 원 기준 기본 조건 vs 강화 조건 성과 비교

처음 결과 화면을 봤을 때는 솔직히 설렜습니다. 매일 수십 개 종목이 걸렸고, 차트를 열어 보면 그럴듯한 모양이 많았거든요.

모니터에 표시된 파이썬 코드
스크리너는 파이썬과 pandas로 만들었습니다. 조건 하나하나를 코드로 옮기면서 ‘모호한 말’을 숫자로 바꾸는 연습이 됐습니다.
사진: Nemuel Sereti · Pexels (Pexels 라이선스)

6. 그런데, 정말 돈이 될까?

차트를 몇 개 골라 보면 흡수 뒤에 오른 종목이 꼭 눈에 띕니다. 하지만 이건 기억에 남는 사례만 보는 착각일 수 있습니다. 흡수 뒤에 그대로 흘러내린 종목은 차트를 열어 보지도 않으니까요.

그래서 다음 단계로 10년치 실제 데이터 전체에 같은 규칙을 기계적으로 적용해 보기로 했습니다. 결과는 기대와 완전히 달랐습니다. 다음 편에서는 그 불편한 진실과, 패턴 매매가 왜 통하지 않았는지를 숫자로 정리하겠습니다.

정리 — 흡수 거래량 스크리너 핵심 요약

  • 핵심 조건: 거래량 ≥ 직전 20일 평균(당일 제외) × 3, 종가 등락률 ±3% 이내
  • 품질 필터: 장중 변동폭 6% 이하, 거래대금 10억 원 이상, 거래정지·가격 왜곡·스팩 제외
  • 매매 규칙: 5일 안 고가 돌파 진입, 저가 이탈 손절, 2R 절반 익절, 10일선 이탈 청산
  • 데이터: pykrx + KRX 정보데이터시스템(무료 회원), 속도 제한과 캐시는 필수
  • 다음 과제: 그럴듯한 차트가 아니라 10년 전체 데이터로 검증하기

자주 묻는 질문

Q. 코딩을 몰라도 만들 수 있나요?
저도 전문 개발자가 아닙니다. AI 코딩 도우미에게 조건을 숫자로 정확히 설명하면 코드는 만들어 줍니다. 다만 조건을 정확히 정의하고 결과를 의심하는 일은 사람이 해야 합니다.

Q. 거래량 3배, ±3%는 정답인가요?
아닙니다. 영상에서 본 기준을 출발점으로 삼았을 뿐입니다. 숫자를 바꿔 가며 성적이 좋은 조합을 고르는 순간 과최적화에 빠지는데, 이 이야기는 2편에서 자세히 다룹니다.

⚠️ 투자 유의 — 이 글은 개인적으로 진행한 프로그램 개발·검증 기록이며 특정 종목의 매수·매도 권유가 아닙니다. 과거 백테스트 결과는 미래 수익을 보장하지 않으며, 투자 판단과 그 결과의 책임은 투자자 본인에게 있습니다.