콘텐츠로 이동

시간대별 리포트 포맷 설계 — 단기 스윙 트레이딩 원자 명세서

설계 원칙

  1. 리포트 포맷이 먼저. 어떤 결론이 필요한지 정의 -> 그 결론을 내리려면 어떤 질문이 필요한지 -> 그 질문에 답하려면 어떤 데이터가 필요한지
  2. 시간대별 역할 분리. 같은 질문을 중복하지 않음
  3. 단기 스윙 관점. 2~10일 홀딩
  4. 변화와 누적 프레임 필수. 모든 수치는 스팟(오늘 값)이 아니라 N일 시계열 + 누적으로 제공. 해석도 그 프레임 안에서 진행. 예: "30일간 +100% 상승 후 오늘 -20% → 있을 수 있는 조정이나 다소 강한 하락" 스팟만으로는 오늘 -20%가 폭락인지 건전한 조정인지 구분 불가.
  5. 가격: 당일 + 5d + 20d 수익률 + 방향
  6. 수급: 당일 순매매 + 5d 누적 + 20d 누적 + 방향 전환 여부
  7. 펀더멘탈: 직전 3~4분기 시계열 (분기별 변화율)
  8. 글로벌 자산: 당일 등락 + 5d 변화 + 20d 방향
  9. 원자 유닛 구조. 각 질문이 독립 실행 단위. 질문/방법론/도구/성공조건/실패행동/출력 완비
  10. 수집한 데이터 일시. 항상 데이터의 신선도를 확인

원자 유닛 표준 구조

모든 UNIT은 아래 7개 필드를 갖는다:

UNIT X.Y: {이름}
  질문:       1줄. 이 유닛이 답하는 단일 질문
  방법:       구체적 판정 기준. 수치 임계값, enum, 단계
  도구:       필수 호출 도구/스크립트. 폴백 순서 포함
  성공조건:   검증 가능한 조건. "이것이 있으면 성공"
  실패행동:   성공조건 미충족 시 행동. 재시도/스킵/에스컬레이션
  출력 포맷:  YAML 또는 테이블. 후속 유닛이 소비하는 형태
  후속 의존:  이 유닛의 출력을 소비하는 다른 유닛

시간대 간 역할 분리 요약

시간대 핵심 목적 산출물
EVENING (20:00~06:00) 새 매수 기회 탐색: 글로벌 환경 + 재료 구조성 + 테마/종목 선정 evening_report.md
POST_MARKET (15:20~20:00) 오늘 시장 정리 + 보유종목 6축 심층 + 매매 복기 post_market_report.md
MORNING_OPEN (06:00~08:50) 밤새 변화 반영 + 오늘 시나리오 + daily_view 생성 morning_open.md + daily_view.json
MID_MORNING (09:30~10:30) 시초가 vs 예측 대조 + 진입/이탈 판단 대화 출력
AFTERNOON (10:30~15:20) 오전->오후 흐름 변화 감지 + 포지션 관리 대화 출력

---

EVENING (20:00~06:00)

핵심 목적: 새로운 매수 기회를 찾기 위한 밤 분석. 시장환경 판단 -> 재료의 구조성 검증 -> 테마/종목 선정. 저장: docs/evening_reports/YYYYMMDD_evening.md

흐름: UNIT 1.1~1.8 (시장환경) -> UNIT 2.1~2.4 (재료검증) -> UNIT 3.1~3.8 (테마/종목)


섹션 1. 시장환경과 유동성 — "단기 매매를 하기에 우호적인가?"


UNIT 1.1: 미장 지수선물 마감 진단

질문:     미장 지수선물(ES/NQ/YM/RTY)이 어떻게 마감했는가? 방향성은?

방법:
  1. ES/NQ/YM/RTY 수집 — 당일 + 5d 누적 + 20d 누적:
     - 당일 등락률: 오늘 하루의 움직임
     - 5d 누적 수익률: 1주일 방향
     - 20d 누적 수익률: 1개월 방향
     -> 해석은 누적 프레임 안에서: "20d +8% 상승 중 당일 -1.2% → 추세 내 조정"
  2. 방향 판정 (당일 기준):
     - 4개 중 3개+ 동일 방향 -> consensus (상승/하락)
     - 2:2 또는 방향 혼조 -> mixed
     - NQ-RTY 괴리 2%+ -> rotation_signal (성장->가치 또는 역)
  3. 등락 강도 (당일):
     - |등락률| 1.5%+ -> strong
     - 0.5~1.5% -> moderate
     - 0.5%- -> muted
  4. 추세 맥락 (5d/20d):
     - 20d 양수 + 당일 양수 -> trending_up (추세 지속)
     - 20d 양수 + 당일 음수 -> pullback (추세 내 조정)
     - 20d 음수 + 당일 양수 -> bounce (하락 중 반등)
     - 20d 음수 + 당일 음수 -> trending_down (하락 지속)

도구:
  - 1순위: fetch_global_assets.py -> ES, NQ, YM, RTY 필드 (당일)
  - collect_macro_series.py -> 5d/20d 시계열 (누적 산출)
  - 폴백: WebSearch "S&P 500 futures close today"

성공조건:
  - 4개 지수 모두 당일 등락률 + 5d 누적 + 20d 누적 기재
  - 방향 판정 enum + 강도 판정 enum
  - 추세 맥락 enum (trending_up/pullback/bounce/trending_down)

실패행동:
  - 5d/20d 미수집 -> 당일만으로 판정, "누적 미확인" 명시
  - 전체 미수집 -> "미장 데이터 미수집" 명시 + UNIT 1.8에서 "판단 불가" 처리

출력 포맷:
  us_index_futures:
    data:
      - {name: ES, close: ..., change_pct: ..., return_5d: ..., return_20d: ...}
      - ...
    direction: "consensus_up|consensus_down|mixed|rotation_signal"
    strength: "strong|moderate|muted"
    trend_context: "trending_up|pullback|bounce|trending_down"
    note: "NQ 20d +12% 중 당일 -0.8% → 추세 내 소폭 조정" (예시)

후속 의존: UNIT 1.8 (종합 판단)

UNIT 1.2: 미장 섹터별 대표종목

질문:     미장 섹터별 대표종목의 등락을 통해서 현재 자금이 어떤 방향으로 흐르고 있는가?

방법:
  1. 섹터별 대표종목 등락 수집
  2. 섹터 그룹핑:
     - 반도체: NVDA/AMD/MU/AVGO/TSM
     - 전기차/자율주행: TSLA
     - 우주항공/방산: RKLB/LMT
     - 소프트웨어/AI: MSFT/GOOG/META
     - 에너지(석유): XOM/CVX
     - 에너지(신재생): ENPH/FSLR
     - 에너지(원전): CEG/VST/SMR
     - 제약/바이오: LLY/NVO/MRNA
     - 전통 금융: JPM/GS/BAC
     - 가상자산: COIN/MARA/MSTR (+ BTC 연동)
  3. 전이 판정 (각 그룹):
     - 그룹 평균 등락률 2%+ -> 한국 연관 테마 매핑
     - 개별 종목 5%+ -> 해당 종목 밸류체인의 한국 테마 특정
  4. 한국 테마 매핑표:
     - NVDA/AMD 강세 -> AI반도체/HBM/패키징
     - MU 강세 -> DRAM/NAND
     - TSLA 강세 -> 2차전지/자율주행
     - RKLB/LMT 강세 -> 우주항공/방산
     - XOM/CVX 강세 -> 정유/석유화학
     - ENPH/FSLR 강세 -> 태양광/풍력
     - CEG/VST/SMR 강세 -> 원전/SMR
     - LLY/NVO 강세 -> 바이오/제약
     - JPM/GS 강세 -> 금융/증권
     - COIN/BTC 강세 -> 가상자산/블록체인
     - 금/구리 강세 -> 비철금속/귀금속

도구:
  - fetch_global_assets.py -> AI Supply Chain 개별 종목 등락

성공조건:
  - 최소 5개 대표종목 종가 + 등락률 기재
  - 전이 가능 테마 0~3개 명시 (없으면 "전이 테마 없음")
  - 각 전이 테마에 근거 종목 + 등락률 명시

실패행동:
  - 데이터 미수집 -> WebSearch "NVIDIA stock price today" 등 개별 조회
  - 전이 판정 불가 -> "전이 불확실" 명시

출력 포맷:
  us_sectors:
    data: [{name: NVDA, close: ..., change_pct: ...}, ...]
    transfer_themes:
      - theme: "AI반도체/HBM"
        trigger: "NVDA +3.2%, AMD +2.8%"
        korean_sectors: ["반도체장비", "HBM소재"]
      - ...
    no_transfer: true|false

후속 의존: UNIT 3.1 (주도테마 선정)

UNIT 1.3: 금리/채권 환경

질문:     금리와 채권시장이 한국 단기 매매 환경에 어떤 압력을 가하는가?

방법:
  1. 미국 10Y/2Y 수익률 + 스프레드(10Y-2Y) 수집 — 당일 변화(bp) + 5d 변화 + 20d 방향
  2. 하이일드 스프레드(HY OAS) 수집 — 당일 + 20d 방향
  3. 커브 방향 판정 (5d/20d 변화 기준, 당일 스팟이 아님):
     - 스프레드 확대 중 (steepening) -> 성장 기대 or 인플레 우려
     - 스프레드 축소 중 (flattening) -> 경기 둔화 우려
     - 역전 (inversion) -> 경기 침체 경고
  4. 신용 환경:
     - HY OAS 400bp+ -> stress (위험자산 비우호)
     - HY OAS 300~400bp -> caution
     - HY OAS 300bp- -> benign (위험자산 우호)
  5. 연준 발언 확인: 당일 FOMC 멤버 발언 유무 + 방향

도구:
  - fetch_global_assets.py -> US10Y, US2Y, HY_SPREAD
  - collect_macro_series.py -> 금리 시계열 (추세 확인)
  - WebSearch "Fed speaker today" (연준 발언 확인)

성공조건:
  - 10Y/2Y 수치 + 스프레드 수치 기재
  - 커브 방향 enum (steepening/flattening/inversion/stable)
  - HY 스프레드 수치 + 신용 환경 enum (stress/caution/benign)
  - 연준 발언 유무 + 있으면 방향 1줄

실패행동:
  - HY 데이터 미수집 -> "신용 환경 미확인" 명시, 커브만으로 판정
  - 금리 전체 미수집 -> UNIT 1.8에서 "채권 축 미반영" 명시

출력 포맷:
  rates:
    us10y: {value: ..., change_bp: ..., change_5d_bp: ..., direction_20d: "rising|falling|stable"}
    us2y: {value: ..., change_bp: ..., change_5d_bp: ..., direction_20d: "rising|falling|stable"}
    spread_10y2y: {value: ..., change_5d: ..., direction_20d: "steepening|flattening|inversion|stable"}
    hy_oas: {value: ..., direction_20d: "widening|tightening|stable", credit_env: "stress|caution|benign"}
    fed_speaker: {present: true|false, direction: "hawkish|dovish|neutral", summary: "..."}

후속 의존: UNIT 1.8 (종합 판단)

UNIT 1.4: 원자재 환경

질문:     원자재 가격 변동이 한국 관련 섹터에 어떤 영향을 주는가?

방법:
  1. WTI/BRENT/GOLD/COPPER/천연가스 수집 — 당일 등락률 + 5d 변화 + 20d 방향
  2. 한국 연관 판정 (20d 방향 기반 — 당일 급등락은 추세 맥락에서 해석):
     - WTI/BRENT 5%+ 급등 -> 정유/화학 수혜, 항공/운송 압박
     - WTI/BRENT 5%+ 급락 -> 정유/화학 압박, 항공/운송 수혜
     - COPPER 3%+ -> 비철/전선/2차전지 소재 연동
     - GOLD 2%+ -> 귀금속/안전자산 선호 신호
  3. 방향 일관성:
     - 원자재 전반 상승 -> reflation (인플레 자산 우호)
     - 원자재 전반 하락 -> deflation (성장 둔화 우려)
     - 혼조 -> 개별 수급 요인

도구:
  - fetch_global_assets.py -> WTI, BRENT, GOLD, COPPER

성공조건:
  - 4개+ 원자재 종가 + 등락률 기재
  - 한국 연관 영향 있으면 테마/섹터 명시
  - 방향 일관성 enum (reflation/deflation/mixed)

