meta:
  title: "은퇴자산포트폴리오 — 주도주 스캔·과열 방지"
  parent_file: "spec/strategy/entry_gates.yaml"
  version: "2026-05-16-F12_kosdaq_strict"
  language: "ko-KR"
  timezone: "Asia/Seoul"
  role: "canonical"
  migration_status: "canonical_split_active"

entry_timing_guardrails:
  principle: "좋은 종목도 비싸게 사면 수익이 나빠지지만, 강한 장세의 돌파를 놓치는 것도 손실이다. 진입은 추격이 아니라 단계화다."
  daily_leader_scan:
    purpose: "장마감 후 5개 조건(C1~C5)을 스캔해 탐색 후보를 등재한다. 4개 이상=탐색 후보, 3개=관찰 전용."
    scan_timing: "매일 장마감 후 (15:30~16:00)"
    conditions:
      C1_price:
        formula: "Close >= MA20 AND Close >= (High - (High-Low)*0.3)"
        meaning: "20일선 위 + 당일 종가가 장중 상단 70% 이내 (윗꼬리 배제)"
        score: 1
        data: "data_feed 탭 Close·MA20·High·Low"
      C2_relative_strength:
        formula: "Ret10D_종목 >= Ret10D_KOSPI + 3%p"
        meaning: "최근 10거래일 수익률이 KOSPI 대비 +3%p 이상 초과"
        score: 1
        data: "data_feed 탭 Ret10D 또는 직접 계산"
      C3_volume_surge:
        formula: "AvgTradeValue_5D_M >= AvgTradeValue_20D_M * 1.5"
        meaning: "최근 5일 평균거래대금이 20일 평균의 150% 이상"
        score: 1
        data: "data_feed 탭 AvgTradeValue_5D_M·AvgTradeValue_20D_M (단위 통일: 억원)"
      C4_flow:
        formula: "Frg_5D > 0 OR Inst_5D > 0 AND Flow_OK=Y"
        meaning: "외국인 또는 기관 중 하나라도 5일 순매수 양수 AND Flow_OK=Y"
        score: 1
        data: "quant_feed_contract.investor_flow_rules"
      C5_sector:
        formula: "sector_priority_ranking.Tier_1 AND sector_flow.Rotation_Score 순위 <= 3"
        meaning: "해당 종목 섹터가 Tier_1(최우선 섹터) AND Rotation_Score 상위 3위 이내"
        score_Tier1: 1.0
        score_Tier2: 0.5
        score_Tier3: 0
        data: "sector_flow 탭 Rotation_Score + sector_priority_ranking 리스트"
    pass_rule:
      explore_candidate: "C1+C2+C3+C4+C5 합계 >= 4 → 탐색 후보 등재"
      watch_only:        "합계 == 3 → 관찰 전용 (탐색매수 금지)"
      below_threshold:   "합계 <= 2 → 이번 스캔 제외"
    entry_delay_rule:  # [proposal_68 / 2026-05-15] 탐색 후보 등재 후 진입 지연 허용 기간
      purpose: "탐색 후보 등재 후 실제 stage_1 진입까지 최대 3거래일 허용. 초과 시 자동 해제."
      preferred_timing: "탐색 후보 등재 익일(T+1) 개장 후 anti_climax_buy_gate 재확인 통과 시 진입"
      max_delay:
        duration: "3거래일 (T+1~T+3)"
        expiry_action:
          condition: "T+3 종가까지 stage_1 진입 미실행"
          action: "탐색 후보 자동 해제. 탐색 슬롯 1건 반환."
          re_entry: "동일 종목은 다음 날 daily_leader_scan 재스캔 통과 시 신규 후보로 재등재 가능"
      anti_climax_recheck:
        rule: "진입 당일 개장 전 anti_climax_buy_gate 5개 신호 재확인 필수"
        if_newly_triggered: "신호 3개 이상 새로 발생 시 해당 후보 즉시 해제"
      output_columns_add: ["후보등재일", "만료일(T+3)", "anti_climax재확인결과", "진입실행여부"]
      prohibition:
        - "T+4 이후 기존 탐색 후보 재활성화 금지. 신규 스캔 통과로만 재등재"
        - "anti_climax 재확인 없이 T+2~T+3 지연 진입 금지"
      candidate_signal_freeze:  # [proposal_77 / 2026-05-15] 등재 후 일간 스캔 재결과 충돌 처리
        purpose: "등재된 탐색 후보의 C점수가 이후 일간 스캔에서 변동될 경우 처리 원칙"
        freeze_rule: "탐색 후보 등재 당시(T+0 15:30 기준) C1~C5 합계를 유효 신호로 동결. 만료일(T+3 종가)까지 유지."
        rescan_role: "T+1·T+2·T+3 일간 스캔 결과는 '참고 표기'로만 출력. 기존 후보 자동 해제 근거로 사용 금지."
        mandatory_release_conditions:
          - "anti_climax_buy_gate에서 새로 S신호 3개 이상 발생 시 즉시 해제 (이 경우에만 스캔 재결과 반영)"
          - "T+3 종가 경과 시 자동 만료 (entry_delay_rule 준수)"
        output_requirement: "후보 테이블에 [등재일 C합계] vs [당일 C합계] 병기. 동결 여부 명시."
        prohibition:
          - "T+2~T+3 스캔에서 C합계 < 4로 하락했다는 이유만으로 후보 자동 해제 금지"
          - "스캔 재결과로 후보를 C합계 상향 처리 금지 — 동결 양방향 적용"
    sector_priority_ranking:
      # [proposal_63 / 2026-05-15] 섹터 동적 우선순위 — C5 판정 기준 고정
      as_of: "2026-05-15 (매월 첫째 주 갱신)"
      Tier_1:
        description: "현재 KOSPI·KOSDAQ 수급·추세가 가장 강한 섹터. 탐색매수 최우선."
        sectors: ["반도체·AI메모리", "AI인프라·서버·전력반도체", "방산·항공우주", "조선·해운"]
        C5_score: 1.0
      Tier_2:
        description: "추세 있으나 Tier_1 대비 약한 섹터. C5=0.5 부여 (합계 4점 도달 시 C1~C4 모두 필요)."
        sectors: ["전력기기·전선", "자동차·전기차", "바이오·제약(임상확인)", "엔터·콘텐츠(실적대형주)"]
        C5_score: 0.5
      Tier_3:
        description: "수급 이탈·비주도. 신규 탐색 금지. sector_flow 순위 무관 C5=0."
        sectors: ["유통·소비재", "건설·부동산", "금융·보험", "기타소형주"]
        C5_score: 0
      monthly_update:
        promotion: "Tier_2가 4주 연속 Rotation_Score 상위 3위 유지 → Tier_1 승격"
        demotion:  "Tier_1이 2주 연속 Rotation_Score 6위 이하 → Tier_2 강등"
        prohibition:
          - "뉴스·테마 단기 급등만으로 Tier_1 즉시 승격 금지. 4주 연속 조건 필수."
          - "보유 종목 섹터를 Tier_1로 임의 분류 금지 (보유 편향)"
      demotion_protocol:  # [proposal_67 / 2026-05-15] Tier 강등 즉시 탐색 금지
        purpose: "Tier 강등 확정 즉시 해당 섹터 탐색 후보를 해제하고 5거래일 신규 탐색을 금지한다."
        trigger: "monthly_update.demotion 조건 충족 확정 시"
        immediate_actions:
          step_1: "강등 확정일: 해당 섹터의 현재 daily_leader_scan 탐색 후보 전부 즉시 해제"
          step_2: "강등 섹터 종목의 C5 점수를 강등 후 Tier 기준으로 즉시 재산정"
          step_3: "해당 섹터 신규 탐색매수(stage_1) 5거래일 금지"
          step_4: "기존 보유 위성(해당 섹터) → relative_weakness_exit 점검 주기 일간 임시 전환"
        cooldown_period:
          duration: "5거래일 (강등 확정일 기준)"
          resume_condition: >
            5거래일 후 해당 섹터 Rotation_Score 5위 이내 AND
            외국인·기관 순매수 5D 합산 양수 재확인 시 탐색 재개.
            미충족 시 10거래일 추가 대기.
        prohibition:
          - "Tier 강등 5거래일 이내 해당 섹터 신규 탐색 진입 금지"
          - "기존 보유 위성은 강등만으로 즉시 전량 청산 금지 (relative_weakness_exit 준수)"
    data_integrity_guard:
      # [proposal_57 / 2026-05-15] daily_scan 할루시네이션 방지 guard
      pre_scan_checks:
        check_1_freshness:       "as_of_date가 당일 장마감(15:30) 이내여야 함. 불충족 시 DATA_STALE — 탐색 후보 등재 금지."
        check_2_unit_consistency: "C3 산출 시 AvgTradeValue_5D_M·AvgTradeValue_20D_M 모두 억원 단위 확인. 불일치 시 C3=0."
        check_3_data_conflict:   "동일 필드 복수 소스 오차 시 해당 C=0 처리."
        check_4_missing_defaults:
          C1_missing: "Close 또는 MA20 미확인 → C1=0"
          C2_missing: "Ret10D_종목 또는 Ret10D_KOSPI 미확인 → C2=0"
          C3_missing: "AvgTradeValue 미확인 → C3=0"
          C4_missing: "Flow_OK=N 또는 수급 미확인 → C4=0"
          C5_missing: "sector_flow 미제공 → C5=0"
          principle:  "누락 데이터는 항상 0점. 추정·보간 금지."
        check_5_atr_prerequisite: "탐색 후보 등재 종목이라도 ATR20 미확인 시 [ATR미확인 — 진입 불가] 명시. 진입 허용 착각 방지."
      post_scan_prohibition:
        - "5개 조건 중 3개 이상 기본값(0)인 경우 탐색 후보 등재 금지"
        - "as_of_date 없이 스캔 결과 출력 금지"
        - "결과 '후보 없음'이어도 data_integrity_guard 실행 여부 표기 필수"
    # [proposal_93 / 2026-05-16] 코스닥 종목 진입 허들 상향 — 동일 C점수에서 더 높은 기준 요구
    kosdaq_entry_gate_premium:
      purpose: "코스닥 종목은 유동성·기관수급 불안정성으로 인해 KOSPI 종목 대비 진입 허들을 1단계 높인다."
      explore_candidate_threshold:
        kospi_satellite:  "C1+C2+C3+C4+C5 합계 >= 4 → 탐색 후보"
        kosdaq_satellite: "C1+C2+C3+C4+C5 합계 >= 5 → 탐색 후보 (1점 추가 요구)"
        kosdaq_watch:     "합계 == 4 → 관찰 전용 (코스닥에서는 탐색매수 금지)"
      additional_required_any:
        - "기관 5D 순매수 양수 (Inst_5D > 0) — 코스닥은 외국인 단독 수급 신뢰도 낮음"
        - "거래대금 20D 평균 대비 150% 이상 (C3 조건과 동일하나 코스닥 저유동성 보정 재확인)"
      grade_cap:
        rule: "코스닥 종목은 CSCS >= 90이어도 A등급 상한 적용"
        exception: "코스닥 내 Tier_1 섹터(반도체·AI인프라 관련 코스닥 대형주) 이고 기관·외국인 동시 순매수 확인 시 예외 검토 가능. 단, daily_leader_scan 합계 >= 5 필수."
      output_column_add: ["시장구분(KOSPI/KOSDAQ)", "코스닥_추가조건_충족여부"]
      prohibition:
        - "코스닥 종목을 KOSPI 기준 탐색 후보 등재 금지 (합계 4점은 코스닥에서 관찰 전용)"
        - "기관 수급 미확인 코스닥 종목 A등급 부여 금지"

    output_table:
      columns: ["종목명", "시장구분", "C1", "C2", "C3", "C4", "C5", "합계", "판정(탐색/관찰/제외)", "ATR상태", "as_of_date"]
    prohibition:
      - "4개 미충족 종목 탐색매수 후보 등재 금지"
      - "코스닥 종목은 5개 미충족 시 탐색 후보 등재 금지"
      - "data_integrity_guard 미실행 상태 탐색 후보 표기 금지"
      - "→ master_prohibitions.P2(ATR미확인 진입 금지)·P5(데이터 없이 A등급 금지) 전역 적용"

  # [proposal_49 / 2026-05-15] 설거지 방지 규칙 통합 명문화 — anti_climax_buy_gate
  anti_climax_buy_gate:
    purpose: "급등 클라이맥스·주도주 설거지 구간을 정량적으로 차단한다. 5개 신호 중 3개 이상 = 신규매수 전면 금지."
    signals:
      S1_surge_5d:
        formula: "Ret5D_종목 >= 25%"
        meaning: "최근 5거래일 수익률 +25% 이상 급등"
        score: 1
        data: "data_feed 탭 Ret5D 또는 직접 계산"
      S2_volume_climax:
        formula: "AvgTradeValue_5D_M >= AvgTradeValue_20D_M * 3.0"
        meaning: "5일 평균거래대금이 20일 평균의 300% 이상 (클라이맥스 물량)"
        score: 1
      S3_upper_wick:
        formula: "(High - Close) / max(High - Low, 1) >= 0.35 AND High > 전고점"
        meaning: "당일 윗꼬리 비율 35% 이상 + 전고점 돌파 후 음봉 반전"
        score: 1
      S4_smart_money_exit:
        formula: "Frg_5D < 0 AND Inst_5D < 0"
        meaning: "외국인 AND 기관 5D 동반 순매도 전환 (스마트머니 이탈)"
        score: 1
      S5_retail_frenzy:
        formula: "Ind_5D > 0 AND (Frg_5D < 0 OR Inst_5D < 0)"
        meaning: "개인 순매수 + 외국인·기관 이탈 (뒤늦은 개인 매수 = 설거지 패턴)"
        score: 1
    gate_rule:
      buy_ban:  "합계 >= 3 → 신규 매수 금지 (탐색매수 포함)"
      caution:  "합계 == 2 → 매수 허용하나 수량 50% 축소 + 사유 명시"
      clear:    "합계 <= 1 → gate 통과"
    recheck_timing:  # [proposal_76 / 2026-05-15] T+1 재확인 기준시각·데이터 명시
      purpose: "탐색 후보 T+1 진입 전 anti_climax 재확인의 정확한 시점과 데이터 기준"
      execution_time: "T+1 08:30 이전 (개장 30분 전까지 완료)"
      data_reference:
        base_date: "T-1 (등재 전일) 20:00 시점 최신 확정 데이터"
        S1_S2_S3: "T-1 종가 OHLC 기준"
        S4_S5: "T-1 20:00까지의 5D 누적 신호 기준"
      prohibition:
        - "T+1 장중 데이터로 anti_climax 재판정 금지 (미확정 데이터 혼용)"
        - "T+1 09:00 이후 재확인 시도로 진입 지연 허용 금지"
      fallback: "T+1 08:30까지 데이터 수집 불가 시 → anti_climax 신호 합계 3으로 보수 처리 (매수 보류)"
    prohibition:
      - "anti_climax_buy_gate 발동 중 daily_leader_scan 탐색 후보 종목도 매수 금지"
      - "gate 발동 중 pullback_reentry_rule 재진입도 금지"
      - "5억 목표 압박을 이유로 gate 해제 금지 (→ master_prohibitions.P3)"
    output_table:
      columns: ["종목명", "S1", "S2", "S3", "S4", "S5", "합계", "gate판정", "가능수량비율"]

  # [proposal_48 / 2026-05-15] 3단계 탐색매수 체계 — staged_entry_v2
