로컬 LLM으로 주식 뉴스 자동화 파이프라인 구축하기


매일 오전 주식시장 개장 전에 주요 뉴스를 정리해서 이메일로 받아보고 싶었다. 유료 서비스 쓰기엔 아깝고, 직접 만들어보기로 했다.

목표

  • 전날 오후 4시 ~ 당일 오전 7시 29분 뉴스 수집
  • 평일 오전 7:30 자동 시작, 8:00 전 이메일 발송
  • 비용 $0 (로컬 LLM 활용)

아키텍처

RSS 수집 (collector)

키워드 필터링 (summarizer)

27B 모델 보고서 생성 (reporter) — ~17분

Gmail 발송 (mailer)

전체 소요 시간: 약 18분. 7:30 시작하면 7:48 완료 → 8:00 전 여유있게 도착.

기술 스택

항목선택
뉴스 수집feedparser (RSS)
DBPostgreSQL
필터링키워드 기반 (30+ 종목/경제 키워드)
보고서 생성Ollama — Qwen 27B Q4_K_M
이메일Gmail SMTP + 앱 비밀번호
자동화macOS LaunchAgent

RSS 소스

  • 연합인포맥스
  • 한국경제
  • 매일경제
  • Reuters (영문)

핵심 설계 결정: LLM 요약 대신 키워드 필터링

처음에는 9B 모델로 각 기사를 요약하려 했다. 결과: 기사 1건당 190~240초. 100건이면 6시간 이상. 완전히 비현실적.

원인 분석: Qwen 계열의 “thinking mode” — /no_think 플래그나 think: false 옵션을 줘도 모델 내부에서 체인오브소트를 돌리는 건 막을 수 없었다.

해결: 요약은 포기하고 키워드 기반 pre-filtering으로 전환.

STOCK_KEYWORDS = [
    "주가", "증시", "코스피", "코스닥", "나스닥", "S&P",
    "금리", "달러", "환율", "채권", "인플레이션",
    "실적", "어닝", "매출", "영업이익",
    "반도체", "AI", "배터리", "전기차",
    # ...30+ 키워드
]

def is_relevant(text: str) -> bool:
    return any(kw in text for kw in STOCK_KEYWORDS)

0초에 100건 처리. 관련 기사만 DB에 저장 후 27B 모델이 한 번에 보고서 작성.

27B 모델 타임아웃

27B 모델은 17분 걸린다. 기본 타임아웃(2분)으론 당연히 실패.

response = requests.post(
    f"{OLLAMA_BASE_URL}/api/generate",
    json={"model": REPORT_MODEL, "prompt": prompt, "stream": False},
    timeout=1800  # 30분
)

KST 시간 처리

PostgreSQL은 UTC로 저장, Mac은 KST(+9). 쿼리에서 명시적 변환 필수:

WHERE collected_at >= (%s::date - INTERVAL '1 day' + INTERVAL '7 hours')
  AND collected_at <  (%s::date + INTERVAL '22 hours 30 minutes')

전날 16:00 KST = UTC 07:00, 당일 07:30 KST = UTC 전날 22:30.

LaunchAgent 등록

cp scripts/com.stocknews.daily.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.stocknews.daily.plist

plist에서 평일 5개 각각 지정 (Weekday 1~5, Hour 7, Minute 30). ProcessType: Interactive로 실행 중 Mac 슬립 방지.

결과

첫 발송 성공. 이메일에 날짜별 주요 뉴스 섹션 + 시장 요약이 Markdown → HTML로 변환되어 도착.

27B 모델이 생성하는 보고서 품질이 꽤 괜찮다. 단순 나열이 아니라 흐름을 읽어서 정리해준다.

아래는 실제 생성된 보고서 샘플이다.


실제 생성 보고서 샘플 (2026-03-04)

📊 오늘의 TOP 5

1. 이란 전쟁 장기화 우려에 코스피 7% 폭락

  • 중요도: ★★★★★
  • 선정 이유: 중동 리스크로 인해 코스피가 사상 최대급 급락하며 시장 심리에 타격을 입었기 때문입니다.
  • 관련 섹터: 전체 시장 (지수)

2. 호르무즈 해협 봉쇄 우려로 유가 급등 및 환율 1500원 돌파

  • 중요도: ★★★★★
  • 선정 이유: 에너지 가격 상승과 원화 약세는 인플레이션 우려와 수출 경쟁력 악화로 이어져 거시경제에 직접적인 영향을 미칩니다.
  • 관련 섹터: 에너지, 외환

3. 외국인 투자자, 국내주식 순매도 19조 9000억원 기록

  • 중요도: ★★★★☆
  • 선정 이유: 외국인 자금의 대규모 이탈은 시장 유동성 위축과 추가 하락 압력으로 작용할 수 있습니다.
  • 관련 섹터: 금융/시장 유동성

4. 트럼프, 호르무즈 유조선 호송 및 차등 관세 재확인

  • 중요도: ★★★★☆
  • 선정 이유: 미국 대통령의 에너지 안보 및 무역 정책은 글로벌 공급망과 무역 갈등에 장기적인 변수가 됩니다.
  • 관련 섹터: 무역, 에너지, 방산

5. 미 증시 2% 이상 하락 및 반도체 수출 규제 강화 검토

  • 중요도: ★★★★☆
  • 선정 이유: 글로벌 증시 하락과 엔비디아 등 핵심 기술주에 대한 규제 강화는 관련 섹터의 변동성을 높입니다.
  • 관련 섹터: 반도체, IT

시장 전망

중동 지정학적 리스크로 인해 코스피가 7% 급락하며 단기 조정 국면에 진입했습니다. 유가 상승과 환율 불안은 시장 심리를 위축시키지만, 밸류업 정책 등 구조적 호재는 여전히 유효합니다. 단기 변동성은 지속될 수 있으나, 리스크 해소 시 중장기 매수 기회로 접근하는 것이 타당해 보입니다.

섹터별 주목 포인트

  • 정유/에너지: 유가 급등으로 단기 실적 수혜 예상이나 변동성 주의.
  • 방산: 군사적 긴장 고조로 수혜 기대감 지속.
  • 반도체: 미국 대중국 수출 규제 강화 우려로 기술주 변동성 확대.
  • 물류/해운: 호르무즈 해협 봉쇄 우려로 물류 차질 리스크 상존.
  • 내수/밸류업: 이마트 등 기업 체질 개선 및 주주환원 정책 관심 지속.

생성 시각: 07:44 | 수집 뉴스: 40건