실패행동:
  - 일부 미수집 -> 수집된 것만으로 판정, 미수집 명시

출력 포맷:
  commodities:
    data: [{name: WTI, price: ..., change_pct: ..., return_5d: ..., direction_20d: "up|down|flat"}, ...]
    direction: "reflation|deflation|mixed"
    korean_impact:
      - sector: "정유/화학"
        direction: "positive|negative"
        trigger: "WTI +X%"

후속 의존: UNIT 1.8 (종합 판단), UNIT 3.1 (테마 선정 참조)

UNIT 1.5: 환율 환경

질문:     환율이 외인 자금 흐름과 한국 시장 방향에 어떤 신호를 주는가?

방법:
  1. DXY + USD/KRW 수집 — 당일 등락률 + 5d 변화 + 20d 방향
  2. 달러 방향 판정 (20d 방향 기준 — 당일은 추세 맥락에서 해석):
     - DXY 상승 + USD/KRW 상승 -> 달러 강세 (외인 이탈 압력)
     - DXY 하락 + USD/KRW 하락 -> 달러 약세 (외인 유입 우호)
     - DXY와 USD/KRW 괴리 -> 한국 고유 요인 (정치/무역 등)
  3. 외인 매매 방향 추론:
     - USD/KRW 1% 이상 변동 -> 외인 포지션 변동 가능성 높음
     - USD/KRW 안정 -> 환율 요인 중립

도구:
  - fetch_global_assets.py -> DXY, USD_KRW

성공조건:
  - DXY + USD/KRW 수치 + 등락률 기재
  - 달러 방향 판정 + 외인 영향 추론 1줄

실패행동:
  - USD/KRW 미수집 -> WebSearch "원달러 환율" 폴백

출력 포맷:
  fx:
    dxy: {value: ..., change_pct: ..., return_5d: ..., direction_20d: "strengthening|weakening|stable"}
    usd_krw: {value: ..., change_pct: ..., return_5d: ..., direction_20d: "rising|falling|stable"}
    dollar_direction: "strong|weak|divergent"
    foreign_flow_pressure: "outflow_risk|inflow_support|neutral"

후속 의존: UNIT 1.8 (종합 판단)

UNIT 1.6: 유동성 프록시 (BTC)

질문:     BTC 가격이 글로벌 유동성/위험선호도에 대해 무엇을 말하는가?

방법:
  1. BTC 수집 — 당일 등락률 + 5d 변화 + 20d 방향
  2. 유동성 신호 (당일을 20d 맥락에서 해석):
     - BTC + 주식 동반 상승 -> risk-on (유동성 확장)
     - BTC 상승 + 주식 하락 -> 전통자산 불신 (디커플링)
     - BTC + 주식 동반 하락 -> risk-off (유동성 수축)
     - BTC 하락 + 주식 상승 -> 크립토 고유 이슈
  3. UNIT 1.1 결과와 교차하여 regime 판정

도구:
  - fetch_global_assets.py -> BTC

성공조건:
  - BTC 종가 + 등락률 기재
  - 유동성 신호 enum (risk_on/risk_off/decoupling/crypto_specific)

실패행동:
  - BTC 미수집 -> "유동성 프록시 미확인" 명시, UNIT 1.8에서 해당 축 제외

출력 포맷:
  liquidity_proxy:
    btc: {price: ..., change_pct: ..., return_5d: ..., direction_20d: "up|down|flat"}
    signal: "risk_on|risk_off|decoupling|crypto_specific"
    cross_check: "미장과 {동조/괴리}"

후속 의존: UNIT 1.8 (종합 판단)

UNIT 1.7: 변동성 구조 (VIX)

질문:     변동성 수준과 텀스트럭처가 시장 공포/탐욕 어디에 있는가?

방법:
  1. VIX 종가 + VIX3M + VIX9D 수집
  2. 수준 판정:
     - VIX 30+ -> high_fear (단기 매매 위험 높음)
     - VIX 20~30 -> elevated (주의)
     - VIX 15~20 -> normal
     - VIX 15- -> complacent (과잉 낙관 경고)
  3. 텀스트럭처:
     - VIX < VIX3M (contango) -> 정상. 단기 < 장기 = 시장 안정
     - VIX > VIX3M (backwardation) -> 비정상. 단기 공포 > 장기 = 이벤트 경계
  4. VIX9D/VIX 비율:
     - 0.9- -> 초단기 공포 감소 (안도)
     - 1.1+ -> 초단기 공포 급등 (패닉)

도구:
  - collect_macro_series.py -> VIX, VIX3M, VIX9D
  - 폴백: fetch_global_assets.py -> VIX

성공조건:
  - VIX 수치 기재 + 수준 enum
  - 텀스트럭처 판정 (contango/backwardation)

실패행동:
  - VIX3M 미수집 -> VIX 수준만으로 판정, 텀스트럭처 "미확인"

출력 포맷:
  volatility:
    vix: {value: ..., change_5d: ..., direction_20d: "rising|falling|stable", level: "high_fear|elevated|normal|complacent"}
    vix3m: {value: ...}
    term_structure: "contango|backwardation"
    vix9d_ratio: {value: ..., signal: "relief|normal|panic"}

후속 의존: UNIT 1.8 (종합 판단)

UNIT 1.8: 시장환경 종합 판단

질문:     위 UNIT 1.1~1.7을 종합할 때, 내일 한국 시장에서 단기 매매를 하기에 우호적인가?

방법:
  1. 6축 스코어카드 작성 (각 축 +1/0/-1, **20d 방향 기반 판정 — 당일은 맥락 보조**):
     | 축 | +1 (우호) | 0 (중립) | -1 (비우호) |
     | 미장 방향 | 20d trending_up + 당일 consensus_up/pullback | mixed 또는 muted | 20d trending_down + 당일 consensus_down |
     | 금리/신용 | 20d benign + 스프레드 stable/steepening | caution | 20d stress + inversion |
     | 원자재 | 20d 한국 수혜 방향 | mixed/무관 | 20d 한국 압박 방향 |
     | 환율 | 20d 달러 약세 (외인 유입) | 중립 | 20d 달러 강세 (외인 이탈) |
     | 유동성 | 20d risk_on | neutral | 20d risk_off |
     | 변동성 | 20d normal/falling + contango | elevated | 20d high_fear/rising 또는 backwardation |
  2. 합산:
     - +3 이상 -> favorable (적극 매매)
     - +1 ~ +2 -> neutral (선별 매매)
     - 0 이하 -> unfavorable (헷지 위주 또는 관망)
  3. 특이 조건:
     - VIX 30+ 이면 합산과 무관하게 unfavorable
     - 미장 strong + consensus_down 이면 최소 neutral 이하

도구:
  - 없음 (UNIT 1.1~1.7 출력 소비)

성공조건:
  - 6축 스코어카드 테이블 기재
  - 합산 점수 + 환경 판정 enum (favorable/neutral/unfavorable) 기재
  - 판정 근거 1~2줄

실패행동:
  - 3축 이상 미수집 -> "판단 불가 — 데이터 부족" 명시, 수집된 축만으로 잠정 판단

출력 포맷:
  market_environment:
    scorecard:
      us_market: {score: ..., reason: "..."}
      rates_credit: {score: ..., reason: "..."}
      commodities: {score: ..., reason: "..."}
      fx: {score: ..., reason: "..."}
      liquidity: {score: ..., reason: "..."}
      volatility: {score: ..., reason: "..."}
    total_score: ...
    verdict: "favorable|neutral|unfavorable"
    rationale: "..."

후속 의존: UNIT 3.1 (테마 선정 전략 분기)

섹션 1 출력 포맷 (리포트):

## 시장환경과 유동성

### 미장 마감
| 지수/선물 | 종가 | 등락 | 비고 |
| ES | ... | ... | ... |
| NQ | ... | ... | ... |
방향: {consensus_up/down/mixed} | 강도: {strong/moderate/muted}

### 섹터별 전이
| 종목 | 등락 | 한국 전이 테마 |
{UNIT 1.2 출력}

### 금리/채권
10Y {값}({변화bp}) | 2Y {값}({변화bp}) | 스프레드 {값}({방향})
HY OAS {값} — 신용환경: {stress/caution/benign}
연준: {발언 요약 또는 "없음"}

### 원자재
| 품목 | 가격 | 등락 | 한국 연관 |
{UNIT 1.4 출력}

### 환율
USD/KRW {값} ({등락}%). DXY {값} ({등락}%).
달러: {strong/weak/divergent} -> 외인: {outflow_risk/inflow_support/neutral}

### 유동성/변동성
BTC {가격} ({등락}%) — {risk_on/risk_off/decoupling}
VIX {값} ({level}) | 텀스트럭처: {contango/backwardation}

### 종합 판단
| 축 | 점수 | 근거 |
{6축 스코어카드}
**합산 {점수} -> {favorable/neutral/unfavorable}**
{근거 1~2줄}


섹션 2. 재료 검증 — "이 재료는 구조적인가, 일시적인가?"


UNIT 2.1: 재료 수집 + 1차 분류

질문:     오늘 확인된 뉴스/정책/발언 중 한국 단기 매매에 영향을 줄 재료는 무엇인가?

