AI 주식 파이프라인 시리즈 — 5편. 4편에서 퀀트 신호로 후보 종목을 추려냈습니다. 이번 글은 그 후보를 AI가 어떻게 한 번 더 거르는지, 각 단계의 설계 이유를 다룹니다.
왜 코드만으로는 부족한가
4편에서 설명한 퀀트 신호로 약 25개 종목을 추려냈습니다. 그런데 신호가 떴다고 해서 다 의미 있는 후보는 아닙니다.
이런 경우를 생각해봅니다.
- 거래량이 갑자기 3배 급증하고 신고가까지 경신 — 그런데 뉴스를 보니 경영진 횡령 기소 건이 떠 있습니다.
- 골든크로스가 발생 — 그런데 이미 6거래일 연속 상승이고 RSI가 85까지 올라간 극단적 과매수 상태입니다.
- 볼린저밴드 하단 신호 — 그런데 거래정지 검토 공시가 걸려 있습니다.
이런 케이스를 순수 규칙(코드)만으로 거르려면 조건문이 끝없이 복잡해집니다. 자연어로 된 뉴스를 읽고 맥락을 파악하는 일은 AI가 훨씬 낫습니다. 그래서 신호 감지(코드) 뒤에 AI 필터링 단계를 붙였습니다.
이 글에서 설명하는 건 “어떻게 거르는가”라는 방법론입니다. 시스템이 내놓는 결과는 어디까지나 내 분석을 돕는 참고 자료이고, 매매 판단의 도구가 아니라는 점을 먼저 밝혀둡니다.
1.5단계: Gemini가 뉴스를 먼저 본다
추려진 후보 종목에 대해 최근 뉴스를 수집하고, Gemini Flash-Lite가 배치로 한 번에 판단합니다.
RADAR_NEWS_BATCH_PROMPT = """여러 종목의 최근 뉴스를 검토해서 각각 판단해주세요.
【판단 대상】
{batch_json}
각 종목에 대해 판단하세요.
tradable=false 조건: 주권매매거래정지, 상장폐지, 횡령/분식회계, 거래정지 관련 뉴스
JSON 배열만 출력:
[
{
"symbol": "종목코드",
"tradable": true,
"news_sentiment": "호재|악재|중립|없음",
"reason": "판단 근거 한 줄"
}
]"""
여기서 걸러지는 것:
tradable: false→ 즉시 제외 (거래정지·상장폐지 위험 등 구조적 결함)news_sentiment: 악재→ 신호는 좋지만 뉴스가 나쁜 종목
이 단계에서 보통 후보가 25개에서 15~20개로 줄어듭니다.
왜 하필 Gemini Flash-Lite일까요? 이 단계는 “거래 가능한가 / 뉴스가 호재냐 악재냐”라는 비교적 단순한 분류입니다. 비싼 모델을 쓸 이유가 없습니다. 무료 티어로 충분히 처리되는 작업에는 가장 싼 모델을 쓰는 게 파이프라인 비용 설계의 기본입니다.
2단계: 기술지표 + 수급 + 뉴스를 종합한다
1.5단계를 통과한 종목을 다시 배치로 넘깁니다. 이번엔 단순 뉴스 판단이 아니라, 기술적 지표·수급·뉴스를 종합해 점수를 매깁니다.
프롬프트에 들어가는 정보는 대략 이런 형태입니다.
[종목 정보]
- 기술적 신호: 골든크로스, 거래량급증(약 2.5배)
- RSI, 이동평균 배열 구조
- 외국인 / 기관 최근 순매수 추이
- 공매도 비율, 신용잔고
- 시장 맥락: 지수 등락, 해당 섹터 강세 여부
[뉴스 요약]
- 최근 주요 뉴스 1~2건 요약
이 단계에서 10점 만점으로 스코어링합니다. 7점 이상만 다음 단계로 넘어갑니다.
여기엔 시장 상황에 따른 동적 조정도 넣었습니다. 하락장에는 통과 기준을 8점으로 올리고, 강한 상승장에는 6점으로 낮춥니다. 같은 신호라도 시장 국면에 따라 의미가 다르기 때문입니다.
3단계: 가장 비싼 모델은 가장 적게 쓴다
여기서부터 비싼 모델이 투입됩니다. 1.5~2단계를 거쳐 최종 단계까지 오는 종목은 보통 하루 0~5개 정도입니다. 비싼 연산은 후보가 충분히 줄어든 뒤에만 돌리는 게 핵심입니다.
이 단계의 입력은 앞 단계보다 훨씬 풍부합니다 — 기술 신호 점수, 이동평균 구조, 수급, 최근 뉴스, 공시 유무 등을 한 번에 넘깁니다. 모델은 이를 종합해 구조화된 JSON으로 판단 결과를 돌려줍니다.
아래는 시스템이 내놓는 출력의 형식을 보여주기 위한 가상 예시입니다. (실제 종목·수치가 아닙니다.)
{
"judgment": "단기 모멘텀 + 수급 우위",
"confidence": 0.72,
"reason": "기술 신호 복합 발생, 거래량 급증, 외인·기관 동시 순매수, RSI는 다소 높음",
"risk": "과매수 구간, 단기 차익실현 물량 주의"
}
중요한 건 출력에 신뢰도(confidence)와 리스크가 항상 함께 붙는다는 점입니다. “좋다”만 말하는 게 아니라 “얼마나 확신하는지”와 “무엇이 걸리는지”를 같이 남기도록 강제했습니다. 판단을 맹신하지 않기 위한 장치입니다.
규칙이 AI보다 우선한다
보유 중인 종목을 다루는 부분에는 추가로 트레일링 스톱 같은 하드 규칙을 넣었습니다.
# 고점 대비 일정 비율 이상 하락하면 AI 판단과 무관하게 경고
high_water = holding.get("high_water_price")
if high_water and current_price < high_water * 0.90:
action_hint = "리스크 경고" # 규칙이 강제 오버라이드
AI 판단이 “유지”라고 해도 트레일링 스톱 조건이 걸리면 경고로 바뀝니다. AI는 맥락 판단에 쓰고, 손실 관리 같은 명확한 기준은 규칙으로 못 박습니다. AI를 신뢰하되, 책임이 큰 결정일수록 결정론적 규칙을 위에 둡니다.
신뢰도 점수 — 시스템이 얼마나 자신하는가
모든 결과에는 0~1 사이의 신뢰도 점수가 붙습니다.
def compute_confidence(signal_score, news_sentiment, prior_confidence):
base = signal_score / 6.0 # 신호 점수 정규화
if news_sentiment == "호재":
base += 0.15
elif news_sentiment == "악재":
base -= 0.20
# 과거 성과 반영: 같은 패턴이 과거에 잘 맞았는지
weight = 0.3
return min(max(base * (1 - weight) + prior_confidence * weight, 0.0), 1.0)
prior_confidence는 과거 결과 추적에서 나옵니다. 추천 이후 7일·30일·90일 수익률을 자동 기록해두고, 비슷한 패턴이 과거에 얼마나 맞았는지를 신뢰도에 반영합니다. 시스템이 자기 성과를 스스로 피드백받는 구조입니다.
예시: 가상 종목 하나가 거치는 길
말로만 설명하면 추상적이니, 완전히 가상으로 지어낸 종목 하나가 단계마다 어떻게 걸러지는지 따라가 보겠습니다. (실제 종목·실제 수치가 아니라, 시스템 동작을 보여주기 위한 예시입니다.)
| 단계 | 무엇을 봤나 | 판정 |
|---|---|---|
| 신호 감지 (코드) | 골든크로스 발생 + 거래량 평소의 2.8배 | 후보 통과 (25개 중 하나) |
| 1.5단계 (뉴스) | 거래정지·악재 뉴스 없음, 최근 뉴스 ‘중립’ | tradable, 통과 |
| 2단계 (종합) | 기술 신호 + 외인 3일 순매수 + 섹터 강세 → 7.5점 | 7점 이상, 통과 |
| 3단계 (최종) | 종합 양호하나 RSI 다소 높음 | confidence 0.72, “리스크: 단기 과매수” |
핵심은 단계를 내려갈수록 보는 정보가 많아지고, 통과 종목은 줄어든다는 점입니다. 코드는 싸고 빠르게 거르고, 뒤로 갈수록 비싼 판단을 소수에게만 집중합니다. 그리고 마지막 결과에도 “통과”가 아니라 신뢰도(0.72)와 리스크가 함께 남는다는 점에 주목하세요 — 시스템은 결론이 아니라 참고 자료를 내놓는 것입니다.
전체 파이프라인 한눈에
[전 종목 ~3,000개]
↓ 코드: 기술적 신호 감지 → 상위 25개
[1.5단계] Gemini 뉴스 필터 (무료) ~25 → ~20
↓
[2단계] Gemini 종합 스코어링 (무료) ~20 → ~5
↓
[3단계] 비싼 모델 최종 판단 (소량) ~5 → 0~3
비용 구조의 핵심은 단순합니다. 싼 모델로 많이 거르고, 비싼 모델은 끝에서 조금만 씁니다. 무료 모델이 처리할 수 있는 일을 비싼 모델에 맡기지 않는 것 — 이게 개인이 이런 파이프라인을 매일 돌릴 수 있는 이유입니다.
시리즈 목차