콘텐츠로 이동

S337 — 케이스 스터디 → 데이터·질문·원자화 정리

작성: 2026-05-31 (S337) 상태: 📋 정리 — PM 검토용. 코드 보완(B1 등) 전에 "무엇을 줄까/무엇을 물을까/어떻게 원자화할까" 확정. 근거: S337 두 케이스 연속 판단(미래에셋 상승 28일, 삼천당 하락 16일)에서 에이전트가 실제로 사용한 판단 로직을 역추출.


0. 정리 목적 (PM 지침)

"케이스 스터디로 얻은 정보를 바탕으로 에이전트에 어떤 데이터와 질문을 주고 해석을 요청할 것인가, 원자화는 어떻게 할 것인가를 정리하는 게 먼저다."

S336 A1~A8은 사전 설계 질문. S337에서 에이전트가 실전에서 실제로 쓴 판단은 더 풍부하고 일부 다르다. 그 실전 로직을 추출해 데이터/질문/원자화를 재확정한다.


1. 두 케이스에서 에이전트가 실제로 쓴 "판단의 축"

추적 44일(28+16) 호출 전체에서 반복 등장한 판단 요소를 빈도·결정력 순으로:

무엇을 봤나 데이터 결정력
A. 동의받은 가격인가 거래량 동반 + clv 고가사수 + cvd 양전 + late 양전 동시 clv, intraday_cvd, late_session, amt_vs_self ★★★ 진입/거부 게이트
B. 마감 분배 (late 음전) 장중 강세인데 마감 직전 매도 출회 late_session_pct ★★★ 천장·보류 신호
C. 거래량 질 (동반 vs 고갈) 양봉이 거래 동반인가 적은 손인가 amt_vs_self, amount_z ★★★ 데드캣 구분
D. 사건 시퀀스 국면 점화/천장/식음/재점화/붕괴 — 오늘이 어디 exceptional_days 시퀀스 ★★ 맥락
E. 새 사건 발생 감지 "어제 죽었다 오늘 폭증 = 무슨 일" amt_vs_self 급변, ret ★★ 진입 트리거
F. 떨어지는 칼날 / 줍줍 거부 낙폭과대·아래꼬리·Spring을 cvd로 검증 cvd, clv, overhang ★★ 하락장 보호
G. 라벨 불신 (OF로 검증) l2_scenario 켜져도 OF로 재검증 l2_scenario vs cvd/late ★★ 오작동 회피
H. 전일 트리거 대조 어제 내가 건 조건이 충족됐나 (연속 호출 상태) ★★★ 연속성

2. 실전이 드러낸 — A1~A8 대비 차이

S336 A1~A8에 있으나 실전 비중 낮았던 것: - A4(눌림목 next3d_vol_shrink) — 거의 안 씀. 에이전트는 그날그날 cvd/late로 판단, 후속반응은 사후검증용. - A8(재점화 강도 비교) — 시퀀스 서사엔 썼으나 진입 결정은 "오늘 동의 여부"가 좌우.

S336에 없었으나 실전에서 핵심이 된 것: - B (late 음전 마감분배) — A1~A8엔 보조였는데 실전 진입 타이밍의 결정축. 미래에셋 진입(4/14 late0), 삼천당 천장(3/30 late-79) 모두 late가 갈랐다. - C (거래량 질) — "양봉인데 거래 고갈=데드캣"이 삼천당 4/13 거부의 핵심. amt_vs_self를 진입 게이트로 격상해야. - G (라벨 불신) — l2_scenario를 믿지 말고 OF로 검증하라가 실전 원칙이 됨. - H (전일 트리거 대조) — 연속 판단의 뼈대. 단일 호출(S336)엔 없던 축.

3. 핵심 발견 — "동의 4축 동시 충족" 게이트

두 케이스를 관통한 단 하나의 진입 규칙: ENTER = 거래량 동반(amt_vs_self↑) + clv 고가사수 + intraday_cvd 양전 + late_session 양전, 4개 동시. - 미래에셋 4/14: 4개 동시 충족 → ENTER (이전 17일은 매번 1~2개 빠짐) - 삼천당 전 구간: 4개 동시 충족 0일 → 미보유 - 하나라도 빠지면 "동의 미완"으로 보류. 특히 late가 마지막 빗장 역할.