방법:
  1. 데이터 소스 순회:
     - 텔레그램 채널 (data/telegram/daily/*.json) -> research/strategy/breaking
     - RSS 뉴스 (fetch_evening_news.py) -> CAT2~9
     - 정책 스캔 (policy_scan.py) -> 신규/변경
     - 증권사 리포트 (fetch_broker_research.py) -> 목표가/의견 변경
     - 경제지표 (fetch_economic_calendar.py) -> 발표 결과
  2. 1차 분류 (각 재료에 태그):
     - category: policy / earnings / supply_chain / geopolitical / macro_data / sector_event / corporate_action
     - urgency: immediate (오늘 밤~내일 영향) / near_term (1주 내) / background (장기)
  3. immediate + near_term만 섹션 2.2로 전달. background는 리스트만 기록

도구:
  - fetch_evening_news.py (RSS)
  - data/telegram/daily/YYYYMMDD.json (Read)
  - policy_scan.py
  - fetch_broker_research.py
  - fetch_economic_calendar.py
  - WebSearch (보충)

성공조건:
  - 최소 3개 소스에서 재료 수집
  - 각 재료에 category + urgency 태그
  - immediate/near_term 재료 1개+ 식별 (없으면 "신규 재료 없음 — 기존 테마 유지" 명시)

실패행동:
  - 개별 소스 실패 -> 나머지 소스로 계속 수집, 실패 소스 명시
  - 전체 실패 -> "재료 수집 실패 — EVENING 섹션 2,3 스킵" 명시

출력 포맷:
  materials_collected:
    - id: M1
      headline: "..."
      source: "telegram|rss|policy|broker|calendar|websearch"
      category: "policy|earnings|supply_chain|geopolitical|macro_data|sector_event|corporate_action"
      urgency: "immediate|near_term|background"
      raw_summary: "1줄"
    - ...
  counts: {immediate: N, near_term: N, background: N}

후속 의존: UNIT 2.2 (구조성 검증)

UNIT 2.2: 재료 구조성 검증 (4-Question Binary)

질문:     각 immediate/near_term 재료가 구조적이고 지속적인가, 일시적인가?

방법:
  재료마다 4가지 질문에 Y/N 판정. 판정은 근거 기반이어야 하며, 모르면 "U"(unknown).

  Q1. 구조적인가 일시적인가?
    - Y: 반복 발생 패턴이 있다 (ISSUE_LOG에 2회+ 등장, 또는 정책 사이클의 일부)
    - N: 1회성 이벤트 (사고, 단발 발언, 일회성 수치)
    - 판정 도구: ISSUE_LOG.md 검색 (Grep "재료 키워드"), POLICY_TRACKER.md 확인

  Q2. 실체가 있는가, 내러티브만인가?
    - Y: 수주/매출/계약/생산 등 확인 가능한 사실이 존재
    - N: 기대감/테마성/루머/전망만 존재
    - 판정 도구: WebSearch "기업명 수주 계약", DART 공시 확인

  Q3. 정책적 뒷받침이 있는가?
    - Y: 법안/예산/규제/보조금이 확인됨 (POLICY_TRACKER에 등록 또는 WebSearch 확인)
    - N: 민간 자율 / 정책 미확인
    - 판정 도구: POLICY_TRACKER.md, WebSearch "정책명 법안 예산"

  Q4. 시장이 알고 동의하고 있는가?
    - Y: 증권사 리포트 2개+에서 언급, 또는 해당 테마 거래대금 20일 평균 대비 150%+
    - N: 소수만 인지, 거래대금 변화 없음
    - 판정 도구: fetch_broker_research.py, collect_sector_series.py (테마 거래대금)

  종합:
    - 4Y -> structural (구조적) — 풀사이즈 포지션 가능
    - 3Y+1N/U -> semi_structural — 제한 포지션
    - 2Y 이하 -> temporary (일시적) — 패스 또는 초소형만
    - Q2=N이면 다른 3개 Y여도 최대 semi_structural (실체 없이 구조적이란 없음)

도구:
  - docs/trading_playbook/ISSUE_LOG.md (Grep)
  - docs/trading_playbook/POLICY_TRACKER.md (Read/Grep)
  - WebSearch (Q2, Q3 확인)
  - fetch_broker_research.py (Q4)
  - collect_sector_series.py (Q4 — 테마 거래대금)

성공조건:
  - immediate/near_term 재료 각각에 Q1~Q4 판정 (Y/N/U) + 근거 1줄
  - 종합 등급 (structural/semi_structural/temporary) 기재
  - structural 또는 semi_structural 재료 0개면 "구조적 재료 없음 — 기존 테마 점검으로 전환" 명시

실패행동:
  - 개별 질문의 근거 확인 실패 -> "U"(unknown) 처리, 종합에서 불이익
  - ISSUE_LOG/POLICY_TRACKER 파일 부재 -> WebSearch로 대체, "추적 문서 부재" 경고

출력 포맷:
  material_validation:
    - id: M1
      headline: "..."
      q1_structural: {answer: "Y|N|U", evidence: "ISSUE_LOG 3회 등장 (4/20, 4/28, 5/5)"}
      q2_substance: {answer: "Y|N|U", evidence: "삼성전자 수주 공시 2026-05-10"}
      q3_policy: {answer: "Y|N|U", evidence: "POLICY_TRACKER: 반도체특별법 stage=enacted"}
      q4_consensus: {answer: "Y|N|U", evidence: "증권사 3개 언급, 테마 거래대금 180%"}
      grade: "structural|semi_structural|temporary"
    - ...

후속 의존: UNIT 2.3 (구조적 재료 상세), UNIT 3.1 (테마 선정)

UNIT 2.3: 구조적 재료 상세 — 파급 경로 추적

질문:     structural/semi_structural 재료가 어떤 경로로 어떤 테마/섹터에 파급되는가?

방법:
  1. 각 구조적 재료에 대해 파급 체인 작성:
     재료 -> 직접 수혜 섹터 -> 간접 수혜 섹터 -> 한국 테마명
  2. 파급 강도 판정:
     - direct: 재료가 해당 섹터의 매출/이익에 직접 영향 (예: HBM 수주 -> HBM 소재)
     - indirect: 밸류체인 연동 (예: NVDA 실적 -> AI 투자 확대 -> 한국 반도체장비)
     - sentiment: 테마 심리만 (예: 미국 AI 법안 -> 한국 AI SW 관심)
  3. 기존 ISSUE_LOG 등록 여부 확인 -> 미등록이면 신규 등록 권고

도구:
  - UNIT 2.2 출력 (structural/semi_structural만)
  - WebSearch (파급 경로 확인)
  - docs/trading_playbook/ISSUE_LOG.md

성공조건:
  - 구조적 재료마다 파급 체인 1개+ 기재
  - 파급 강도 enum (direct/indirect/sentiment) 기재
  - 파급 테마명 명시 (UNIT 3.1에서 소비)

실패행동:
  - 파급 경로 불명확 -> "파급 불확실 — 테마 매핑 보류" 명시

출력 포맷:
  material_propagation:
    - id: M1
      headline: "..."
      chains:
        - path: "HBM 수주 확대 -> HBM 소재 국산화 -> 한국 반도체소재"
          strength: "direct|indirect|sentiment"
          target_theme: "HBM/반도체소재"
        - ...

후속 의존: UNIT 3.1 (테마 선정)

UNIT 2.4: 일시적 재료 모니터링 리스트

질문:     temporary 재료 중 향후 구조적으로 전환될 가능성이 있는 것은?

방법:
  1. temporary 재료 중 Q1~Q4에서 "U"(unknown)가 2개+ -> watch (추적 대상)
  2. temporary 재료 중 Q2=N이 유일한 N -> substance_pending (실체 확인 대기)
  3. 나머지 -> dismiss (무시)

도구: UNIT 2.2 출력

성공조건:
  - temporary 재료 각각에 watch/substance_pending/dismiss 태그
  - watch 항목에 "확인 필요 사항" 1줄

실패행동: 없음 (모니터링 리스트이므로 실패 개념 없음)

출력 포맷:
  temporary_watchlist:
    - id: M3
      headline: "..."
      status: "watch|substance_pending|dismiss"
      check_needed: "Q3 정책 확인 필요 — 5/15 국회 심의"

후속 의존: 없음 (참조용)

섹션 2 출력 포맷 (리포트):

## 재료 검증

### 구조성 판정표
| ID | 재료 | 구조적? | 실체? | 정책? | 시장동의? | 종합 |
| M1 | ... | Y | Y | Y | Y | structural |
| M2 | ... | Y | N | Y | U | temporary |

### 구조적 재료 상세
#### {재료명}
- 사실: {출처 + 날짜 + 수치}
- 구조성 근거: {Q1~Q4 판정 요약}
- 파급 경로: {재료 -> 섹터 -> 한국 테마} (강도: direct/indirect)

### 모니터링
| 재료 | 상태 | 확인 필요 사항 |
{UNIT 2.4 watchlist}


섹션 3. 테마와 종목 — "어떤 테마의 어떤 종목을 볼 것인가?"


UNIT 3.1: 테마 선정 전략 분기

질문:     시장환경(UNIT 1.8)에 따라 어떤 전략으로 테마를 선정할 것인가?

방법:
  UNIT 1.8 verdict에 따라 분기:

  A. favorable -> 주도테마 전략
     - UNIT 2.3의 structural 재료가 파급하는 테마 중
     - 미장 전이(UNIT 1.2)와 겹치는 테마 우선
     - 최대 3개 테마 선정

  B. unfavorable -> 헷지테마 전략
     - 시장 하락일에도 RS 양수인 테마 (dashboard.json 또는 POST_MARKET UNIT 4)
     - 방어적 섹터 (필수소비재, 유틸리티, 방산, 금 관련)
     - structural 재료가 뒷받침하는 것만 선정
     - 최대 2개 테마

  C. neutral -> 선별 전략
     - structural 재료 테마만 (semi_structural 제외)
     - 미장 전이 + structural이 겹치는 테마
     - 최대 2개 테마

  공통: 구조적 재료가 0개면 -> 기존 보유 테마의 추가 종목 탐색으로 전환

도구:
  - UNIT 1.8 출력 (verdict)
  - UNIT 2.3 출력 (파급 테마)
  - UNIT 1.2 출력 (전이 테마)
  - theme_tracker/dashboard.json (헷지테마용)

성공조건:
  - 선정 전략 enum (leading_theme/hedge_theme/selective) 명시
  - 테마 1~3개 명시 + 각 테마의 선정 근거 (어떤 재료 + 어떤 전이)
  - 테마 0개일 때 "기존 테마 유지" 명시

실패행동:
  - 재료-테마 매핑 실패 -> "테마 선정 보류 — 재료 부족" 명시
  - dashboard.json 부재 -> WebSearch "KOSPI 업종별 등락률" 폴백

출력 포맷:
  theme_selection:
    strategy: "leading_theme|hedge_theme|selective|hold_existing"
    themes:
      - name: "HBM/반도체소재"
        material_id: M1
        transfer_from: "NVDA +3.2%"
        grade: "structural"
      - ...

후속 의존: UNIT 3.2 (종목풀 확보)

UNIT 3.2: 테마 내 종목풀 확보

질문:     선정된 테마에 속하는 종목 전체 리스트는?

방법:
  1. ats_main.json의 themes 필드 교차: 기존 등록 종목 확인
  2. 네이버 테마 매핑 조회: _fetch_naver_themes.py -> 테마명 검색 -> 종목 리스트
  3. 합집합 = 종목풀 (중복 제거)
  4. 종목풀이 20개 초과 -> 시가총액 하위 30% 컷 (극소형주 제외)

도구:
  - _fetch_naver_themes.py
  - ats_main.json (Read)
  - 필요시 candidate_from_theme.py

성공조건:
  - 테마당 종목풀 5~20개 확보
  - 각 종목에 code + name 기재

실패행동:
  - 네이버 테마 매핑 실패 -> ats_main.json만으로 종목풀 구성
  - 종목풀 5개 미만 -> "종목풀 부족 — 테마 PASS" 명시

출력 포맷:
  stock_pools:
    - theme: "HBM/반도체소재"
      stocks: [{code: "006340", name: "대원전선"}, ...]
      count: N

후속 의존: UNIT 3.3 (강도 랭킹)

UNIT 3.3: 종목 강도 랭킹 — "가장 강한 종목은 누구인가?"

질문:     각 테마 종목풀에서 가장 강한 종목(대장주 후보)은 누구인가?

방법:  (S3 leader-judge 방법론 적용)
  종목풀의 각 종목에 대해 4대 기준 스코어링:

  1. 누적수익률 (cum_return, 0~25):
     - 20일 누적 수익률 기준. 풀 내 상대 순위로 점수화
     - 1위: 25 / 2위: 20 / 3위: 15 / 4위: 10 / 5위: 5 / 나머지: 0

  2. 하방 탄력성 (downside_resilience, 0~25):
     - 시장(KOSPI) 하락일에 해당 종목의 상대 성과
     - KOSPI 하락일 중 종목이 양봉인 비율 70%+ -> 25
     - 50~70% -> 15
     - 30~50% -> 5
     - 30%- -> 0

  3. 거래대금 집중도 (turnover_concentration, 0~25):
     - 테마 전체 거래대금 중 해당 종목 비중
     - 30%+ -> 25 / 20~30% -> 20 / 10~20% -> 10 / 10%- -> 0

  4. 반응 속도 (reaction_speed, 0~25):
     - 테마 재료 발생일 대비 주가 반응 시점
     - 재료일 당일 반응 -> 25 / D+1 -> 20 / D+2 -> 10 / D+3 이후 -> 0
     - 재료일 특정 불가 -> 최근 5일 등락률 상위 여부로 대체

  5. 패턴 보너스 (lead_lag_pattern, -15~+15):
     - leading (재료 전 or 동시 상승 + 풀 내 1~2위): +15
     - concurrent (동시 상승 + 3~5위): +10
     - follower (1일+ 지연): -5
     - late (3일+ 지연): -15

  6. 총점 = 4대 기준 합(0~100) + 패턴 보너스(-15~+15) = -15 ~ 115
     - 80+ -> leader (테마당 최대 2개)
     - 60~79 -> sub_leader
     - 40~59 -> follower
     - 39- -> noise (이후 분석 제외)

  7. 상한가 신규 종목은 3거래일 관찰 후 승격 (하루 교체 금지)

도구:
  - Kiwoom REST API get_daily_chart (20일 OHLCV) 또는 collect_stock_flow_series.py
  - detect_theme_leaders.py (l_score, 거래대금 점유율)
  - KOSPI 일별 등락 (fetch_market_top.py 또는 collect_macro_series.py)

성공조건:
  - 종목풀 전체에 4대 기준 점수 기재
  - leader 1개+ 식별
  - leader 0개면 -> "대장주 미식별 — 테마 PASS 또는 sub_leader로 제한적 진행" 명시

실패행동:
  - OHLCV 미수집 -> fetch_market_top.py 등락률 상위로 대체 (정밀도 하락 수용)
  - 거래대금 데이터 없음 -> turnover_concentration 0 처리, 나머지 3축으로 판정

출력 포맷:
  leader_ranking:
    theme: "HBM/반도체소재"
    ranked:
      - code: "006340"
        name: "대원전선"
        scores: {cum_return: 25, downside_resilience: 15, turnover_concentration: 20, reaction_speed: 25, pattern_bonus: 15}
        total: 100
        role: "leader"
      - ...
    leaders: [{code, name}]
    sub_leaders: [{code, name}]

후속 의존: UNIT 3.4 (수급 검증), UNIT 3.5 (추세 검증), UNIT 3.6 (펀더멘탈 검증), UNIT 3.7 (실체 검증)

UNIT 3.4: 수급 검증 — "돈이 들어오고 있는가?"

질문:     leader/sub_leader 종목의 수급이 매수를 뒷받침하는가?

방법:  (SEN-1 flow-cumulator 방법론 적용)
  각 leader/sub_leader 종목에 대해:

  1. 주체별 일별 순매수 시계열 수집 (최소 5일):
     - 외국인 / 기관 / 개인 / (가능하면 연기금)
     - 각 주체 5일 누적 + 20일 누적 산출

  2. 패턴 분류 (주체별):
     - accumulation: 5일 중 4일+ 같은 방향, 크기 안정, 가격 변동 작음
     - chasing: 1~2일 집중 대량 매수, 가격 동반 급등
     - distribution: 누적 매수 후 방향 전환, 크기 점감/급반전
     - reversal: 직전 5일과 최근 3일 방향 반대, 크기 증가
     - mixed: 방향/크기 불규칙
     - spike: 1일에 20일 평균 3배+ 집중

  3. 주체 간 동조 판정:
     - 외인+기관 동조 매수 -> dual_buy (강한 매수 신호)
     - 외인 매수 + 기관 매도 -> foreign_led (외인 주도)
     - 기관 매수 + 외인 매도 -> inst_led (기관 주도)
     - 개인만 매수 -> individual_only (약한 신호)

  4. 수급 판정 (GO/CAUTION/STOP):
     - GO: dual_buy 또는 한 주체 accumulation + 다른 주체 비매도
     - CAUTION: foreign_led 또는 inst_led (한쪽만)
     - STOP: distribution 패턴 또는 individual_only

  ** 수급에 선악 라벨 금지. "나쁜 수급", "개인 FOMO" 등 사용 금지.
     판정은 패턴명 + 주체 동조 여부로만. **

도구:
  - collect_stock_flow_series.py --codes {코드} --days 20
  - 키움 REST API ka10059 (종목별투자자기관별요청)
  - 폴백: 네이버 금융 fetch_stock_investors

성공조건:
  - 주체별 5일 일별 수치 + 5d/20d 누적 기재
  - 패턴명 + 판정 근거 (어느 날 어떤 움직임) 기재
  - 주체 간 동조 enum 기재
  - 수급 판정 (GO/CAUTION/STOP) 기재
  - 모든 수치에 날짜 명시

실패행동:
  - 수급 데이터 미수집 -> "수급 미확인" 명시, UNIT 3.8에서 수급 축 제외
  - 5일 미만 데이터 -> "데이터 부족 — CAUTION 처리" 명시

출력 포맷:
  flow_check:
    - code: "006340"
      name: "대원전선"
      foreign: {daily: [...], cum_5d: ..., cum_20d: ..., pattern: "accumulation", detail: "5/8~5/12 연속 매수 평균 +2.3만주"}
      institution: {daily: [...], cum_5d: ..., cum_20d: ..., pattern: "mixed"}
      individual: {daily: [...], cum_5d: ..., cum_20d: ..., pattern: "distribution"}
      dynamics: "dual_buy|foreign_led|inst_led|individual_only"
      verdict: "GO|CAUTION|STOP"
      evidence: "외인 5d 누적 +12만주(accumulation) + 기관 5d +5만주 -> dual_buy"

후속 의존: UNIT 3.8 (종합 검증)

UNIT 3.5: 차트 검증 — "시장참여자의 불균형이 매수를 지지하는가?"

질문:     leader/sub_leader 종목의 차트에서 누가 급하고, 미해소 불균형이 어디에 남아 있는가?

방법:  (C10 chartist 불균형 프레임워크 full 적용)

  ** 4묶음 해석 **

  A. 불균형 지도 (Q1: 공간):
     - VP(일봉+분봉)에서 HVN/LVN 위치 파악
     - 현재가가 VA(합의 구간) 안인가 밖인가
     - POC(최대 합의 가격) 대비 위치
     - sr_levels와 VP 겹침 -> 강한 지지/저항

  B. 불균형 동태 (Q2+Q3: 생성 vs 해소 + 주체):
     - VSA 3축: norm_spread / norm_vol / close_zone
     - effort-vs-result: effort > result = 조용히 흡수(축적). result > effort = 빈 구간 통과
     - delta 방향: 매수/매도 중 누가 aggressive side
     - phase_bias: 현재 phase에서 이 수급 흔적이 축적인가 분배인가
       - rally 중 climax_buying -> trend_acceleration (승률67%)
       - decline 중 climax_buying -> dead_cat_bounce (승률0%, 회피 필수)
       - consolidation 중 고거래량 -> accumulation_absorption (축적 흡수)

  C. 진입 판단:
     - SL = HVN 위치 기반 (합의 존재 = 지지). sr_level과 겹치면 더 강함
     - LVN 위의 SL은 "지지 약함" 경고 필수
     - SL이 현재가 대비 7%+ 아래 -> "SL 과대 — 포지션 축소 권고"

  D. 방향 확인 (Q4: 상위TF):
     - 주봉/월봉의 불균형 방향과 일봉 방향 일치 여부
     - 상위TF와 일봉 동일 방향 -> 확신 강화
     - 상위TF와 일봉 반대 -> 역추세 경고

  ** 구조 무결성 (T2 연동) **
  - 60일 스윙에서 HH/HL/LH/LL 시퀀스 추출
  - structure_break_stage:
    - intact: HL + 기준봉 유지
    - hl_break: 첫 LL 출현
    - hh_hl_break: HH+HL 모두 이탈
    - ll_confirmed: 구조 전환 확정

  ** 백테스트 검증된 유효 신호 (7종목 x 2기간, 2,195일) **
  - demand_bar: 승률 74% (최고)
  - trend_acceleration: T+10 +6.84%, 승률 67%
  - shakeout_candidate: 승률 62%
  - close_zone=lower: 일관 우위 55%
  - dead_cat_bounce: 0% -> 회피 필수

  ** 차트 판정 (GO/CAUTION/STOP) **
  - GO: intact + 축적/가속 + SL HVN 기반(강함) + 상위TF 동일 방향
  - CAUTION: intact + 소진, 또는 hl_break, 또는 SL LVN 기반(약함)
  - STOP: hh_hl_break 또는 ll_confirmed 또는 dead_cat_bounce 감지

  ** chart_snapshot 저장 (사후 검증용) **
  판정 시점의 차트 해석 근거를 verdict_list.json에 함께 기록:
  {cutoff, phase, vsa_latest(norm_spread/norm_vol/close_zone/evr/delta_pct),
   vsa_events_recent, cum_delta_5d,
   vp_daily(poc/nearest_hvn/nearest_lvn), vp_intraday(poc/nearest_hvn/nearest_lvn),
   sl_basis, sl_vp_quality, imbalance_assessment, dominant_direction, synthesis}
  -> WEEKLY REVIEW(UNIT W.3)에서 D+10/D+20 시점 대조.
     틀렸으면 어떤 축(phase? delta? VP?)이 틀렸는지 분류.

도구:
  - mtf_chart_profiler.py (VP + VSA + phase + structure)
  - Kiwoom REST get_daily_chart (60일+ OHLCV)
  - 폴백: collect_stock_flow_series.py (OHLCV)

성공조건:
  - 4묶음(A/B/C/D) 각각에 evidence 1개+ (수치 포함)
  - structure_break_stage enum 기재
  - SL은 HVN 기반 우선 + sl_vp_quality(HVN 강함/LVN 약함) 명시
  - chart_snapshot JSON 저장
  - 차트 판정 (GO/CAUTION/STOP)
  - synthesis: "[축적/가속/소진/해소] N일째" (패턴명이 아니라 불균형 상태로)

실패행동:
  - mtf_chart_profiler 실패 -> OHLCV 원시 데이터로 구조 무결성만 판정, 4묶음 "미수행"
  - 분봉 VP 불가 -> 일봉 VP만으로 판정, "분봉 VP 미확인" 명시

출력 포맷:
  chart_check:
    - code: "006340"
      name: "대원전선"
      imbalance_map:
        current_vs_va: "above|within|below"
        daily_poc: ...
        intraday_poc: ...
        nearest_hvn: ...
        nearest_lvn: ...
      imbalance_dynamics:
        status: "creating|absorbing|neutral"
        aggressive_side: "buyers|sellers|balanced"
        phase: "..."
        key_events: ["demand_bar", "trend_acceleration"]
      structure_break_stage: "intact|hl_break|hh_hl_break|ll_confirmed"
      higher_tf_alignment: "aligned|divergent"
      sl_price: ...
      sl_basis: "hvn|sr_confluence"
      sl_vp_quality: "HVN(강함)|LVN(약함)"
      synthesis: "[가속] 5일째. 외인 누적 delta 양수"
      verdict: "GO|CAUTION|STOP"
      chart_snapshot: {cutoff, phase, vsa_latest, vp_daily, vp_intraday, ...}

후속 의존: UNIT 3.8 (종합 검증), WEEKLY REVIEW UNIT W.3 (사후 검증)

UNIT 3.6: 펀더멘탈 최소 검증 — "최소한 돈을 벌고 있는가?"

질문:     leader/sub_leader 종목이 최소한 적자가 아닌가? 이익의 질은?

방법:  (FA-M1 triple-cross 간소화 적용)

  EVENING에서는 full 펀더멘탈이 아닌 **최소 검증**만 수행:

  1. 최근 3~4분기 영업이익 시계열 확인 (스팟이 아닌 분기별 변화 추이):
     - 직전 3~4분기 OP 나열 -> 방향 판정 (증가/유지/감소/적자축소/적자확대)
     - 최근 분기 흑자 + 방향 증가 -> PASS
     - 최근 분기 흑자 + 방향 감소 -> CONDITIONAL (둔화 중)
     - 최근 분기 적자 + 적자축소 추세 -> CONDITIONAL (개선 중)
     - 적자 지속 2분기+ + 방향 악화 -> FAIL

  2. Accrual Ratio 간이 체크 (가능 시):
     - 영업이익 / 영업CF
     - 0.8~1.2 -> 정상
     - 영업CF 음수 + 영업이익 양수 -> RED_FLAG

  3. 매출 방향:
     - YoY 매출 성장 -> growth
     - YoY 매출 정체/감소 -> flat_or_decline

  4. EPS/PER — 시장 평가 수준 읽기:
     - EPS(주당순이익): 직전 4분기 합산 (trailing) 또는 컨센서스 forward
     - PER = 현재가 / EPS
     - PER 해석 (고평가=위험이 아님. 시장참여자의 관심/기대 수준을 읽는 도구):
       - PER 30+ -> 시장이 높은 성장을 기대 중. 기대 충족 시 추가 상승, 미충족 시 급락 리스크
       - PER 10~30 -> 적정~보통 기대
       - PER 10- -> 시장 관심 저조 또는 성장 기대 없음
       - PER 음수(적자) -> 실적이 아닌 재료/내러티브로 움직이는 종목
     - 동종업계 PER 대비 위치: 업종 평균 대비 높으면 "시장이 이 종목에 더 기대", 낮으면 "시장 관심 저조"

  5. 펀더멘탈 판정 (PASS/CONDITIONAL/FAIL):
     - PASS: 흑자 + accrual 정상 + 매출 growth
     - CONDITIONAL: 흑자이나 accrual 이상 또는 매출 flat, 또는 적자축소 추세
     - FAIL: 적자 지속 2분기+ 또는 RED_FLAG

도구:
  - DART MCP get_financial_statement (직전 2~3분기 IS + CF)
  - Kiwoom REST 또는 네이버 금융 (EPS/PER/업종 PER)
  - 폴백: WebSearch "기업명 실적 영업이익 PER"

성공조건:
  - 영업이익 수치 + 흑자/적자 판정
  - 매출 방향 (growth/flat_or_decline)
  - EPS + PER 수치 + 시장 기대 수준 해석 1줄
  - 펀더멘탈 판정 (PASS/CONDITIONAL/FAIL)
  - DART 기간 명시 (예: "2026Q1 연결")

실패행동:
  - DART 미조회 -> WebSearch 폴백
  - EPS/PER 미수집 -> "밸류에이션 미확인" 명시, 영업이익만으로 판정
  - 양쪽 다 실패 -> "펀더멘탈 미확인" 명시, UNIT 3.8에서 해당 축 "U"

출력 포맷:
  fundamental_check:
    - code: "006340"
      name: "대원전선"
      period: "2025Q2~2026Q1 연결"
      op_income_series: [{q: "2025Q2", value: ...}, {q: "2025Q3", value: ...}, {q: "2025Q4", value: ...}, {q: "2026Q1", value: ...}]
      op_direction: "accelerating|growing|stable|decelerating|loss_narrowing|loss_widening"
      accrual_ratio: {value: ..., status: "normal|warning|red_flag"}
      revenue_series: [{q: "2025Q2", value: ...}, ...]
      revenue_direction: "growth|flat_or_decline"
      eps: {value: ..., basis: "trailing|forward"}
      per: {value: ..., sector_avg: ..., market_expectation: "high_growth|moderate|low_interest|narrative_driven"}
      verdict: "PASS|CONDITIONAL|FAIL"
      note: "OP 4분기 연속 증가(12→18→25→34억). PER 45(업종 22) — 시장이 HBM 성장에 높은 기대"

후속 의존: UNIT 3.8 (종합 검증)

UNIT 3.7: 테마 매출 실체 검증 — "이 종목이 테마에서 진짜 돈을 버는가?"

질문:     leader/sub_leader 종목이 해당 테마에서 실제 매출을 올리는가, 편승인가?

방법:  (S5 revenue-classifier 방법론 적용)

  1. 테마 매출 비중 산출 (우선순위):
     - 1순위: DART 세그먼트 매출 비율 (있으면 직접 사용)
     - 2순위: 사업보고서 business_summary 키워드 추정
       - "주력사업" -> 50%+ (core)
       - "주요 사업 중 하나" -> 30~50% (partial)
       - "일부 사업" -> 10~30% (peripheral)
     - 3순위: 업종 분류만으로 가능 시
     - 모든 단서 부재 -> unknown

  2. 실체 등급:
     - core (50%+): 테마 수혜 직접적
     - partial (30~50%): 부분 수혜
     - peripheral (10~30%): 제한적 수혜
     - unrelated (10%-): 편승 (SUBSTANCE_THIN 경고)
     - unknown: 판단 불가

  3. 시장참여자의 매출영역 평가:
     - 시장이 이 종목을 해당 테마의 수혜주로 인식하고 있는가?
     - 실체(실제 매출)와 내러티브(기대감) 구분:
       - 실체 + 시장 인식 = 가장 강함 (실제 수혜 + 참여자 동의)
       - 실체 없음 + 시장 인식 = 내러티브 주도 (단기 모멘텀 가능하나 지속성 낮음)
       - 실체 있음 + 시장 미인식 = 발굴 기회 (아직 반영 안 됨)
       - 실체 없음 + 시장 미인식 = 무관
     - 판정 근거: 증권사 리포트에서 해당 테마로 언급 여부 + 테마 종목 리스트에 포함 여부 + 거래대금 변화

  4. 실체 판정 (GO/CAUTION/STOP):
     - GO: core/partial + 시장 인식
     - CAUTION: peripheral/unknown, 또는 내러티브만 존재
     - STOP: unrelated + 시장 미인식 (편승주 — 매수 금지)

도구:
  - ats_main.json -> stocks[].business_summary, industry, themes
  - DART MCP get_financial_statement (세그먼트)
  - WebSearch "기업명 사업 구성 매출 비중"
  - 네이버 테마 종목 리스트 (시장 인식 확인)
  - UNIT 3.6 PER 출력 (시장 기대 수준 교차 참조)

성공조건:
  - exposure enum + estimated_revenue_pct 수치 기재
  - source 명시 (segment_revenue/business_summary/industry/unknown)
  - 시장 인식 여부 (recognized/unrecognized) + 근거
  - 실체 판정 (GO/CAUTION/STOP)

실패행동:
  - 매출 비중 확인 불가 -> "unknown — CAUTION" 처리
  - 시장 인식 확인 불가 -> 네이버 테마 리스트 포함 여부로 대체

출력 포맷:
  substance_check:
    - code: "006340"
      name: "대원전선"
      theme: "HBM/반도체소재"
      exposure: "core|partial|peripheral|unrelated|unknown"
      estimated_revenue_pct: ...
      source: "segment_revenue|business_summary|industry|unknown"
      market_recognition: "recognized|unrecognized"
      substance_vs_narrative: "실체+인식|내러티브만|실체+미인식|무관"
      verdict: "GO|CAUTION|STOP"
      evidence: "DART 세그먼트 매출 15%(peripheral), 네이버 HBM 테마 리스트 포함(recognized), 내러티브 주도"

후속 의존: UNIT 3.8 (종합 검증)

UNIT 3.8: 종합 검증 + 최종 후보 선정

질문:     4축(강도+수급+추세+펀더+실체) 교차 결과, 최종 매수 후보는?

방법:
  1. 5축 교차 테이블 작성 (leader/sub_leader만):

     | 축 | GO | CAUTION | STOP |
     | 강도(3.3) | leader/sub_leader | follower | noise |
     | 수급(3.4) | dual_buy/accumulation | foreign_led | distribution/individual_only |
     | 차트(3.5) | intact+축적/가속+상위TF동일 | hl_break/소진/SL약함 | hh_hl_break/ll_confirmed/dead_cat |
     | 펀더(3.6) | PASS | CONDITIONAL | FAIL |
     | 실체(3.7) | core/partial | peripheral/unknown | unrelated |

  ** 핵심 원칙: 주도테마의 주도주를 벗어나지 않는다 **
  정교한 분석으로 숨겨진 종목을 찾는 게 아니라,
  주도테마의 주도주(최소한 주도주였고) + 재료가 살아 있고 + 차트가 건강한 종목.
  이 3가지를 동시에 충족하면 매수, 하나라도 깨지면 PASS.

  2. 최종 판정:
     - 5축 모두 GO -> STRONG_BUY (1순위 후보)
     - 4축 GO + 1축 CAUTION -> BUY (2순위 후보)
     - 3축 GO + 2축 CAUTION -> WATCH (관찰 대상)
     - STOP 1개라도 있으면 -> PASS (매수 금지)
     - 예외: 차트 STOP은 절대 STOP (다른 축이 모두 GO여도 PASS)

  3. 테마당 최대 3종목, 전체 최대 5종목으로 제한
     - STRONG_BUY > BUY > WATCH 순서로 선발
     - 동점이면 강도(3.3) 총점 높은 순

  4. 각 후보에 진입 조건 부기:
     - 진입가: 현재가 기준 또는 눌림목 대기가
     - SL: UNIT 3.5에서 산출한 값 (HVN 기반)
     - Kill 조건: "이 조건이 깨지면 무조건 나간다"
     - 리스크 금액: SL까지의 거리 x 수량 (포지션 사이징 참조용)

도구:
  - UNIT 3.3~3.7 출력 종합

성공조건:
  - 5축 교차 테이블 기재
  - 최종 판정 enum (STRONG_BUY/BUY/WATCH/PASS) 기재
  - STRONG_BUY 또는 BUY 종목에 진입조건(진입가/SL/Kill/R:R) 기재
  - 후보 0개일 때 "매수 후보 없음 — 관망" 명시

실패행동:
  - 축 1~2개 미확인 -> 해당 축 "U" 처리, 나머지로 판정 (단, U가 2개+면 최대 WATCH)

출력 포맷:
  final_candidates:
    - code: "006340"
      name: "대원전선"
      theme: "HBM/반도체소재"
      axes:
        strength: {score: 100, role: "leader", verdict: "GO"}
        flow: {pattern: "dual_buy", verdict: "GO"}
        trend: {stage: "intact", phase: "acceleration", verdict: "GO"}
        fundamental: {op: "profit", verdict: "PASS"}
        substance: {exposure: "core", verdict: "GO"}
      final_verdict: "STRONG_BUY"
      entry:
        entry_price: "..."
        sl_price: "..."
        sl_distance_pct: "..."
        kill_condition: "HL 이탈 시 무조건 청산"
        risk_amount: "SL거리 x 수량"
    - ...
  summary:
    strong_buy: N
    buy: N
    watch: N
    pass: N

섹션 3 출력 포맷 (리포트):

## 테마와 종목

### 전략: {leading_theme/hedge_theme/selective}
시장환경: {favorable/neutral/unfavorable}

### 선정 테마
| 테마 | 근거 재료 | 미장 전이 | 구조성 |
{UNIT 3.1 출력}

### 종목별 5축 검증
| 종목 | 테마 | 강도 | 수급 | 추세 | 펀더 | 실체 | 종합 |
| 대원전선 | HBM | GO(100) | GO(dual_buy) | GO(intact) | PASS | GO(core) | STRONG_BUY |
| ... | ... | ... | ... | ... | ... | ... | ... |

### 최종 후보 상세 (STRONG_BUY/BUY만)
#### {종목명} ({코드}) — {테마}
- **강도**: 총점 {X}점, {leader/sub_leader}. {근거}
- **수급**: 외인 5d 누적 {+X만주}({accumulation}), 기관 {+Y만주}. 동조: {dual_buy}
  (출처: collect_stock_flow_series.py, 기간: 5/8~5/12)
- **추세**: 구조 {intact}. HL 시퀀스 {3회 연속 상승}. 페이즈: {acceleration}
  SL: {가격} (현재가 대비 {-X%})
- **펀더**: {2026Q1} 영업이익 {X억} (흑자). 매출 YoY {+X%}. Accrual {0.95}(정상)
- **실체**: 테마 매출 비중 추정 {X%} ({core}). 근거: {사업보고서 주력사업}
- **진입 조건**:
  - 진입: {가격대}
  - SL: {가격} ({-X%})
  - Kill: {조건}
  - 리스크 금액: {SL거리 x 수량}

### 관찰 대상 (WATCH)
| 종목 | 테마 | 부족 축 | 모니터링 포인트 |

---

POST_MARKET (15:20~20:00)

핵심 목적: 오늘 시장 정리 + 보유종목 심층 분석 + 매매 복기 + 내일 준비 저장: docs/daily_reports/YYYYMMDD_post_market.md

흐름: UNIT 4.1~4.3 (시장 정리) -> UNIT 5.1~5.5 (보유종목 심층) -> UNIT 6.1~6.3 (매매 복기) -> UNIT 7.1 (내일 준비)


섹션 4. 오늘 시장 정리 — "오늘 무슨 일이 있었는가?"


UNIT 4.1: 시장 개요 + 업종별 등락

질문:     오늘 KOSPI/KOSDAQ의 방향과 주도 업종은?

방법:
  1. KOSPI/KOSDAQ 종가 + 등락률 + 거래대금 수집
  2. 업종별 등락률 상위/하위 5개
  3. 시장 성격 판정:
     - 대형주 주도 (KOSPI200 > KOSPI) vs 중소형 주도 (KOSDAQ > KOSPI)
     - 거래대금 전일 대비 증감 -> 참여도 판정

도구:
  - fetch_market_top.py (등락률/거래대금 상위)
  - collect_macro_series.py (KOSPI, KOSDAQ, KOSPI200)

성공조건:
  - KOSPI/KOSDAQ 종가 + 등락률 + 거래대금
  - 주도 업종 3개+ 명시
  - 시장 성격 1줄

실패행동:
  - fetch_market_top 실패 -> collect_macro_series로 지수만 확인

출력 포맷:
  market_summary:
    kospi: {close: ..., change_pct: ..., volume_krw: ...}
    kosdaq: {close: ..., change_pct: ..., volume_krw: ...}
    leading_sectors: [{name, change_pct}]
    lagging_sectors: [{name, change_pct}]
    character: "large_cap_led|small_cap_led|broad_rally|broad_decline|mixed"

후속 의존: UNIT 7.1 (내일 준비)

UNIT 4.2: 테마 동향 + 순환매 감지

질문:     오늘 활성 테마는 무엇이고, 테마 간 순환매가 발생했는가?

방법:
  1. 테마별 등락률 + 거래대금 수집
  2. 전일 대비 거래대금 변화율로 신규 유입/이탈 판정
  3. 순환매 판정:
     - 전일 상위 테마가 오늘 하위 + 전일 하위가 오늘 상위 -> rotation
     - 동일 테마 연속 상위 -> continuation
     - 전체 하락 -> broad_decline

도구:
  - collect_sector_series.py (테마 RS/거래대금)
  - _fetch_naver_themes.py (네이버 테마 등락)

성공조건:
  - 활성 테마 3~5개 + 등락률/거래대금
  - 순환매 판정 enum (rotation/continuation/broad_decline)

실패행동:
  - 테마 데이터 미수집 -> 업종 등락으로 대체

출력 포맷:
  theme_dynamics:
    active_themes: [{name, change_pct, volume_change_pct, rank_vs_yesterday}]
    rotation_type: "rotation|continuation|broad_decline"
    new_entry: [{theme, trigger}]  # 신규 유입 테마
    exhausting: [{theme, signal}]  # 소진 조짐 테마

후속 의존: UNIT 5.1 (보유종목의 테마 위치), UNIT 7.1 (내일 준비)

UNIT 4.3: 수급 개요 — 외인/기관/프로그램 방향

질문:     오늘 외인/기관/프로그램의 시장 전체 방향은?

방법:
  1. KOSPI/KOSDAQ 외인/기관 순매매 수집
  2. 프로그램 매매 (차익/비차익) 수집
  3. 선물 포지션 변화 (가능 시)
  4. 시장 수급 방향:
     - 외인+기관 동조 매수 -> institutional_buying
     - 외인+기관 동조 매도 -> institutional_selling
     - 외인 매수 + 기관 매도 (또는 역) -> divergent
     - 프로그램 비차익 대규모 -> arbitrage_driven

도구:
  - collect_macro_series.py (외인/기관 시장 순매매)
  - collect_stock_flow_series.py (프로그램)

성공조건:
  - 외인/기관 순매매 수치(억원) 기재
  - 프로그램 차익/비차익 수치 기재
  - 시장 수급 방향 enum 기재

실패행동:
  - 프로그램 미수집 -> 외인/기관만으로 판정

출력 포맷:
  market_flow:
    foreign: {net_buy_krw: ..., direction: "buy|sell"}
    institution: {net_buy_krw: ..., direction: "buy|sell"}
    program: {arbitrage: ..., non_arbitrage: ..., total: ...}
    market_direction: "institutional_buying|institutional_selling|divergent|arbitrage_driven"

후속 의존: UNIT 5.2 (보유종목 수급과 비교)

섹션 5. 보유종목 심층 분석 — "내 포지션은 안전한가?"


UNIT 5.1: 보유종목 당일 성과 + 테마 위치

질문:     보유종목이 오늘 어떤 성과를 냈고, 속한 테마 내에서 어디에 위치하는가?

방법:
  1. 보유종목 리스트 로딩 (daily_view.json 또는 PM 제공)
  2. 각 종목 당일 등락률 + 거래대금
  3. 해당 테마 내 등락률 순위 -> leader 유지 여부
  4. 테마 자체의 당일 성과와 교차:
     - 테마 상승 + 종목 상승 -> aligned
     - 테마 상승 + 종목 하락 -> underperforming (경고)
     - 테마 하락 + 종목 상승 -> outperforming (강함)
     - 테마 하락 + 종목 하락 -> aligned_down

도구:
  - daily_view.json (보유 리스트)
  - collect_stock_flow_series.py --codes {보유종목} --days 1
  - UNIT 4.2 출력 (테마 등락)

성공조건:
  - 보유종목 각각 당일 등락률 + 테마 내 순위
  - 테마 대비 위치 enum (aligned/underperforming/outperforming/aligned_down)

실패행동:
  - 보유종목 리스트 없음 -> PM에게 요청

출력 포맷:
  holdings_performance:
    - code: "..."
      name: "..."
      daily_return: ...
      theme: "..."
      theme_rank: "1/15"
      vs_theme: "aligned|underperforming|outperforming|aligned_down"

후속 의존: UNIT 5.2, 5.3, 5.4, 5.5

UNIT 5.2: 보유종목 수급 심층 (SEN-1 full)

질문:     보유종목의 수급 패턴이 계속 보유를 뒷받침하는가?

방법:  UNIT 3.4와 동일 (SEN-1 full 적용). 단, 20일 시계열로 확장.
  추가 판정:
  - 매수 시점 이후 수급 방향이 바뀌었는가?
  - distribution 패턴 전환 시 -> EXIT_WARNING

도구: collect_stock_flow_series.py --codes {코드} --days 20

성공조건: UNIT 3.4와 동일 + 매수 시점 이후 방향 변화 판정

실패행동: UNIT 3.4와 동일

출력 포맷: UNIT 3.4와 동일 + direction_change: "maintained|weakening|reversing"

후속 의존: UNIT 5.5 (보유 판정)

UNIT 5.3: 보유종목 추세 심층 (C10 full)

질문:     보유종목의 차트 구조가 여전히 유효한가? SL은 지켜지고 있는가?

방법:  UNIT 3.5와 동일 (C10 full 적용).
  추가 판정:
  - 매수 시점의 SL이 당일 종가 기준으로 여전히 유효한가?
  - SL 접근 중이면 -> SL_APPROACHING 경고
  - 불균형 진단 full (Q1~Q4) 수행

도구: mtf_chart_profiler.py

성공조건: UNIT 3.5와 동일 + SL 유효성 판정 + 불균형 Q1~Q4 답변

실패행동: UNIT 3.5와 동일

출력 포맷: UNIT 3.5와 동일 + sl_status: "safe|approaching|breached" + imbalance_q1_q4: {...}

후속 의존: UNIT 5.5 (보유 판정)

UNIT 5.4: 보유종목 재료 상태 확인

질문:     보유종목의 매수 근거였던 재료가 여전히 살아 있는가?

방법:
  1. 매수 시점의 근거 재료 확인 (매매 기록 또는 PM 제공)
  2. 재료 현재 상태:
     - alive: 재료가 여전히 진행 중 (추가 뉴스/발표 예정)
     - fading: 재료 빈도 감소 (최근 3일 관련 뉴스 0건)
     - exhausted: 재료 소진 (이벤트 종료, 반영 완료)
     - superseded: 새 재료로 교체 (테마는 같지만 동인 변경)
  3. ISSUE_LOG에서 해당 재료의 stage 확인

도구:
  - docs/trading_playbook/ISSUE_LOG.md (Grep)
  - WebSearch "재료 키워드" (최근 3일 뉴스 빈도)

성공조건:
  - 각 보유종목의 원래 재료 + 현재 상태 enum
  - fading/exhausted면 "재료 소진 경고" 명시

실패행동:
  - 원래 재료 불명 -> PM에게 확인 요청

출력 포맷:
  material_status:
    - code: "..."
      original_material: "..."
      current_status: "alive|fading|exhausted|superseded"
      evidence: "최근 3일 관련 뉴스 2건 확인"
      new_material: "..." (superseded 시)

후속 의존: UNIT 5.5 (보유 판정)

UNIT 5.5: 보유 판정 — HOLD/REDUCE/EXIT

질문:     4축(수급+추세+재료+테마위치) 교차 결과, 각 보유종목을 어떻게 할 것인가?

방법:
  1. 4축 교차 테이블:
     | 축 | HOLD 조건 | REDUCE 조건 | EXIT 조건 |
     | 수급(5.2) | 방향 유지 | weakening | reversing + distribution |
     | 추세(5.3) | intact + SL safe | hl_break 또는 SL approaching | SL breached 또는 hh_hl_break |
     | 재료(5.4) | alive | fading | exhausted |
     | 테마위치(5.1) | aligned/outperforming | aligned_down | underperforming |

  2. 판정:
     - 4축 모두 HOLD -> HOLD (유지)
     - REDUCE 1~2개 -> REDUCE (일부 매도 고려)
     - EXIT 1개+ -> EXIT (전량 매도 고려)
     - 추세 EXIT(SL breached)는 절대 EXIT

  3. 각 판정에 다음날 행동 부기

도구: UNIT 5.1~5.4 출력 종합

성공조건:
  - 4축 교차 테이블 기재
  - HOLD/REDUCE/EXIT 판정 + 내일 행동 1줄

실패행동:
  - 축 미확인 -> 해당 축 "U", 나머지로 판정 (U 2개+면 최대 HOLD+관찰)

출력 포맷:
  holding_verdict:
    - code: "..."
      name: "..."
      axes:
        flow: "HOLD|REDUCE|EXIT"
        trend: "HOLD|REDUCE|EXIT"
        material: "HOLD|REDUCE|EXIT"
        theme_position: "HOLD|REDUCE|EXIT"
      verdict: "HOLD|REDUCE|EXIT"
      action: "내일 시가에 50% 감량" (REDUCE 시)

섹션 6. 매매 복기 — "오늘 매매에서 무엇을 배웠는가?"


UNIT 6.1: 매매 기록

질문:     오늘 실행한 매매의 사실 기록은?

방법:
  - 매수/매도 각각: 종목, 시각, 가격, 수량, 사유
  - 미체결 주문 포함
  - 매매 없으면 "당일 매매 없음" 기록

도구: PM 제공 (매매 기록)

성공조건: 매매 건별 5개 필드(종목/시각/가격/수량/사유) 기재

실패행동: PM 미제공 -> "매매 기록 미제공 — 복기 스킵" 명시

출력 포맷:
  trades:
    - type: "buy|sell"
      code: "..."
      name: "..."
      time: "HH:MM"
      price: ...
      quantity: ...
      reason: "..."

UNIT 6.2: 판단 vs 결과 대조

질문:     매수/매도 시점의 판단 근거가 실제 결과와 일치했는가?

방법:
  각 매매에 대해:
  1. 매매 시점의 판단 근거 (어떤 재료/차트/수급으로 진입/이탈)
  2. 실제 결과 (종가 기준 수익/손실)
  3. 대조:
     - correct: 판단 근거가 실제로 작동
     - wrong_reason_right_result: 엉뚱한 이유로 수익
     - right_reason_wrong_result: 맞는 판단이었으나 외부 변수로 손실
     - wrong: 판단 오류

도구: UNIT 6.1 출력 + 당일 차트 데이터

성공조건: 매매건별 대조 결과 enum + 교훈 1줄

실패행동: 근거 불명 -> "판단 근거 미기록 — 대조 불가" 명시

출력 포맷:
  trade_review:
    - trade_id: 1
      basis: "..."
      result: {pnl_pct: ..., pnl_krw: ...}
      alignment: "correct|wrong_reason|right_reason|wrong"
      lesson: "..."

UNIT 6.3: 시스템 피드백

질문:     매매 결과에서 시스템(ISSUE_LOG/POLICY_TRACKER/EVENT_CALENDAR)에 업데이트할 것이 있는가?

방법:
  1. ISSUE_LOG: 재료 stage 변경 필요? (예: ACTIVE -> FADING)
  2. POLICY_TRACKER: 정책 stage 변경 필요?
  3. EVENT_CALENDAR: 새 이벤트 추가?
  4. 매매 규칙: 오늘 위반한 규칙 또는 추가할 규칙?

도구: docs/trading_playbook/ 관련 파일

성공조건: 업데이트 항목 0개+면 "업데이트 없음", 있으면 구체적 변경 사항

실패행동: 없음

출력 포맷:
  system_feedback:
    issue_log_updates: [{id, change}]
    policy_tracker_updates: [{id, change}]
    event_calendar_adds: [{date, event}]
    rule_notes: ["..."]

섹션 7. 내일 준비


UNIT 7.1: 내일 시나리오 + 감시 포인트

질문:     내일 시장에서 주시할 포인트와 예상 시나리오는?

방법:
  1. UNIT 4.1~4.3 (오늘 시장) + UNIT 5.5 (보유 판정) 종합
  2. 내일 예정 이벤트 확인 (EVENT_CALENDAR)
  3. 시나리오 3개:
     - Base: 가장 가능성 높은 전개
     - Bull: 상방 서프라이즈
     - Bear: 하방 리스크
  4. 감시 포인트: "이것이 발생하면 행동을 바꾼다"

도구:
  - docs/trading_playbook/EVENT_CALENDAR.md
  - UNIT 4, 5 출력 종합

성공조건:
  - 3 시나리오 각 1~2줄
  - 감시 포인트 2~3개
  - 각 감시 포인트에 "발생 시 행동" 명시

실패행동: 없음

출력 포맷:
  tomorrow:
    scenarios:
      base: "..."
      bull: "..."
      bear: "..."
    watch_points:
      - trigger: "..."
        action: "..."

---

MORNING_OPEN (06:00~08:50)

핵심 목적: 밤새 변화 반영 + EVENING 분석 업데이트 + 오늘 실행 계획 + daily_view 생성 저장: docs/morning_open/YYYYMMDD_morning_open.md + data/daily_view/YYYYMMDD.json

흐름: UNIT 8.1~8.3 (밤새 변화) -> UNIT 9.1~9.2 (실행 계획) -> UNIT 10.1 (daily_view 생성)


섹션 8. 밤새 변화 — "EVENING 분석 이후 뭐가 바뀌었나?"


UNIT 8.1: 오버나이트 글로벌 변화

질문:     EVENING 분석(~06:00) 이후 글로벌 시장에서 추가 변화가 있었는가?

방법:
  1. 미장 최종 마감 vs EVENING 시점 차이 확인
     - EVENING이 미장 마감 전이었으면 -> 마감 결과로 업데이트
     - EVENING이 미장 마감 후였으면 -> 시간외/프리마켓 변화만
  2. 아시아 시장 개장 상황:
     - 일본(닛케이225 선물), 중국(CSI300 선물/항셍 선물)
  3. EVENING UNIT 1.8 verdict 변경 필요 여부:
     - 변경 필요 -> 수정된 verdict + 근거
     - 변경 불필요 -> "EVENING 판단 유지"

도구:
  - fetch_global_assets.py (최신 데이터)
  - WebSearch "US market close", "Nikkei futures"

성공조건:
  - EVENING 대비 변화 유무 명시
  - verdict 변경 여부 + 근거

실패행동:
  - 데이터 미수집 -> "오버나이트 미확인 — EVENING 판단 유지" 명시

출력 포맷:
  overnight_update:
    us_final_vs_evening: {changed: true|false, detail: "..."}
    asia_open: {nikkei: ..., hsi: ..., direction: "..."}
    evening_verdict_change: {changed: true|false, new_verdict: "...", reason: "..."}

후속 의존: UNIT 9.1 (실행 계획)

UNIT 8.2: 밤새 뉴스/재료 추가 확인

질문:     EVENING 이후 새로운 뉴스/재료가 나왔는가?

방법:
  1. 텔레그램 채널 확인 (06:00~현재)
  2. 주요 뉴스 사이트 WebSearch
  3. 새 재료 발견 시 -> UNIT 2.2 구조성 검증 간이 적용 (Q1~Q4 빠른 판정)
  4. EVENING 후보(UNIT 3.8) 영향 여부 판정:
     - 후보 강화 (추가 재료) -> reinforce
     - 후보 약화 (반대 재료) -> weaken
     - 무관 -> neutral

도구:
  - data/telegram/daily/YYYYMMDD.json (최신)
  - WebSearch "한국 증시 뉴스 오늘"

성공조건:
  - 새 재료 유무 명시
  - 있으면 간이 구조성 판정 + EVENING 후보 영향

실패행동: 텔레그램 미수집 -> WebSearch만으로 진행

출력 포맷:
  overnight_materials:
    new_materials: [{headline, category, quick_grade, candidate_impact: "reinforce|weaken|neutral"}]
    evening_candidates_affected: true|false

후속 의존: UNIT 9.1 (실행 계획)

UNIT 8.3: 전일 미장 수급 → 오늘 외인 방향 추론

질문:     전일 미장 마감과 환율로부터 오늘 외인 방향을 추론할 수 있는가?

방법:
  1. USD/KRW 야간 변화 (NDF 또는 서울 환시장 개장가)
  2. 전일 외인 KOSPI/KOSDAQ 순매매 + 선물 포지션
  3. 추론:
     - 달러 약세 + 전일 외인 매수 -> 외인 매수 지속 가능성
     - 달러 강세 + 전일 외인 매도 -> 외인 매도 지속 가능성
     - 괴리 -> 한국 고유 요인 가능성

도구:
  - fetch_global_assets.py (USD/KRW)
  - collect_macro_series.py (외인 선물)
  - 전일 POST_MARKET UNIT 4.3 출력 참조

성공조건:
  - USD/KRW 최신 + 전일 외인 수급
  - 오늘 외인 방향 추론 1줄

실패행동: NDF 미수집 -> 전일 환율만으로 판정

출력 포맷:
  foreign_direction_estimate:
    usd_krw_overnight: {value: ..., change: ...}
    yesterday_foreign: {kospi: ..., futures: ...}
    today_estimate: "buy_continuation|sell_continuation|uncertain"
    rationale: "..."

후속 의존: UNIT 9.1 (실행 계획)

섹션 9. 실행 계획 — "오늘 뭘 할 것인가?"


UNIT 9.1: 오늘 실행 계획

질문:     EVENING 후보 + 밤새 변화 + 보유종목 상태를 종합할 때, 오늘 뭘 할 것인가?

방법:
  1. EVENING STRONG_BUY/BUY 후보 재확인:
     - 밤새 변화로 무효화됐는가? (UNIT 8.2)
     - 유효하면 -> 진입 조건(가격대/SL) 재확인
  2. 보유종목 행동 재확인:
     - POST_MARKET UNIT 5.5 판정 유효?
     - REDUCE/EXIT 종목은 시가/장중 어디서?
  3. 오늘 행동 리스트 (우선순위순):
     - EXIT > REDUCE > 신규 BUY > HOLD 순
  4. 자금 배분:
     - 현금 비중 확인
     - 신규 매수 시 최대 투입 비율

도구:
  - EVENING UNIT 3.8 출력
  - POST_MARKET UNIT 5.5 출력
  - UNIT 8.1~8.3 출력
  - daily_view.json (보유 리스트 + 현금)

성공조건:
  - 오늘 행동 리스트 (종목별 행동 + 조건 + 가격대)
  - 자금 배분 명시

실패행동: EVENING/POST_MARKET 출력 없음 -> "전일 분석 없음 — 관망 권고"

출력 포맷:
  execution_plan:
    actions:
      - priority: 1
        type: "EXIT"
        code: "..."
        condition: "시가에 전량 매도"
      - priority: 2
        type: "BUY"
        code: "..."
        condition: "3,500원 이하 진입, SL 3,200원"
    cash_ratio: "40%"
    max_new_position: "전체 자금의 10%"

후속 의존: UNIT 10.1 (daily_view)

UNIT 9.2: 시나리오별 행동 분기

질문:     시가 이후 전개에 따라 행동을 어떻게 바꾸는가?

방법:
  3개 시나리오 (POST_MARKET UNIT 7.1 기반):
  - Base: 예상대로 -> 계획대로 실행
  - Bull: 갭업 2%+ -> 추격 금지, 눌림목 대기
  - Bear: 갭다운 2%+ -> 신규 매수 보류, 보유종목 SL 확인

  각 시나리오에 구체적 행동 1~2개

도구: UNIT 9.1 + POST_MARKET UNIT 7.1

성공조건: 3 시나리오 각각 행동 명시

실패행동: POST_MARKET 시나리오 없음 -> EVENING 환경 판단 기반으로 작성

출력 포맷:
  scenario_actions:
    base: {condition: "...", actions: ["..."]}
    bull: {condition: "갭업 2%+", actions: ["추격 금지", "눌림목 대기"]}
    bear: {condition: "갭다운 2%+", actions: ["신규 매수 보류", "보유 SL 확인"]}

섹션 10. daily_view 생성


UNIT 10.1: daily_view.json 생성

질문:     오늘의 daily_view(보유+관심+환경)를 JSON으로 생성

방법:
  daily_view 구조:
  - holdings: 보유종목 리스트 + 각 판정(HOLD/REDUCE/EXIT)
  - watchlist: EVENING 후보 리스트 + 각 판정(STRONG_BUY/BUY/WATCH)
  - environment: 시장환경 verdict + 전략
  - execution: 오늘 행동 리스트

도구: UNIT 9.1 + 9.2 출력

성공조건: daily_view.json 파일 생성 + 구조 검증

실패행동: 필수 필드 누락 -> 빈값으로 생성 + 경고 기재

출력 포맷:
  daily_view.json:
    date: "2026-05-13"
    environment: {verdict, strategy}
    holdings: [{code, name, verdict, action}]
    watchlist: [{code, name, theme, verdict, entry_condition}]
    execution: [{priority, type, code, condition}]
    scenarios: {base, bull, bear}

---

MID_MORNING (09:30~10:30)

핵심 목적: 시초가 실제 vs 아침 예측 대조 + 진입/이탈 판단 실행 저장: 대화 출력 (별도 파일 불필요)

흐름: UNIT 11.1 (시초가 대조) -> UNIT 11.2 (실행 판단) -> UNIT 11.3 (포지션 업데이트)


UNIT 11.1: 시초가 vs 예측 대조

질문:     시초가 전개가 MORNING_OPEN의 어떤 시나리오에 해당하는가?

방법:
  1. KOSPI/KOSDAQ 시가 + 30분 등락률 확인
  2. UNIT 9.2 시나리오 매칭:
     - Base/Bull/Bear 중 어느 시나리오와 일치?
  3. 보유종목 시가 확인:
     - 갭업/갭다운/보합 판정
     - SL 이탈 여부 즉시 확인

도구:
  - collect_stock_flow_series.py --codes {보유+관심} --days 1 (실시간)
  - fetch_market_top.py (시장 상위)

성공조건:
  - 시나리오 매칭 결과 1줄
  - 보유종목 시가 + SL 상태

실패행동: 실시간 데이터 미수집 -> PM에게 구두 확인 요청

출력 포맷:
  opening_check:
    market: {kospi_open_gap_pct: ..., scenario_match: "base|bull|bear"}
    holdings: [{code, open_price, sl_status: "safe|breached", gap_pct}]
    watchlist: [{code, open_price, entry_condition_met: true|false}]

UNIT 11.2: 진입/이탈 실행 판단

질문:     시초가 기반으로 지금 실행할 매매가 있는가?

방법:
  1. EXIT 대상: SL breached -> 즉시 매도 지시
  2. REDUCE 대상: 계획대로 실행 여부 판정
  3. BUY 대상: 진입 조건 충족 여부 확인
     - 조건 충족 -> 매수 지시 (가격/수량 명시)
     - 조건 미충족 -> 대기 (어떤 가격이면 진입)
  4. 추격 금지 규칙:
     - 갭업 5%+ 종목은 신규 진입 금지
     - 관심종목이 시가에 SL 이하면 -> 해당 종목 PASS

도구: UNIT 11.1 출력

성공조건:
  - 실행 지시 리스트 (매수/매도/대기 각각)
  - 각 지시에 가격/수량/조건

실패행동: 판단 불가 -> "30분 추가 관찰 후 재판단" 명시

출력 포맷:
  execution_decisions:
    immediate: [{type: "sell", code: ..., reason: "SL breached", price: "시장가"}]
    conditional: [{type: "buy", code: ..., condition: "3,500 이하 진입", quantity: ...}]
    wait: [{code: ..., reason: "갭업 과대 — 눌림목 대기"}]

UNIT 11.3: 포지션 업데이트

질문:     매매 실행 후 포지션 상태를 업데이트

방법:
  - 실행된 매매 반영하여 daily_view 업데이트
  - 현금 비중 재계산
  - 남은 매매 계획 리스트

도구: daily_view.json 업데이트

성공조건: daily_view.json 갱신 + 현금 비중 기재

실패행동: 없음

출력 포맷:
  position_update:
    executed: [{type, code, price, quantity}]
    remaining_plan: [...]
    cash_ratio: "..."

---

AFTERNOON (10:30~15:20)

핵심 목적: 오전->오후 흐름 변화 감지 + 포지션 관리 + 장마감 준비 저장: 대화 출력 (별도 파일 불필요)

흐름: UNIT 12.1 (흐름 변화) -> UNIT 12.2 (포지션 재검토) -> UNIT 12.3 (장마감 준비)


UNIT 12.1: 오전->오후 흐름 변화 감지

질문:     오전과 오후의 시장 흐름이 바뀌었는가?

방법:
  1. KOSPI 오전 등락 vs 현재 등락 비교
     - 양전 -> 음전 (또는 역) = reversal
     - 동일 방향 유지 = continuation
     - 방향 약화 = fading
  2. 거래대금 변화:
     - 오전 대비 오후 거래대금 증가 -> 참여 확대
     - 오전 대비 감소 -> 관망 증가
  3. 프로그램 매매 방향 변화 (차익/비차익)
  4. 테마 순위 변화: 오전 주도 테마가 오후에도 유지?

도구:
  - fetch_market_top.py (현재 시점)
  - collect_macro_series.py (장중 프로그램)

성공조건:
  - 흐름 변화 enum (reversal/continuation/fading)
  - 거래대금 변화 방향
  - 테마 순위 변화 유무

실패행동: 장중 데이터 미수집 -> PM 구두 확인

출력 포맷:
  afternoon_flow:
    market_shift: "reversal|continuation|fading"
    volume_change: "increasing|decreasing|stable"
    program_shift: "..."
    theme_change: "same|rotated|collapsed"

UNIT 12.2: 보유종목 장중 재검토

질문:     보유종목이 오후에도 계획대로 움직이고 있는가?

방법:
  1. 각 보유종목 현재가 확인
  2. SL 접근/이탈 여부
  3. 장중 수급 변화 (외인/기관 누적)
  4. 판정:
     - on_track: 계획대로 진행
     - alert: SL 접근 또는 수급 반전
     - action_needed: SL 이탈 또는 급변

도구:
  - collect_stock_flow_series.py --codes {보유} --days 1

성공조건:
  - 보유종목별 현재 상태 + 판정

실패행동: 데이터 미수집 -> PM에게 현재가 확인 요청

출력 포맷:
  holdings_intraday:
    - code: "..."
      current_price: ...
      vs_sl: "safe|approaching|breached"
      intraday_flow: "buying|selling|mixed"
      status: "on_track|alert|action_needed"
      action: "..." (action_needed 시)

UNIT 12.3: 장마감 준비

질문:     장마감 전에 실행할 것이 있는가?

방법:
  1. 미체결 주문 확인 -> 유지/취소 판정
  2. 오늘 진입 못한 관심종목 -> 내일로 이월 또는 취소
  3. 동시호가(14:50~15:20) 행동:
     - 매도 필요 종목 -> 동시호가 매도 지시
     - 매수 기회 종목 -> 동시호가 진입 여부
  4. POST_MARKET 준비사항 메모

도구: daily_view.json 참조

성공조건:
  - 장마감 전 행동 리스트 (0개 가능)
  - 미체결 주문 처리 방향

실패행동: 없음

출력 포맷:
  closing_prep:
    pending_orders: [{code, action: "maintain|cancel"}]
    closing_auction: [{code, type: "sell|buy", reason: "..."}]
    carryover_to_tomorrow: [{code, reason}]
    postmarket_notes: ["..."]

---

부록: 시간대 간 데이터 흐름도

EVENING (20:00~06:00)
  UNIT 1.1~1.8 -> market_environment (verdict)
  UNIT 2.1~2.4 -> material_validation (structural materials)
  UNIT 3.1~3.8 -> final_candidates (STRONG_BUY/BUY/WATCH)
       |
       v
MORNING_OPEN (06:00~08:50)
  UNIT 8.1~8.3 -> overnight_update (EVENING 수정 여부)
  UNIT 9.1~9.2 -> execution_plan (오늘 행동 리스트)
  UNIT 10.1    -> daily_view.json
       |
       v
MID_MORNING (09:30~10:30)
  UNIT 11.1~11.3 -> opening_check + execution_decisions
       |
       v
AFTERNOON (10:30~15:20)
  UNIT 12.1~12.3 -> afternoon_flow + holdings_intraday + closing_prep
       |
       v
POST_MARKET (15:20~20:00)
  UNIT 4.1~4.3 -> market_summary (오늘 정리)
  UNIT 5.1~5.5 -> holding_verdict (HOLD/REDUCE/EXIT)
  UNIT 6.1~6.3 -> trade_review (매매 복기)
  UNIT 7.1     -> tomorrow (내일 시나리오)
       |
       v
EVENING (다음날) ...

부록: UNIT → 에이전트 매핑 참조

UNIT 주요 에이전트 방법론 원본 에이전트
3.3 강도 랭킹 4대 기준 + 패턴 보너스 스코어링 S3 leader-judge
3.4, 5.2 수급 검증 6패턴 분류 + 주체 동조 판정 SEN-1 flow-cumulator
3.5, 5.3 차트 검증 불균형 4묶음(A/B/C/D) + structure_break_stage + chart_snapshot C10 chartist + T2 wave-candle-integrity
3.6 펀더멘탈 검증 Accrual Ratio + AR/Inv 교차 FA-M1 triple-cross
3.7 실체 검증 매출 비중 5등급 분류 S5 revenue-classifier
2.2 구조성 검증 4-Question Binary (구조/실체/정책/시장동의) 신규 (보고서 전용)
1.8 환경 판단 6축 스코어카드 신규 (M1/M8 간소화)

---

선정 검증 시스템 (WEEKLY REVIEW)

핵심 목적: 시스템이 선정한 테마/종목이 실제 시장에서 맞았는지 자동 검증. 시간대별 리포트와 독립. 주말에 1회 실행. 저장: docs/weekly_review/YYYYMMDD_review.md

트리거: 매주 토요일 또는 PM 요청 시


구조

선정 기록(PICK_LOG) → 시장 데이터 자동 수집 → 판정 vs 실제 대조 → 적중/실패 분류 → 패턴 축적

UNIT W.1: 선정 기록 (PICK_LOG)

질문:     이번 주에 시스템이 선정한 테마/종목은 무엇이고, 왜 골랐는가?

방법:
  시스템이 테마/종목을 선정할 때마다 자동 기록:
  - pick_date: 선정일
  - source: 어떤 리포트에서 선정됐는가 (EVENING/POST_MARKET 등)
  - theme: 테마명
  - code/name: 종목코드/종목명
  - verdict: 시스템 판정 (STRONG_BUY/BUY/WATCH)
  - basis: 선정 근거 요약 (어떤 재료 + 어떤 축이 GO였는가)
  - entry_price: 선정 시점 종가 (기준가)
  - sl_price: 제시된 SL

저장: data/pick_log/YYYYMMDD_picks.json (선정 시 자동 append)

성공조건:
  - 선정 건마다 위 8개 필드 기재
  - 선정 0건이면 "이번 주 신규 선정 없음" 기록

실패행동:
  - 자동 기록 누락 -> 주말 리뷰 시 리포트 파일에서 수동 추출

UNIT W.2: 시장 결과 자동 수집

질문:     선정된 종목이 선정일 이후 실제로 어떻게 움직였는가?

방법:
  PICK_LOG의 각 종목에 대해:
  1. 선정일(D) 종가 = 기준가
  2. D+1, D+3, D+5 종가 수집
  3. 수익률 산출: (D+N 종가 - 기준가) / 기준가
  4. SL 이탈 여부: D+1~D+5 기간 중 저가가 SL 이하로 내려간 적 있는가?
  5. 테마 전체 등락: 같은 기간 테마 평균 등락률

도구:
  - collect_stock_flow_series.py --codes {선정종목 전체} --days 5
  - Kiwoom REST get_daily_chart (OHLCV)
  - collect_sector_series.py (테마 등락)

성공조건:
  - 종목별 D+1/D+3/D+5 수익률 수치
  - SL 이탈 여부 (Y/N + 이탈일)
  - 테마 평균 대비 초과수익률

실패행동:
  - 데이터 미수집 -> 수집 가능한 기간까지만 산출, 미수집 명시

UNIT W.3: 판정 vs 실제 대조

질문:     시스템 판정(STRONG_BUY/BUY/WATCH)이 실제 결과와 일치했는가?

방법:
  각 선정 건에 대해 적중/실패 분류:

  적중(HIT) 조건 (하나라도 충족):
    - D+5 수익률 > 0% AND SL 미이탈
    - D+3 수익률 > 3% (단기 모멘텀 확인)

  실패(MISS) 조건:
    - SL 이탈 (D+1~D+5 중 저가 < SL)
    - D+5 수익률 < -3% (SL 이전이라도 큰 하락)

  보류(NEUTRAL):
    - HIT도 MISS도 아닌 경우 (횡보, 소폭 등락)

  판정별 상세:
    - HIT: 어떤 축(강도/수급/추세/펀더/실체)이 맞았는가
    - MISS: 어떤 축이 틀렸는가 (예: 수급 GO였는데 실제론 외인 매도 전환)
    - MISS 원인 분류:
      - timing: 방향은 맞았으나 진입 시점이 빨랐음 (이후 반등)
      - direction: 방향 자체가 틀림
      - external: 외부 변수 (시장 급락, 돌발 뉴스)
      - material_fade: 재료가 예상보다 빨리 소진

도구: UNIT W.2 출력 + PICK_LOG

성공조건:
  - 선정 건별 HIT/MISS/NEUTRAL 판정
  - MISS 건에 원인 분류 1개 + 틀린 축 명시
  - 주간 적중률: HIT / (HIT + MISS) 산출

실패행동: 없음 (대조 자체는 항상 가능)

출력 포맷:
  weekly_scorecard:
    period: "2026-05-08 ~ 2026-05-12"
    picks_total: N
    results:
      - pick_date: "2026-05-08"
        code: "006340"
        name: "대원전선"
        theme: "HBM/반도체소재"
        verdict: "STRONG_BUY"
        entry_price: 3500
        d1_return: "+1.2%"
        d3_return: "+4.5%"
        d5_return: "+3.8%"
        sl_breached: false
        result: "HIT"
        hit_reason: "수급 dual_buy 지속, 추세 intact 유지"
      - pick_date: "2026-05-09"
        code: "..."
        result: "MISS"
        miss_cause: "material_fade"
        miss_axis: "실체 — 테마 매출 비중 과대 추정"
      - ...
    hit_rate: "66% (4/6)"
    miss_pattern: "material_fade 2건으로 최다"

UNIT W.4: 패턴 축적 + 시스템 보정 제안

질문:     최근 4주간 MISS 패턴에서 시스템이 반복하는 실수가 있는가?

방법:
  1. 최근 4주 MISS 건 수집
  2. 원인별 빈도:
     - timing: N건
     - direction: N건
     - external: N건
     - material_fade: N건
  3. 틀린 축별 빈도:
     - 강도 과대평가: N건
     - 수급 오판: N건
     - 추세 과신: N건
     - 펀더 무시: N건
     - 실체 과대: N건
  4. 반복 패턴 감지:
     - 같은 원인이 3건+ -> "시스템 편향 경고" + 보정 제안
     - 예: material_fade 3건+ -> "재료 구조성 검증(UNIT 2.2) 기준 강화 필요"
     - 예: 수급 오판 3건+ -> "수급 판정 기간을 5d -> 10d로 확장 검토"

도구:
  - data/pick_log/ 최근 4주 파일 (Read)
  - 이전 weekly_review 파일 (Read)

성공조건:
  - 원인별/축별 빈도 테이블
  - 반복 패턴 있으면 보정 제안 1~2개
  - 반복 패턴 없으면 "반복 편향 미감지"

실패행동: 4주 미만 데이터 -> 있는 만큼만 분석, "데이터 부족" 명시

출력 포맷:
  system_bias_check:
    period: "최근 4주"
    total_picks: N
    total_hits: N
    total_misses: N
    hit_rate_4w: "X%"
    miss_by_cause: {timing: N, direction: N, external: N, material_fade: N}
    miss_by_axis: {strength: N, flow: N, trend: N, fundamental: N, substance: N}
    recurring_bias: "material_fade (3건) — 재료 소진 속도 과소평가"
    correction_suggestion: "UNIT 2.2 Q1 판정 시 '재료 연령' 추가 확인 (발생 후 5일+ 경과 시 감점)"

주간 리뷰 출력 포맷 (리포트)

# 주간 선정 검증 리뷰 — {기간}

## 이번 주 선정 결과
| 선정일 | 종목 | 테마 | 판정 | D+1 | D+3 | D+5 | SL이탈 | 결과 |
| 5/8 | 대원전선 | HBM | STRONG_BUY | +1.2% | +4.5% | +3.8% | N | HIT |
| 5/9 | ... | ... | BUY | -0.5% | -2.1% | -4.2% | Y(5/11) | MISS |

**적중률: {X}% ({N}/{M})**

## MISS 분석
| 종목 | 원인 | 틀린 축 | 상세 |
| ... | material_fade | 실체 | 테마 매출 비중 과대 추정 |

## 4주 누적 패턴
| 원인 | 빈도 | 추세 |
| timing | 2 | - |
| material_fade | 4 | 증가 중 |

## 시스템 보정 제안
- {제안 1}
- {제안 2}