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