AI 주식 파이프라인 시리즈 — 6편(마지막). 5편까지는 “오늘 움직이는 종목”을 찾는 기술적 접근이었습니다. 이번 글은 그와 별개로 돌리는, 재무 기반 스크리너의 설계를 다룹니다.


왜 재무 스크리너를 따로 만들었나

평일에 돌리는 기술적 신호 감지는 “지금 뭔가 일어나고 있는 종목”을 찾습니다. 신호가 있어야 잡힙니다. 그래서 조용히 횡보 중인 좋은 기업은 레이더에 안 걸립니다.

재무 스크리너는 다른 질문을 합니다.

“재무적으로 탄탄하고, 성장 중이고, 아직 저평가된 기업은 어디인가?”

기술적 신호가 아니라 재무제표와 밸류에이션 지표로 거르는, 퀀트 팩터 투자에 가까운 접근입니다. 연산량이 많아 평일 장중이 아니라 주말에 따로 돌립니다.

이 글 역시 “어떤 기준으로 거르는가”라는 방법론 설명입니다. 결과로 나오는 종목은 내 추가 조사의 출발점일 뿐, 매수 신호가 아닙니다.


성장주 스크리너 — 4단계 깔때기

전체 흐름

전 종목 (~3,000개)
    ↓ G1: 기초 필터 (영업흑자 + 시총 300억 이상)      → 보통 500~800개
    ↓ G2: 성장성 (매출 YoY 10%+ AND 영업이익률 5%+)   → 보통 100~200개
    ↓ G3: 가치평가 (PBR < 4 AND 0.1 < PER < 30)        → 보통 40~80개
    ↓ G4: 기술적 진입 (52주 고점 대비 -40% 이내)        → 보통 20~50개
    ↓ AI 점수화 (Gemini 0~100점, 70점 이상)            → 보통 5~10개

G1: 살아있는 기업인가

영업이익 > 0          # 적자 기업 제외
시가총액 >= 300억     # 극소형주 제외
관리종목·투자경고 아님

300억 미만 소형주를 빼는 이유는 두 가지입니다. 유동성이 너무 낮아 실제 매매가 어렵고, 재무 데이터 품질도 불안정합니다. G1에서 보통 전체의 20~25%가 통과합니다.

G2: 실제로 성장하고 있나

매출 YoY 성장률 >= 10%    # 전년 동기 대비
영업이익률 >= 5%

**매출 10%**는 인플레이션(2~3%)을 빼도 실질 성장이 분명한 수준을 가르는 기준입니다. **영업이익률 5%**는 매출이 늘어도 이익으로 이어지는지를 봅니다. 재무 데이터는 DART 공시에서 가져와 최근 4분기를 집계합니다.

revenue_curr = sum(분기별_매출[최근4분기])
revenue_prev = sum(분기별_매출[전년동기4분기])
revenue_growth = (revenue_curr - revenue_prev) / revenue_prev * 100

G3: 너무 비싸지 않은가

PBR < 4          # 성장 프리미엄 감안
0.1 < PER < 30   # 0.1 미만은 데이터 오류, 30 초과는 과열

성장주는 저평가주 기준(PBR 1~2)을 적용하면 후보가 거의 안 남습니다. 성장 프리미엄을 감안해 PBR 4까지 허용합니다.

G4: 지금 들어갈 수 있는 위치인가

현재가 >= 52주_고점 * 0.60   # 고점 대비 -40% 이내

재무가 좋아도 이미 너무 오른 종목은 진입 위치가 아닐 수 있고, 반대로 -40% 넘게 빠진 종목은 구조적 문제가 있을 가능성이 높습니다. “눌렸지만 무너지진 않은” 구간만 남깁니다.

AI 점수화

G4까지 통과한 종목을 Gemini에게 넘겨 0~100점으로 정렬합니다. 매출/이익 성장의 지속가능성, 산업 내 경쟁력, 밸류에이션의 합리성 같은 수치로 잡기 어려운 질적 판단을 맡깁니다. 일회성 이벤트로 매출이 늘었거나, 사양 산업의 일시 반등 같은 케이스를 여기서 걸러냅니다.

[성장주 스크리닝 결과 예시 — 가상]

G1→G2→G3→G4→AI: 743 → 182 → 68 → 31 → 2개

A사 (조선업, 가상 예시)
AI 점수 88 · 매출성장률 +20.7% · 영업이익률 15.4% · PBR 1.2 · PER 8.4
코멘트: 업황 회복 사이클, 수주 증가세 지속 (예시)

위 종목·수치는 출력 형식을 보여주기 위한 가상의 예시입니다.


저평가주 스크리너 — 다른 질문

