Topic: 테마-종목 연결 에이전트 (Theme-Stock Linker)¶
Status: ✅ 구현 + 검증 완료 (S350, 2026-06-14). 평일 라이브 재검증 잔여.
Owner: PM + 어시스턴트
출처 맥락: 주간 복기(topic_weekly_retrospective_system.md §8.3)에서 도출. morning↔discover 단절 + 재료→실제자금종목 연결 부재가 발단.
구현 산출 (S350):
- scripts/morning/build_theme_stock_input.py (전날 D7_input 후보 34종 + flow_series 수급 한 표 조립)
- .claude/agents/morning/theme-stock-linker.md (주입 표만으로 테마↔종목 매칭, 자금 유입 분류)
- scripts/run_morning_open.py PHASE 1-5 배선 + step_agents.py run_theme_stock_linker + step_report.py 섹션 4.5
- 검증: 6/14 단독 실행 — 표 밖 종목 0건 / 자금으로 핵심연결·이탈주의 분류 / 단절신호 / blind spot 포착 ✅
Decisions (S350): 실행위치 A 확정(morning PHASE 1-5, 전날 discover 후보 재사용). 후보풀=D5/D6/D7_input(pregate ~34종), D2 200종은 universe라 미사용. runner가 데이터 조립, 에이전트는 매칭만(파일탐색·WebSearch 금지). 잔여: 평일 라이브(정상 흐름) 재검증, final_picks 연동 여부, 연결등급 정량임계 정식화.
0. PM이 원하는 것 (확정)¶
"모닝오픈은 그냥 테마 정도까지가 맞다. 정확한 종목 추천까지 가려면 다른 루틴이나 discover의 서브에이전트를 전용하거나, 전날 discover에서 작동한 종목 정보를 가지고 있어야 한다." "테마와 종목을 연결해서 추천·관찰하려면, 새로운 서브에이전트가 ① 테마 선정 ② discover의 종목 후보를 받아서 처리해야 할 듯."
핵심: morning은 테마까지, discover는 종목까지. 둘을 잇는 전용 연결 에이전트가 빠져 있다. 이 에이전트가 "재료/테마에 닿으면서 + 실제로 자금이 들어오는 종목"을 추천한다.
1. 왜 필요한가 (복기로 드러난 단절)¶
| 단계 | 무엇을 함 | 종목 자금을 보나 |
|---|---|---|
| morning material-grader | 재료 → 한국 테마 매핑 | ❌ (정적 TRANSFER_MAP 교과서 매핑) |
| morning signal-synthesizer | 테마 종합 | ❌ |
| (빠진 고리) | 테마 ↔ 실제 자금 종목 연결 | — |
| discover | universe·pregate·D2~D7로 종목 발굴 | ✅ (market_top·flow_series) |
- morning은 "NVIDIA 동맹 → HBM 테마"까지만 가고 어느 종목에 실제 돈이 들어오는지 모른다 (그 데이터를 안 받음).
- discover는 종목별 자금을 보지만 morning 테마/재료와 분리돼 독립 작동.
- 6/08 NVIDIA 케이스: 재료→테마 경로(HBM·장비·전력·광통신)는 evening이 그렸으나, 그게 "실제 자금 들어온 종목"과 연결되는 단계가 없었다.
→ PM 진단: 재료→종목을 제대로 하려면 자금 흐름 시계열과 결합돼야 하는데 그 고리가 끊겨 있다.
2. 단일 질문¶
"오늘(또는 다음 거래일) 살아있는 테마 각각에 대해, 그 테마에 닿으면서 실제로 자금이 들어오고 있는 종목은 무엇인가?"
추천이 아니라 연결이다. "이 테마 → 이 종목들이 실제 자금 유입 중" 까지. 최종 매수 판정(진입가·비중)은 trader 단계 몫.
3. 입력 (전부 기존 데이터 — 신규 수집 없음)¶
| 입력 | 소스 | 내용 |
|---|---|---|
| 오늘 테마 | morning signal-synthesizer + material-grader 출력 | 살아있는 한국 테마 목록 (재료 닿는 곳) |
| 종목 후보 풀 (★~30종) | data/discover/runs/{전날}/D5_{코드}_input.json (또는 D6, 또는 D7_input.json) |
전날 discover pregate 통과 후보 ≈34종 (실측: 6/11 D2 200종 → pregate → D5/D6 34종). PM이 말한 "상승 가능성 있는 ~30종". pregate_summary.json에 통과 요약 |
| 선정/추적 종목 | data/discover/history/{전날}_D7.json (selected_code), data/discover/positions/ |
전날 discover가 최종 선정한 1종 + 추적 중인 보유 |
| 종목↔테마 소속 | data/ats_main/ (themes) |
어느 종목이 어느 테마에 속하는가 |
| 종목 자금 시계열 | data/flow_series/{코드}.json, data/market_top/{날짜}.json |
종목별 외인·기관 수급 + 거래대금 5d/20d 유입 |
✅ 데이터 가용성 (실측 확인 6/11):
- 후보 ~30종 = runs/{전날}/D5_*_input.json (코드별, 34종). 글롭으로 코드 수집 가능 (파일명 = 종목코드).
- D7_input.json = 34종 순위 패키지(있으면 이게 더 깔끔 — 후보+순위 한 파일).
- pregate_summary.json = 통과 요약.
- discover history {전날}_D7.json은 selected_code(최종 1종)만 — 후보 풀 아님, 선정 결과용.
- ⚠️ D2_(200종)는 universe 전체라 후보 풀로 쓰지 말 것. 반드시 D5/D6/D7_input(pregate 통과 ~30종) 사용.*
4. 행동 (3단계)¶
STEP 1. 테마별 종목 후보 매칭
- 오늘 테마 각각에 대해, discover 후보 풀(D2 통과 종목) 중 그 테마 소속 종목을 ats_main으로 매칭.
- "재료/테마에 닿는 종목 후보" 목록 산출. (아직 자금 안 봄 — 닿는지만)
STEP 2. 실제 자금 유입 교차 (★핵심 — 정적 매핑과의 차이)
- 매칭된 후보 각각의 flow_series·market_top로 "실제 자금이 들어오고 있나" 확인:
· 외인/기관 5d·20d 순매수 누적 방향
· 거래대금 5d/20d 유입 가속 (절대 + 상대)
- 재료에 닿으면서(STEP1) + 자금이 실제 들어오는(STEP2) 종목 = 진짜 연결.
- 닿지만 자금 안 들어옴 = "테마는 맞으나 시장이 아직 안 봄" (관찰 후보).
- 자금 들어오지만 후보 풀 밖 = discover 게이트 누락 가능성 (역피드백).
STEP 3. 연결 등급 + 서술
- 각 테마 → 종목별: [핵심 연결 / 관찰 / 자금만(테마 약)] 분류.
- "이 테마에 X·Y가 실제 자금 유입 중, Z는 닿지만 자금 미유입" 서술.
- 종목 추천이 아니라 연결 사실 + 자금 근거. 진입 판정은 trader 몫.
5. 출력 (마크다운)¶
# 테마-종목 연결 ({날짜})
> 입력: 오늘 테마 N개 + discover 후보 M종 + flow_series
## 테마별 연결
### {테마명} (재료: {닿는 재료})
| 종목 | 테마 소속 | 5d 수급 | 거래대금 유입 | 연결 등급 |
|---|---|---|---|---|
| {종목} | core/partial | 외인+N억 | 가속 | 핵심연결 |
...
- **핵심 연결**: 테마 닿음 + 자금 실제 유입 (X, Y)
- **관찰**: 테마 닿으나 자금 미유입 (Z)
- **역피드백**: 자금 유입인데 discover 후보 밖 (W — 게이트 점검)
## 단절 신호
- 테마는 있는데 후보 풀에 종목 0건 = morning 테마와 discover 풀 불일치 (복기 대상)
6. 실행 위치 — A 확정 (PM 2026-06-14)¶
morning_open 끝에 PHASE 1-5로 추가. signal-synthesizer(PHASE 1-4)가 오늘 테마를 종합한 뒤, 연결 에이전트가 전날 discover pregate 통과 후보 ~30종(runs/{전날}/D5_* 또는 D7_input.json)을 읽어 오늘 테마와 연결한다.
PM 논리: "전일 discover로 이미 상승 가능성 있는 ~30종을 후보로 봤으니, 아침에 그 후보 풀과 오늘 테마를 연결하면 된다." - "전날 후보"는 신선도 한계가 아니라 의도다 — 전날 자금이 들어오기 시작한 종목 = 오늘 아침 테마와 연결할 진짜 후보. - morning은 테마까지(PM 원칙 유지), 연결은 그 뒤 1-5에서. discover를 다시 안 돌림 — 전날 산출물 재사용.
실행 흐름:
PHASE 1-1 global / 1-2 sector / 1-3 material (각 렌즈 관찰)
PHASE 1-4 signal-synthesizer (오늘 테마 종합)
PHASE 1-5 theme-stock-linker ← 신규
입력: 1-4 테마 + runs/{전날}/D5_*(또는 D7_input) 후보 ~30종 + flow_series + ats_main
출력: 테마별 "닿으면서 자금 유입 중인 종목"
구현: scripts/run_morning_open.py에 run_theme_stock_linker(today, mo_signal_md, prev_discover_dir, ...) 추가. 전날 discover run 디렉토리 탐색(runs/{가장최근≤전날}/).
7. 미결 (PM 결정)¶
- ~~실행 위치~~ → A 확정 (morning_open PHASE 1-5).
- 후보 풀 소스 —
D7_input.json(순위 패키지 1파일) vsD5_*글롭. D7_input이 깔끔하면 우선, 부재 시 D5 글롭 폴백. - 연결 등급 임계 — "자금 유입"의 정량 기준 (5d 외인 순매수 + 거래대금 유입가속 z>0 등). discover turnover_axis 재사용 가능.
- trader와의 경계 — 연결 에이전트는 "연결 + 자금 근거"까지, 진입가·비중은 trader. 경계 명확화.
- 전날 run 부재 처리 — 주말/휴장 다음날 전날 discover run이 없으면(예: 월요일은 금요일 run) 가장 최근 ≤전날 run 사용. 그것도 없으면 "후보 풀 부재 — 테마만 표기"로 graceful degrade.
참조¶
topic_weekly_retrospective_system.md§8.3 (이 에이전트가 도출된 복기 맥락)scripts/discover/builders/build_d7_input.py(종목별 거래대금 유입가속 산식 — 재사용)scripts/discover/indicators/turnover_axis.py(market_top 거래대금 축)data/discover/runs/{날짜}/D2_*_input.json(후보 풀 실위치)docs/planning/theme_stock_selection_logic.md(기존 종목선정 논리)