데이터 파이프라인 — 수집 → 분석 → 활용 연결¶
데이터 자산 목록¶
| 파일 | 내용 | 갱신 | 크기 |
|---|---|---|---|
data/chart_profiles/all_profiles.json |
415종목 차트 DNA (존/캐릭터/저점추이) | 주말 | 415종목 |
data/sector_strength/energy_theme_stocks.json |
에너지 27테마→357종목 매핑 | 필요시 | 357종목 |
data/sector_strength/energy_supply_analysis.json |
에너지 59종목 전쟁 전후 수급 | 주말 | 59종목 |
data/ats_main.valuechain |
밸류체인 분류 (S228) | PM 직접 편집 | 6 branch × 29 segment |
| (S228 폐기: 263테마 등락률은 ats_main.valuechain + 실시간 FDR 시세로 대체) | |||
data/weekly_reports/weekly_YYYYMMDD.json |
주간 전종목 상한가/등락률/거래대금 | 매주 | 2721종목 |
docs/trading_playbook/POLICY_TRACKER.md |
글로벌 정책 추적 | /rr시 | 40+항목 |
data/tracking/tracking_list.json |
PM 추적 종목 | 수시 | - |
활용 시점별 연결¶
1. /rs 일일 루틴에서¶
장전 프리마켓 (08:50~09:30)
입력: 뉴스 + POLICY_TRACKER
→ "오늘 영향받을 테마" 식별
→ theme_history에서 해당 테마 종목 추출
→ all_profiles.json에서 해당 종목 DNA 조회
→ "이 종목은 갭업 되메우기 잦으니 시초가 추격 주의" 같은 판단
장중 종가매매 분석 (14:00~15:30)
입력: 당일 상승률/거래대금 TOP
→ all_profiles.json에서 DNA 조회
→ "이 종목은 zone_solid라 지지 신뢰도 높음" / "zone_break라 추격 위험"
→ 시나리오 카드에 DNA 정보 포함
2. /rr 주말 리서치에서¶
테마 분석 시
입력: POLICY_TRACKER 순회 → 변화 있는 테마
→ energy_theme_stocks.json에서 관련 종목 전체 추출
→ all_profiles.json에서 각 종목 DNA/저점추이/존 조회
→ energy_supply_analysis.json에서 수급 확인
→ "이 테마에서 저점 올리면서 기관 매집 중인 종목 = X"
주간 리포트 시
입력: weekly_*.json (상한가/거래대금/상승률)
→ all_profiles.json과 교차
→ "이번 주 상한가 종목 중 zone_solid인 곳은 추적 가치, zone_break인 곳은 일회성 가능"
3. PM이 종목을 물어볼 때¶
"대한해운 어때?"
1. all_profiles.json → DNA/존/캐릭터 즉시 조회
2. energy_supply_analysis.json → 전쟁 전후 수급
3. theme_history → 소속 테마 + 테마 강도
4. POLICY_TRACKER → 관련 정책 상태
→ 통합하여 프로파일 보고
"에너지 관련 아직 안 움직인 종목?"
1. energy_theme_stocks.json → 에너지 357종목
2. all_profiles.json → 저점 UP + 52주선 아래 필터
3. energy_supply_analysis.json → 기관/외인 유입 확인
→ 바닥권 축적 종목 리스트
자동 연결 함수 (stock_lookup)¶
/rs나 /rr에서 종목 코드만 넣으면 모든 데이터를 한번에 조회하는 함수.
def stock_lookup(code):
"""종목 코드 → 모든 데이터 통합 조회"""
result = {}
# 1. 차트 프로파일
profiles = load_json('data/chart_profiles/all_profiles.json')
if code in profiles['profiles']:
result['profile'] = profiles['profiles'][code]
# 2. 에너지 테마 매핑
energy = load_json('data/sector_strength/energy_theme_stocks.json')
if code in energy['stocks']:
result['energy_themes'] = energy['stocks'][code]['themes']
# 3. 수급 (있으면)
supply = load_json('data/sector_strength/energy_supply_analysis.json')
for s in supply:
if s['code'] == code:
result['supply'] = s
break
# 4. 테마 강도
# S228: theme_history 폐기. ats_main.valuechain 사용
# 해당 종목이 속한 테마의 현재 상태
return result
갱신 스케줄¶
| 시점 | 실행 | 갱신 대상 |
|---|---|---|
| 매일 장후 (16:00~) | /rs POST_MARKET |
theme_history, latest.json |
| 매주 토요일 | /rr 시작 시 |
all_profiles.json (배치), weekly_*.json, energy_supply |
| TRACKER 변경 시 | /rr 중 |
POLICY_TRACKER.md |
| PM 요청 시 | 수시 | energy_theme_stocks (테마 추가 시) |
구현 우선순위¶
- stock_lookup 함수 — 종목 코드 → 통합 조회 (즉시 구현 가능)
/rs연결 — 장전/장중 루틴에서 자동으로 프로파일 참조- 주말 배치 자동화 — all_profiles + weekly 자동 갱신
- 스크리닝 명령어 — "저점UP + 52주선아래 + 에너지테마" 같은 조합 필터
알려진 이슈 / 수정 대기¶
FIX-1. 단일 에이전트 API 실패 → 전체 루틴 exit 1 (재시도 로직 부재) [우선순위 HIGH]¶
증상 (2026-05-29 2회 발생, 동일 패턴)
| 발생 | 루틴 | 실패 에이전트 | API 에러 | 결과 |
|------|------|--------------|----------|------|
| 5/29 오전 | morning_open | global-scanner | 400 thinking blocks cannot be modified | §1 글로벌 비어서 exit 1 |
| 5/29 오후 | post_market(v4) | signal-scorecard | 529 Overloaded | UNIT 3 비어서 exit 1 |
근본 원인 (코드 근거)
1. call_agent에 재시도 없음 — scripts/evening/utils.py:161-184. subprocess.run을 1회만 호출, returncode != 0이면 즉시 [ERROR] 문자열 반환(L184). 일시적 API 529/400도 재시도 없이 실패 처리.
2. enforce 게이트가 빈 산출물(<200 bytes)을 잡고 sys.exit(1) — scripts/run_morning_open.py:44-57 (post_market v4도 동일 P2-3 게이트).
3. assemble_report()가 enforce보다 먼저 실행(run_morning_open.py:94-98) → 리포트 파일은 나머지 섹션 포함해 정상 생성되나 exit code만 1. 1개 섹션만 [ERROR] returncode=1 텍스트로 비어있음.
영향: 데이터 손실 없음(5개 중 4~5개 성공). 단 누락 1개 섹션은 메인 세션이 캐시 데이터로 수동 보강해야 완결 → 자동 파이프라인 관점에선 "exit 1 + 수동 개입 필요".
제안 수정 (최소·정확)
- scripts/evening/utils.py:161 call_agent에 재시도 래퍼 추가:
- returncode != 0 또는 stdout에 529/Overloaded/400/thinking blocks 포함 시 → 백오프(5s, 15s) 후 최대 2~3회 재시도.
- 529(Overloaded)는 잠시 후 재호출하면 대개 성공하는 전형적 일시 에러.
- morning/postmarket가 이 함수를 공유하므로 1곳 수정으로 양쪽 적용.
- (옵션, 명세 변경 → 별도 판단) enforce 게이트를 hard exit 대신 "경고 + 부분 산출 표시"로 완화.
상태: 미수정 (PM 기록 요청 2026-05-29). 수정 시 본 항목에 [DONE] + 커밋/날짜 기재.
FIX-2. (관찰) 보조 데이터 산출 결함 [우선순위 MEDIUM]¶
step_E/step_E3테마그룹 0건 반환 지속 (5/28~5/29). 그룹핑 로직 점검 필요.step_F한글 종목명 cp949 인코딩 깨짐 → 종목명 오기 유발 (코드는 정상). 디코딩 수정 필요.step_V/step_VVverdict_list 비어있음 (추적 verdict 0건 — 데이터 부재일 수 있음, 확인 필요).- 베이시스·프로그램 비차익 미수집(5/15 이후) — macro_series 수집원 점검.
상태: 관찰 중 (2026-05-29 기록).