콘텐츠로 이동

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 준수)

  1. 코드는 판단 안 함 — 위 3종은 전부 "사실 묶음"이지 "좋다/나쁘다"가 아님. verdict는 에이전트.
  2. 분절 금지 — 상승률/거래대금/가격레벨을 따로 주지 말고 한 묶음(energy)으로.
  3. 상대성 필수 — 모든 절대값에 "이 종목 평소 대비" + "전체 단면 대비" 동반.
  4. 변화 보존 — 스냅샷이 아니라 N일 궤적으로, 어제→오늘 방향이 보이게.

검증 방법 (재설계 후)

기존처럼 코드로 AUC 재는 게 아님(PM #8: 판단은 에이전트). 대신: 1. 재설계된 패키지를 실제 chart-judge 에이전트에 입력 2. 에이전트가 v13p 케이스(미래에셋 재도전, 삼천당 쌍봉붕괴)를 연속 추적 서사로 읽어내는가 3. "어제 위험했지만 오늘 자금 재유입 → 시장이 저가매수로 해석 중" 같은 PM식 판단이 나오는가 4. 같은 종목 며칠 연속 호출 시 시나리오가 갱신되는가 (고정 안 되는가)

성공 = 에이전트가 PM처럼 읽고 시나리오를 갱신. 통계 alpha가 아니라 해석 능력이 기준.


다음 작업 (S335 후보)

  1. scripts/discover/indicators/chart_indicators.py에 trajectory/energy/exceptionality 산출 함수 추가
  2. scripts/discover/schemas.py D2Input에 3종 블록 추가
  3. build_d2_input.py에 결합
  4. chart-judge.md 입력 섹션 + reasoning 가이드 갱신 (에너지·특별함·궤적 인용 의무화)
  5. 케이스 종목으로 에이전트 실호출 검증