4. 보완 필요 (실전이 노출한 한계)

B1. late_session·cvd 상대화 (자기 평소 대비). [최우선] 미래에셋 에이전트 자기진단: "이 종목은 마감 단타청산 상시라 late가 거의 매일 음전. 절대 음전이 아니라 평소 대비 이례 음전으로 봐야 4/20~21 과도경계 안 함." → exceptional_days에 late_vs_self(60일 평소 late 분포 대비 z) 추가. cvd도 동일. 다른 지표(amt_vs_self)는 이미 상대화인데 수급만 절대값이라 노이즈/신호 안 갈림.

B2. 진입 게이트 명문화. "동의 4축 동시"를 chart-judge에 진입 규칙으로 명시 (현재는 서술에 흩어짐). 단 코드가 ENTER를 자동판정하는 게 아니라, 에이전트 체크리스트로.

B3. 거래량 질을 게이트로. amt_vs_self를 "동반 vs 고갈" 판정에 명시 (양봉이어도 amt_vs_self < 1 이면 "적은 손" 경계).

5. 정리 결론 — 데이터/질문/원자화 재확정

줄 데이터 (현행 + 보완)

  • exceptional_days (유지) + late_vs_self / cvd_vs_self 상대화 추가 (B1)
  • 나머지(trajectory/energy/exceptionality) 유지 — 보조

물을 질문 (A1~A8 재편)

  • 유지·격상: A1(이날무슨일=E) A2(종가사수=동의B) A5(돌파거부=용인) A6(거래량동의=A) A7(오늘국면=D)
  • 신설: late 마감분배 점검(B), 거래량 질(C), 라벨불신(G), 전일트리거대조(H)
  • 강등: A4(눌림목) A8(재점화강도) — 사후검증/서사용

원자화 형태

"동의 4축(거래량·clv·cvd·late) 동시 충족 = 진입, 하나라도 빠지면 보류" 를 핵심 게이트로, 그 위에 사건 시퀀스 국면(D)과 연속성(전일 대조 H)을 얹는다. 코드는 4축 raw + 상대화 값만 주고, 동시충족 판정·국면해석은 에이전트.

5b. 필드 전수 점검 (PM 지적 — "4축 외 나머지 정보는 어떤지 점검")

40개 D2Input 필드를 44일 판단 전체와 대조한 사용 점검 결과:

실제 결정력 있는 필드 = 약 6개

  1. 4축: exceptional_days.{amt_vs_self, clv, intraday_cvd, late_session}
  2. exceptionality.amount_vs_self_60d — 데드캣 구분(삼천당 4/13 거부 결정타). 게이트 격상
  3. trajectory.cvd_slope_z_5d — 같은 고가권 두 종목 정반대 판정의 축

뺄 후보 (~16개, [거의 안 씀]·변별력 0)

  • trend: ma_60_slope_z, ma_120_slope_z
  • structure: swing_pattern, structure_break_stage (44일 전부 null/NONE)
  • VP: poc_dist_atr, va_position, volume_asymmetry_20d, in_lvn (대부분 불발화)
  • VSA: last_signal_strength/age, bullish/bearish_strength_sum (인용 0)
  • price_pctile_1250d, vol_vs_self_60d, binvol_low_to_high, move_per_amount_5d

⚠️ 함정 필드 (능동 무시·역해석 필요 — 가장 중요)

  • l2_scenario [불신] — 44일 전부 "other". chart-judge verdict 행렬은 "other→NEGATIVE baseline"인데 4/14 ENTER·4/22 ADD가 전부 other에서 나옴. 에이전트가 룰을 어겨야 정답이었음. → 행렬에서 l2 게이트 제거 또는 "참고용" 강등 필요
  • vsa.spring_count_20d / last_signal_id(Spring) [오해석 위험] — 삼천당 3/30·3/31·4/13 하락/데드캣일에 bull(spring 2~3)로 발화했으나 전부 거부해야 했음. 그런데 chart-judge.md는 여전히 "spring을 bull ★★(D+20 0.707)로 인용하라" 지시 → 룰과 실전 정면 충돌. → spring을 무조건 bull로 보지 말고 "가격위치·cvd와 함께 해석"으로 수정 필요

유지 (보조 서사·맥락, 실사용 확인)

