콘텐츠로 이동

S345 — D7 score 재설계 프로포저 (차트 전제 + 주도주 가점)

작성: 2026-06-03 (Wed) 배경: 30종 스모크(6/02)에서 selected=엔씨소프트가 stock_rs_z -0.494(RS 약점)인데 ea_z +2.227로 1등. PM 모델("차트상 출발 준비가 1차, 거기에 주도테마 주도주였으면 가점")과 어긋남. 목적: PM 모델을 score 구조에 반영하는 안을 제시하고 PM이 택일/수정하도록 함. (구현은 승인 후)


1. 현재 구조 (사실, 코드 인용)

2단계 파이프라인

  • Phase 3.7 pregate (step_pregate.py:88): 차트 복합강도 z합 = z(rangepos)*1.0 + z(dd60)*0.7 + z(hi52)*0.5 + z(ud_log)*0.8 + z(vol_asym)*0.5 → 상위 N(30) 통과. 차트 1차 선별은 여기서 작동.
  • Phase 5 D7 score (score_compose.py:107-121): pregate 통과 30종을 8축 순수 합산:
    final_score = stock_rs_z + ofm_cvd_z_z + catalyst_z + ea_z
                + theme_bonus + chart_verdict(±0.6) + ea_verdict(±0.36)
    

문제 (PM 지적과 정합)

  1. 차트가 D7에서 약화: pregate를 통과한 30종 안에선 차트가 chart_verdict ±0.6 한 축뿐. pregate가 이미 차트 상위만 추렸는데, D7에서 차트 변별이 거의 사라짐(통과자끼리는 다 차트 OK).
  2. ea_z가 무제한 z: 실적 가속 z는 상한 없음(+2.2). chart_verdict(±0.6)·theme_bonus(+0.3)를 압도 → 실적 하나로 1등 가능. 이번 엔씨가 그 사례.
  3. RS가 동급 합산: stock_rs_z가 음수여도 다른 축이 크면 통과. "주도주 가점" 아니라 "RS도 한 표".

결과: PM 모델(차트 전제 → 주도주 가점 → 실적 보조)이 아니라, 실적 주도 + 차트/RS 보조로 뒤집힘.


2. PM 모델 (목표 구조)

[1차/전제] 차트상 "갈 준비"(출발 자리)        ← 이게 안 되면 후보 아님 (게이트)
   └ [가점] 주도테마 주도주(였던) = RS 강/강했던  ← 차트 OK 위에 얹는 우대
       └ [보조] 실적·재료·수급                  ← 추가 확인, 주도권 아님

핵심: 차트=관문, RS=가점, 실적=보조. 세 층위가 동급 합산이 아니라 위계.


3. 안 (택일 또는 조합)

안 A — pregate를 진짜 게이트로 + D7은 가점만 (최소 변경, 권장)

  • 차트 전제: pregate가 이미 차트 1차 선별 중 → 이걸 "전제(게이트)"로 명확화. pregate 통과 = "차트상 갈 준비 됨"으로 간주(추가 차트 게이트 불필요).
  • D7 재가중: pregate 통과자끼리는 차트가 비슷하므로 D7 final_score에서 RS·주도주를 주 가점, 실적·재료·수급을 보조로 재배치:
    final_score = stock_rs_z*1.5 + theme_bonus*1.5      # 주도주 가점(↑)
                + chart_verdict*1.0                       # 차트 잔여 변별(유지)
                + ea_z(클리핑 ±1.5) + ofm_cvd_z_z + catalyst_z + ea_verdict   # 보조(상한)
    
  • 장점: 구조 최소 변경(pregate 그대로 + score 가중만). ea_z 클리핑으로 실적 폭주 차단.
  • 단점: 게이트가 pregate(코드 거친 선별)에 의존 — LLM 차트 판단(D2 verdict)은 가점으로만.

안 B — D7에 차트 하드 게이트 추가 (명시적 2중 게이트)

  • pregate(코드) 후, D7에서 D2 chart_verdict가 NEGATIVE/UNKNOWN이면 후보 탈락(게이트). 통과자만 RS 가점 + 실적 보조로 스코어.
    if d2.verdict in (NEGATIVE, UNKNOWN): drop          # 차트 게이트
    final_score = stock_rs_z*1.5 + theme_bonus*1.5 + ea_z(클립) + ...  # 가점+보조
    
  • 장점: "차트 안 좋으면 무조건 탈락" = PM 모델에 가장 충실. LLM 차트 판단을 게이트로 격상.
  • 단점: S330에서 "게이트 폐기" 결정을 되돌림(철학 회귀). UNKNOWN 탈락은 데이터 결손 종목 과배제 위험.

안 C — 곱셈 구조 (차트×주도주×실적, 위계를 곱으로)

  • 합산 대신 차트_점수 × (1 + RS가점) × (1 + 실적가점) 형태. 차트가 0이면 전체 0(자연 게이트), 주도주·실적은 차트 위에 배수로 얹힘.
  • 장점: 위계가 수식에 내장(차트 없으면 곱으로 죽음). PM 모델을 가장 직접 표현.
  • 단점: 가장 큰 구조 변경. z값 음수 처리(차트_점수 음수면 부호 꼬임) 설계 필요. 검증 부담 큼.

4. 비교

차트 위계 변경 규모 ea 폭주 차단 S330 철학
A pregate게이트+재가중 중(pregate 전제) 클리핑 합산 유지
B D7 하드게이트 강(2중 게이트) 클리핑 게이트 회귀
C 곱셈 강(수식 내장) 자연 전면 재설계

권장: 안 A. pregate가 이미 차트 1차 선별을 하므로 이를 전제로 명확화하고, D7은 RS·주도주 가점 + 실적 클리핑으로 재가중. 최소 변경으로 PM 모델 근사. A로 부족(여전히 RS 약한 종목 1등)하면 B 추가.

5. 검증 방법 (구현 후)

  • 6/02 run을 재스코어(LLM 재호출 없이 envelope 재사용 → score_compose만 재실행)해서 selected가 RS 강한 주도주로 바뀌는지 대조. 엔씨(RS -0.494)가 밀려나는지 확인.
  • 안별 selected 비교표.

6. 미결 (PM 결정 필요)

  • 안 택일 (A/B/C 또는 조합)
  • 가점 가중치 수치 (RS·theme_bonus ×1.5? ea 클리핑 ±1.5?) — PM 직관 반영
  • "주도주였던"(과거 주도주) 반영: 현재 theme_bonus는 현재 시점 leader만. 과거 RS 강했던 종목 우대하려면 RS 시계열(예: 60일 전 RS) 추가 필요 — 별도 데이터 작업.