성장주 스크리너가 “성장 중인가”를 묻는다면, 저평가주 스크리너는 **“이미 탄탄한데 시장이 싸게 보는가”**를 묻습니다.

전 종목 (~3,000개)
    ↓ V0: 관리종목 제외 + 기본 유동성              → 800~1,200개
    ↓ V1: 재무 안정성 (부채비율 200% 이하, 유보율 200% 이상) → 300~500개
    ↓ V2: 저평가 (PBR ≤ 1.0 AND PER ≤ 12 AND ROE ≥ 8%)      → 30~80개
    ↓ V3: 기술적 (과도한 하락 아닐 것)             → 20~60개
    ↓ AI: 가치함정 탐지                            → 3~10개

V2가 가장 좁은 병목입니다. PBR 1 이하는 “장부상 청산가치보다 싸다”는 뜻이고, 여기에 ROE 8% 이상이면 “수익성도 괜찮은데 싸다”가 됩니다. 세 조건을 동시에 만족하는 종목은 전체 시장에서 30~80개 수준밖에 안 됩니다.

마지막으로 AI가 가치함정을 걸러냅니다. 숫자상 싸 보이지만 실제로는 쌀 이유가 있는 기업 — 매출·이익이 지속적으로 감소 중이거나, 산업 자체가 사양화됐거나, 지배구조 리스크가 있거나, 장부상 이익만 있고 현금 창출이 없는 경우입니다.

VALUE_AI_PROMPT = """
다음 종목이 가치함정인지 판단하세요.

가치함정 신호:
- 매출/이익이 지속적으로 감소 중 (구조적 쇠퇴)
- 산업 자체가 사양화
- 지배구조 리스크
- 실제 현금 창출 없이 장부상 이익만 있는 경우
"""

성장주 vs 저평가주

구분성장주 스크리너저평가주 스크리너
핵심 질문성장 중인가?싼가?
PBR 기준< 4 (성장 프리미엄)≤ 1.0 (청산가치 이하)
매출 성장필수 (10%+)불필요
ROE 기준없음≥ 8%
AI 역할성장 지속가능성가치함정 탐지

한계와 실제로 겪은 문제들

방법론만 깔끔하게 적어두면 거짓말입니다. 실제로는 계속 문제가 터졌습니다.

데이터 품질

DART 재무제표가 늦게 올라오는 경우가 있습니다. 실적 발표 후 전자공시까지 며칠 걸리면, 그 기간엔 이전 분기 데이터로 판단하게 됩니다. 스크리너가 “최신”이라고 믿는 데이터가 사실 한 분기 늦은 것일 수 있습니다.

주말 API 버그

2편에서도 언급했듯, 주말에 데이터 API가 일부 필드를 None으로 반환하는 버그가 있었습니다. 이 때문에 773개 종목이 관리종목으로 오분류된 적이 있습니다. or '' 처리로 막았지만, 주말 첫 실행은 항상 결과를 눈으로 한 번 확인합니다.

기준이 너무 좁은가

PBR ≤ 1.0 + PER ≤ 12 + ROE ≥ 8%를 동시에 만족하는 종목이 너무 적게 나옵니다. 기준을 PBR ≤ 1.5, PER ≤ 15로 완화하면 후보는 늘지만 “진짜 저평가”인지 확인이 더 어려워집니다. 지금은 엄격하게 유지하는 쪽을 택했습니다. 정답은 없고, 트레이드오프만 있습니다.


정리

매주 전 종목이 두 개의 깔때기를 통과합니다.

성장주:   3,000 → 743 → 182 → 68 → 31 → 2~7개
저평가주: 3,000 → 1,100 → 420 → 52 → 38 → 3~10개

스크리너가 추려낸 종목은 끝이 아니라 시작입니다. 여기서 나온 결과는 d7(7일 후)·d30(30일 후) 수익률로 자동 추적해서, 이 필터링 방식이 실제로 의미가 있었는지를 데이터로 검증합니다. 시스템이 스스로의 기준을 점검하게 만드는 셈입니다.

여기까지가 “전 종목 스캔 → 기술적 신호 → AI 필터 → 재무 스크리너”로 이어진 6편의 기록입니다. 완성된 시스템이라기보다, 계속 고쳐 쓰는 도구에 가깝습니다.


시리즈 목차

  • 1편 · AI 두 개로 역할 나눠 운영비 줄이기
  • 2편 · 2개월 실전 운영, 삽질의 기록
  • 3편 · 데이터 소스 변천사 (yfinance → KIS)
  • 4편 · 퀀트 신호 감지
  • 5편 · AI 판단 파이프라인
  • 6편 · 성장주·저평가주 스크리너 (현재 글)