lower_upper_wick_ratio(윗꼬리 분배), trajectory.*(5일 궤적), energy.efficiency/cum_amount_vs_normal_5d, exceptionality.amount_pctile_252d/ret_vs_atr(이례성 트리거), next3d_low_held/next10d(사후검증용), drawdown_60d·high_proximity·range_pos·overhang·close_vs_vwap(맥락 좌표)

결론: PM 우려 정확. 40개 중 결정력 6개 집중. trend/structure/VP/VSA ~20개는 안 쓰이거나 함정. l2_scenario·spring_count는 잘못 따르면 손실 — 단순 유지 X, 제거 또는 경고 라벨.

5c. PM 질문 — "나쁜 정보 vs 정보량 부족"을 어떻게 판단했나 (정정)

첫 점검의 오류: "44일 서사에 인용됐나" 하나로 "안 쓰임=뺄 후보" 뭉갬. 둘을 구분 못 함. 실제 값 분포(44일 패키지)로 재점검하니 3가지로 갈림:

원인 데이터 기준 필드 조치
A. 정보량 부족 null·상수(변별 불가) va_position(상수 above), in_lvn(상수 false), last_signal_strength/age(상수 2/0), swing_pattern(61% null) 버그 점검·수정 (제거 X)
B. 나쁜 정보 값 있으나 방향 틀림 l2_scenario, spring_count 룰 수정/경고
C. 무용 의심 값 다양(44종)인데 인용 0 ma_60/120_slope_z, poc_dist_atr, volume_asymmetry_20d, up_down_amount_ratio_log, bull/bear_strength_sum 안 가르쳐서인지 먼저 확인

A그룹 산출 버그 점검 결과 (코드+데이터 확인 완료): - in_lvn = 로직 버그 (확정). vol_by_bin.loc[poc_bin] < median인데 poc_bin은 idxmax(최대 거래량 bin) → 수학적으로 영원히 False. 44일 전부 false 당연. chart-judge.md는 이걸 "bull ★★ D+20 0.818"로 인용하라는데 발화 자체가 불가능. → 현재가가 속한 bin 거래량으로 수정하거나 제거. - va_position = 중복·열등 이분화. poc_dist_atr(연속값)이 같은 정보를 더 잘 담음. 임계 0 이분화라 상승종목은 늘 "above" 고착. → poc_dist_atr로 대체, va_position 제거 가능. - last_signal_strength/age = 하드코딩. strength=2 if last_id else None, age=0 — 계산 없이 상수. 실제 강도·나이 산출 안 함(플레이스홀더). → 실산출 or 제거.

정정 결론: A그룹은 "무용해서 제거"가 아니라 산출 결함. PM 판단대로 빼기 전에 점검이 옳았음.

A그룹 처리 완료 (S337, in_lvn만 고치고 나머지 제거): - in_lvn 버그 수정cur_bin = 현재가 속한 bin, in_lvn = cur_vol < median으로 교체. 검증: 구버전 44일 전부 False → 수정 후 True/False 변별 발생(미래에셋 4/14 ENTER일 True=신고가 돌파로 위쪽 빈 구간/저항 없음, 4/22 False=고거래). 버그라 죽어있던 진입 보강 신호가 살아남. - va_position 제거 — 스키마·indicator에서 삭제. poc_dist_atr이 대체. - last_signal_strength/age 제거 — 하드코딩 플레이스홀더 삭제. - 수정 파일: schemas.py(D2VolumeProfileBlock/D2VSABlock), chart_indicators.py(compute_volume_profile/vsa)

C그룹 (값 다양한데 안 씀): 진짜 무용인지, chart-judge.md가 "이걸 보라"고 안 가르쳐서인지 미확정. → S338에서 ma60/poc_dist 등을 명시 인용 지시 후 재호출, 가르치면 쓰는지(정보가치 있는지) 확인 필요.

6. PM 확인 후 → 구현 (S338)

  • (신규 최우선) 함정 필드 정리 — l2_scenario verdict 행렬 게이트 제거/강등, spring bull 룰 수정
  • 뺄 후보 ~16개 D2Input/스키마에서 제거 (패키지 경량화 + 노이즈 제거)
  • B1 late/cvd 상대화 → 재빌드 → 미래에셋 4/20~21 재판정 개선 확인
  • B2/B3 동의 4축 게이트 명문화
  • 그 후 D7 점수화 / 백테스트 재실행