개요

미국 증권거래위원회(SEC)와 증시 관련 매체에 게재되는 문서의 양은 방대합니다. 영어 비숙련자이자 증시 관련 지식에 해박하지 않은 입장에서, 실시간으로 피드되는 문서를 모두 확인해 제때 활용하기는 어려워 이러한 문제를 해결하기 위해 시작한 프로젝트입니다. 경량 LLM API 의 Zero-shot 분류로 주가 변동성을 줄 만한 중요 문서를 선별해 웹 대시보드와 Slack 으로 전달하는 것에서 출발해, 지금은 — 미 증시 전 종목(7,000+)의 실시간 시세를 수집·저장하고, 뉴스 없이도 종목별 변동성 기준의 급등을 탐지해 원인 뉴스를 자체 DB 에서 역추적하는 시스템으로 확장됐습니다. 11개 수집 봇 + 시세 서비스 + API 서비스 3종(titan_api·webapi·sec-watch) + React 대시보드를 설계·구현·운영하고 있습니다 (2024.07 ~ ).

<aside> 📊

실측 규모 (2026-06) — 시세 유니버스 7,172 종목 활성(지원 7,211 / 전체 7,254) · 1분봉 백필 2023-02 까지 완료 · 글로벌 급등 탐지 최근 1시간 30건(장중) · 뉴스 소스(US 4 + SEC) · 컴포즈 컨테이너 ~17개(앱 12 + QuestDB·Redis·Meilisearch·MySQL)

</aside>

데모 영상

  1. 기본 기능

    news_ui_final.mov

  2. 설정 관련(우측 상단에 자막을 켜시면, 설명 자막을 보실 수 있습니다.)

    설정.mov

프로젝트 사용 기술

프로젝트 다운로드

시스템 구성

수집 봇·시세(price-watch)·서빙(webapi/titan_api)이 분리된 독립 컨테이너들이며, 공용 src/ 라이브러리를 공유하고 진입점(python -m main.<service>)만 다릅니다. 토스 API 호출은 price-watch 컨테이너가 단독 소유(클라이언트당 토큰 1개 제약)하고, webapi 는 그 결과물(Redis/QuestDB/MySQL)만 읽습니다.

flowchart LR
	subgraph BOTS["수집 봇 (컨테이너 11개)"]
		B1["SEC: 8-K · SC-13 · 13-F"]
		B2["US 미디어: titan · gnw · wsj · tipranks"]
		B3["KR 미디어: asiae · etoday · hankyung"]
	end
	BOTS -->|"LLM 분류·요약·번역"| MY[("MySQL")]
	MY --> MS["Meilisearch 색인 sync"]
	BOTS -.->|"중요 문서"| SK["Slack 웹훅"]
	subgraph PW["price-watch (토스 API 단독 소유)"]
		RP["RealtimePoller 4s 전종목"] --> GS["GlobalSpikeDetector<br>z-score 인메모리"]
		RP --> CB["합성봉 + 확정봉 백필"]
	end
	CB --> QD[("QuestDB pw_candles<br>HOUR 파티션 · DEDUP")]
	GS --> AL[("price_alerts + Redis pub/sub")]
	QD --> WA["webapi (SSE)"]
	MY --> WA
	AL --> WA
	MS --> WA
	WA --> WEB["React 대시보드 18p"]
	CADDY["Caddy 게이트웨이 + basic auth + Tailscale"] --- WEB

주요 기능 — 문서·뉴스 수집/처리

주요 기능 — 전 종목 시세 · 급등 탐지