S334 — chart-judge 입력 패키지 재설계 명세 (PM 진단 종합)¶
작성: 2026-05-31 (S334) 배경: S334 v13a~p 검증 결과 + PM 진단 누적. 가격/거래량 지표가 "통계적 alpha 없음"으로 나온 진짜 원인 = 지표가 나쁜 게 아니라 입력 방식이 틀림. PM이 단계적으로 지적한 결함을 종합.
PM 진단 누적 (검증 과정에서 도출)¶
| # | PM 지적 | 함의 |
|---|---|---|
| 1 | "1년 뒤 올랐나 무의미, 내일·모레·5일·10일 단기 궤적을 가까이서" | 고정 시점→결과 비교 폐기 |
| 2 | "어제 위험이라도 다음날 매수세 유입되면 방향 바뀜" | 신호는 매일 갱신, 고정 라벨 금지 |
| 3 | "뭐가 핵심인지 고정 마라, 거래대금유입+다른 지표 같이" | 단일 지표 아닌 조합, 가변 가중 |
| 4 | "고정값 비교 무의미, 1.0→1.2 숫자만 보지 말고 맥락" | 절대 스냅샷 금지 |
| 5 | "RS·거래대금으로 층화, 케이스 스터디→확장" | 모집단 분리 후 상대 비교 |
| 6 | "10억 vs 1조, 1천원 vs 100만원 같은 잣대로 비교 X" | 규모/가격 정규화 필수 |
| 7 | "종목을 지속 추적, 상승→힘빠짐→재상승/하락 국면 연쇄" | 국면 전이 추적 |
| 8 | "모든 시나리오를 if-then 코드로 못 짠다 → 에이전트가 판단" | 코드=재료 패키징, 에이전트=해석 |
| 9 | "에너지(상승률×거래대금)를 묶어서, 특별함(평소 대비)을 같이" | 결합 + 상대적 특별함 |
| 10 | "연결된 데이터를 분절시키면 무슨 일인지 알 수 없다" | 분절 금지, 연결 보존 |
핵심 결론¶
현재 D2Input 결함 = (a) 모든 필드가 T0 단일 스냅샷 (b) 절대값 (c) 분절됨. 에이전트(chart-judge)는 "오늘 사진 한 장"만 받아서, PM이 말한 연속 추적/에너지/특별함을 읽을 재료가 없다.
→ 코드는 "더 똑똑한 판단"을 하면 안 된다(PM #8). 코드가 할 일은 수치의 변화·에너지·특별함을 분절 없이 묶어서 패키징하는 것. 판단은 에이전트가 한다.
재설계: D2Input에 추가할 3종 재료¶
A. 시계열 변화 (스냅샷 → 궤적)¶
현재: cvd_slope_z = -0.5 (오늘만)
재설계: 각 핵심 지표의 최근 N일 궤적 + 변화 방향
trajectory:
cvd_slope_z_5d: [-1.7, -1.1, -0.8, -0.5, -0.3] # 어제→오늘, 회복중인지 악화중인지
ma_slope_z_5d: [...]
amount_z_5d: [...]
range_pos_5d: [...]
# 에이전트가 "cvd가 -1.7에서 -0.3으로 5일간 회복 = 매수세 돌아옴" 읽을 수 있게
B. 에너지 결합 (분절 → 묶음) ★ PM #9 핵심¶
현재: 상승률 따로, 거래대금 따로 재설계: 상승률과 거래대금을 한 묶음으로 + 효율
energy:
# 최근 N일 각각: (그날 상승률, 그날 거래대금, 효율=상승률/거래대금정규화)
daily: [
{ret: +10.2, amount_억: 200, amount_z: +3.1, efficiency: high}, # 적은돈 많이오름=매물고갈
{ret: +2.1, amount_억: 1800, amount_z: +5.2, efficiency: low}, # 많은돈 조금=저항
]
# 누적: "5일간 +35% 오르는데 거래대금 평소의 3배" 같은 묶음 서술
cum_5d: {ret: +35, amount_vs_normal: 3.2x, price_move_per_amount: ...}
C. 특별함/상대성 (절대값 → 평소 대비) ★ PM #9 핵심¶
현재: amount = 200억 (그래서 특별한가?)
재설계: 이 종목의 평소 대비 얼마나 특별한가 (percentile/배수)
exceptionality:
amount_vs_self_60d: 3.2x # 거래대금이 이 종목 60일 평균의 3.2배 = 폭증
amount_pctile_252d: 0.98 # 1년 중 상위 2% = 매우 특별
ret_vs_self_atr: 4.1 # 오늘 변동이 이 종목 평소 변동성의 4.1배 = 큰 일
price_level_pctile_252d: 1.00 # 52주 신고가 = 가본 적 없는 자리
price_level_pctile_5y: 0.85 # 5년으로 보면 0.85 (과거 더 높았음)
# → "거래대금 1년 상위 2% 폭증 + 52주 신고가 = 뭔가 다른 일"
설계 원칙 (PM #8, #10 준수)¶
- 코드는 판단 안 함 — 위 3종은 전부 "사실 묶음"이지 "좋다/나쁘다"가 아님. verdict는 에이전트.
- 분절 금지 — 상승률/거래대금/가격레벨을 따로 주지 말고 한 묶음(energy)으로.
- 상대성 필수 — 모든 절대값에 "이 종목 평소 대비" + "전체 단면 대비" 동반.
- 변화 보존 — 스냅샷이 아니라 N일 궤적으로, 어제→오늘 방향이 보이게.
검증 방법 (재설계 후)¶
기존처럼 코드로 AUC 재는 게 아님(PM #8: 판단은 에이전트). 대신: 1. 재설계된 패키지를 실제 chart-judge 에이전트에 입력 2. 에이전트가 v13p 케이스(미래에셋 재도전, 삼천당 쌍봉붕괴)를 연속 추적 서사로 읽어내는가 3. "어제 위험했지만 오늘 자금 재유입 → 시장이 저가매수로 해석 중" 같은 PM식 판단이 나오는가 4. 같은 종목 며칠 연속 호출 시 시나리오가 갱신되는가 (고정 안 되는가)
성공 = 에이전트가 PM처럼 읽고 시나리오를 갱신. 통계 alpha가 아니라 해석 능력이 기준.
다음 작업 (S335 후보)¶
scripts/discover/indicators/chart_indicators.py에 trajectory/energy/exceptionality 산출 함수 추가scripts/discover/schemas.pyD2Input에 3종 블록 추가build_d2_input.py에 결합chart-judge.md입력 섹션 + reasoning 가이드 갱신 (에너지·특별함·궤적 인용 의무화)- 케이스 종목으로 에이전트 실호출 검증