미국 증권거래위원회(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>
기본 기능
설정 관련(우측 상단에 자막을 켜시면, 설명 자막을 보실 수 있습니다.)
수집 봇·시세(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
DEDUP UPSERT 로 부분봉→확정봉 교체가 멱등 — 재시작·재요청에도 안전합니다. 백필은 2023-02 까지 완료.