meta:
  title: "은퇴자산포트폴리오 — 핵심 진입 게이트"
  parent_file: "spec/strategy/entry_gates.yaml"
  version: "2026-05-15-F11_entry_split"
  language: "ko-KR"
  timezone: "Asia/Seoul"
  role: "canonical"
  migration_status: "canonical_split_active"

entry_timing_guardrails:
  principle: "좋은 종목도 비싸게 사면 수익이 나빠지지만, 강한 장세의 돌파를 놓치는 것도 손실이다. 진입은 추격이 아니라 단계화다."
  regime_based_entry:
    risk_on: "추세·수급·거래대금이 동시에 강하면 돌파 시범진입 허용"
    leader_concentration: "top2_rotation_sum>=100 AND top1_rotation_score>=55 AND top1_alert_score>=2 AND leader_sector_flag=1 AND KOSPI_Ret20D>0 AND VIX_Close<25"
    neutral: "돌파 단독이면 대기, 눌림 확인 후 진입"
    risk_off: "돌파 추격 금지, 지지 확인 전 본진입 금지"
  numeric_gates:
    breakout_pilot:
      required: ["Price_Status=PRICE_OK", "Flow_OK=Y", "Flow_Rows>=20", "20일선 위", "DART_Risk 없음"]
      optimal_algorithm_formula: "Score = ((Close/MA20)-1)*100 + (Val_Surge_Pct/10) + (Net_Inst_Frg_5D_Ratio)"
      formula_gate: "Score > 15 일 때만 시범진입 허용. 미만이면 뇌동매매 방지를 위해 대기."
      calibration_note:  # [P132] Score > 15 근거 및 재교정 기준
        score_ranges: {price_dev: "1~3 (1~3% 이탈)", val_surge: "0~10 (거래대금 0~100% 급증)", net_flow: "1~5 (기관+외국인 순매수)"}
        recalibration: "30건 후 손절률 > 50% 또는 평균수익 < 5% 시 임계치 20으로 상향 검토"
      term_definitions:  # [proposal_105 / 2026-05-15] 미정의 항 명시 — Score 게이트 정상화
        Net_Inst_Frg_5D_Ratio: >
          (Inst_5D_sh + Frg_5D_sh) / AvgVolume_5D_shares.
          분자: 주식 수(shares) 단위 5D 순매수 합산.
          분모: AvgVolume_5D_shares — 최근 5거래일 평균 거래량(주식 수). AvgTradeValue_5D_M(억원) 혼용 금지.
          Flow_OK=Y 이고 Flow_Rows>=5 일 때만 계산.
          DATA_MISSING 또는 Flow_Rows<5 이면 0으로 처리(보수적 기본값).
          단위: 무차원 비율(소수). 예) Inst_5D=500K주, Frg_5D=300K주, AvgVolume_5D=10M주 → 0.080
    minimalist_buy_gate:
      rule: "과적합(Over-optimization) 방지를 위해, 진입 판단은 1)가격 추세(20일선) 2)외국인/기관 수급 3)유동성(거래대금) 3대 핵심 지표만으로 결정한다. 기타 보조지표 충돌 시 핵심 3지표를 최우선으로 한다."
      formula_id: "minimalist_v1"  # [proposal_111 / 2026-05-15] 수치 임계치 고정 — 일관성 확보
      three_core_indicators:
        indicator_1_price_trend:
          formula: "Close > MA20"
          pass: "종가가 20일선 위에서 마감"
          fail: "종가가 20일선 아래 → 진입 금지"
          data_source: "data_feed 탭 Close·MA20 또는 Naver 직접 조회"
        indicator_2_supply_demand:
          formula: "Frg_5D + Inst_5D > 0 AND Flow_OK=Y AND Flow_Rows >= 5"
          pass: "외국인·기관 합산 5D 순매수 양수"
          fail: "합산 음수 또는 Flow_OK=N → 진입 금지"
          data_source: "quant_feed_contract.investor_flow_rules"
        indicator_3_liquidity:
          formula: "AvgTradeValue_5D_M >= 50"
          pass: "5D 평균거래대금 50억원 이상"
          fail: "50억원 미만 또는 DATA_MISSING → 진입 금지"
          data_source: "data_feed 탭 AvgTradeValue_5D_M 또는 KRX 거래대금"
      gate_logic:
        all_pass: "3개 모두 pass → minimalist_gate 통과, 상위 gating 계속"
        any_fail: "1개라도 fail → 진입 보류. 사유 표기."
        data_missing_treatment: "핵심 필드 DATA_MISSING이면 해당 지표 fail로 보수 처리."
      integration_rule:
        - "minimalist_buy_gate 통과 후 ATR수량·Expected_Edge·sector_model.grade 상위 gating 계속."
        - "미통과 종목에 RSI·MACD·볼린저 등 보조지표 적용 금지."
        - "이 게이트는 A등급 승격의 필요조건. 충분조건은 상위 gating."
      occams_razor_alignment:  # [P133] minimalist_gate와 occams_razor는 다른 목적
        note: "minimalist_buy_gate 3지표(추세/수급/유동성)는 진입 가부 판단 게이트. occams_razor_filter는 타이밍 정밀도 보조. 목적이 달라 동일 지표가 아님 — 두 단계를 순서대로 적용."
        override_prohibition: "이 3개 외 보조지표를 '더 중요하다'는 이유로 대체 금지."
    occams_razor_filter:
      rule: "신규 매수(A등급 승격) 판단 시 융합할 수 있는 조건은 최대 3개로 제한한다. 초과된 조건은 뇌동매매 방지를 위해 기계적으로 무시한다."
      preferred: ["최근 5거래일 상승률이 섹터 평균 이상", "Val_Surge_Pct 0~25", "종가가 고가 근처 마감"]
      tranche: "계획 수량의 20~30%"
    breakout_block:
      trigger: ["Val_Surge_Pct 40 이상", "장대양봉 연속", "거래대금 급폭발", "5거래일 연속 급등"]
      action: "본진입 금지. 시범진입도 10~20%로 축소하거나 관찰로 전환."
    pullback_buy:
      required: ["20일선 또는 5일선 부근", "거래대금 감소 또는 안정", "Flow_OK=Y", "20D 수급 유지"]
      tranche: "계획 수량의 40~60%"
    leader_concentration:
      numeric_definitions:
        top2_rotation_sum: "sector_flow 상위 2개 Rotation_Score 합"
        top1_rotation_score: "sector_flow 상위 1개 Rotation_Score"
        top1_alert_score:
          INFLOW_STRONG: 3
          INFLOW_MODERATE: 2
          NEUTRAL: 1
          OUTFLOW_CAUTION: 0
          OUTFLOW_ALERT: -1
        leader_sector_flag:
          # [Q5 / 2026-05-15] "주도 섹터"의 판정 주체와 기준 미명시로 LLM이 임의 판단하는 할루시네이션 방지.
          formula: "sector_flow 탭에서 Rotation_Score 1위 섹터명이 아래 approved_list 중 하나이면 1, 아니면 0"
          approved_list: ["반도체", "AI전력", "전력기기", "발전/전력"]
          data_source: "sector_flow 탭 Rotation_Score 컬럼 기준 1위 행의 섹터명"
          missing_rule: "sector_flow 탭 미제공 또는 Rotation_Score 미확인 시 leader_sector_flag=0 (보수적 기본값)"
          disambiguation: "'AI전력'은 AI 인프라·전력기기·전력 설비 관련 섹터를 의미. 항공·우주·방산과 혼동 금지."
      gate: "top2_rotation_sum>=100 AND top1_rotation_score>=55 AND top1_alert_score>=2 AND leader_sector_flag=1 AND KOSPI_Ret20D>0 AND VIX_Close<25"
      pilot_tranche: "20~30%"
      add_on_tranche: "40~60%"
      stop_gate: "Val_Surge_Pct>=40 OR DART_Risk!=없음 OR Flow_OK!=Y"
    expected_edge_floor:  # [P95] 기대우위 하한선 — 비용 차감 후 최소 손익비 미만 진입 차단
      purpose: "기대우위가 하한선 미만이면 신규 진입을 금지하고 관찰만 유지한다."
      formula: "Expected_Edge = (target_price - entry_price) / (entry_price - stop_price) × bayesian_confidence_multiplier - execution_cost_rate"
      threshold:
        floor: "Expected_Edge >= 1.5 → 진입 허용. 미만이면 관찰 전환."
      prohibition:
        - "Expected_Edge 미산출 시 A등급 즉시매수 금지"
        - "손절가 미설정 상태에서 Expected_Edge 산출 금지 (분모 = 0이 되어 연산 불능)"
  confirmation_rule:
    breakout_only: "신고가·박스 돌파 첫날은 전량 매수 금지. 다만 risk_on이면 계획 수량의 20~30% 시범진입은 허용."
    add_on_rule: "돌파 다음날 종가 유지 또는 2~3거래일 내 눌림 후 지지 확인이 있어야 본진입 허용."
    pullback_rule: "20일선 또는 5일선 부근 눌림에서 거래대금이 줄고 수급이 유지될 때 우선 매수."
    quality_filter: "종가가 고가 근처에서 마감하고, 장중 밀림을 다시 회복하며, 20D 수급이 양호해야 돌파 신뢰도 상향."
  overextension_rule:
    too_hot: "최근 급등 후 거래대금이 과도하게 폭발하고 장대양봉이 연속되면 본진입 보류."
    chase_limit: "최근 5거래일 상승률이 섹터 평균을 크게 초과하면 추격매수 대신 관찰 또는 소액 시범진입만 허용."
    acceptable_extension: "다만 섹터 주도주가 20일선 위에서 1차 돌파 후 0~3% 연속 확장하는 구간은 risk_on에 한해 허용."
  timing_mode_policy:
    principle: >
      선행형은 작은 초기 포지션을 빠르게 잡아 기회를 확보하는 방식이고,
      후행형은 확인 후 진입·반등 확인 후 축소·추세 훼손 후 정리하는 방식이다.
      둘 중 하나만 고집하지 말고, 시장 국면과 데이터 완성도에 따라 전환한다.
    lead_when:
      regime: ["risk_on", "leader_concentration"]
      required: ["Price_Status=PRICE_OK", "Flow_OK=Y", "Flow_Rows>=20", "20일선 위", "DART_Risk 없음"]
      use_case:
        - "신고가 직전 또는 1차 돌파 구간의 시범진입"
        - "주도 섹터 내 대장주 초기 편입"
      size_rule:
        pilot_tranche: "계획 수량의 20~30%만"
        add_on: "돌파 유지·눌림 지지 확인 후 나머지 70~80%"
      prohibition:
        - "대량 일괄매수 금지"
        - "선행형 신호를 이유로 손절가·수량 미확정 상태에서 진입 금지"
    lag_when:
      regime: ["neutral", "risk_off", "data_partial", "high_volatility"]
      required: ["20일선 재확인", "수급 유지 확인", "거래대금 급감 없음"]
      use_case:
        - "반등 확인 후 축소"
        - "손실 포지션 정리"
        - "섹터 이탈 종목의 시간 손절"
      size_rule:
        entry_tranche: "계획 수량의 40~60% 또는 반등 확인 후 분할"
        exit_rule: "손실 포지션은 후행형으로 줄이고, 강한 종목은 반등 시 축소"
      prohibition:
        - "저점 추격 투매 금지"
        - "후행형이 필요할 때 선행형 돌파 추격 금지"
    hybrid_when:
      regime: ["neutral with strong setup", "risk_on but data_mixed"]
      rule: "시범진입은 선행형, 본진입/축소는 후행형으로 분리"
      output_requirement: "보고서에 선행/후행 중 어느 모드인지 반드시 명시"
    scoring_gate:
      lead_score_formula: "(price_strength + flow_strength + liquidity_strength) - volatility_penalty - data_miss_penalty"
      lead_threshold: "lead_score >= 3 → 선행형 허용"
      lag_threshold: "lead_score < 3 → 후행형 우선"
      note: "lead_score는 진입 타이밍 보조지표이며, 기대수익비·손절가·수량 산출을 대체하지 않는다."

  # [2026-05-17] 지정가 산출 공식 — limit_price_formula
  # 매수 지정가를 시나리오별로 명확히 정의해 LLM이 임의 가격을 생성하지 않도록 한다.
  limit_price_formula:
    authority_note: "지정가 계산은 아래 시나리오 중 진입 유형에 따라 하나를 선택. 불명확 시 pullback_limit 우선."
    data_inputs: ["Close", "Ask (매도1호가)", "MA20", "ATR20"]
    missing_rule: "Ask 미제공 또는 Spread_Status=WIDE 이면 Close 기반 공식으로 fallback."

    scenarios:
      breakout_pilot:
        entry_context: "breakout_pilot 또는 leader_concentration 시범진입"
        formula: "limit_price = Ask if Ask available else Close * 1.005"
        note: "매도1호가 체결 우선. Ask 없으면 종가 +0.5% (2~3틱) 위 지정가."
        max_chase_limit: "Close * 1.010 초과 지정가 금지 — 추격매수 방지"

      pullback_buy:
        entry_context: "pullback_buy (눌림 매수) 또는 MA20 지지 확인 후 진입"
        formula: "limit_price = Close * 1.002  (종가 +0.2%, 시가 이하 눌림 체결 목표)"
        note: "눌림 구간에서 종가보다 낮은 가격도 허용. 체결 못하면 다음 날 재판단."
        tighter_option: "limit_price = MA20 * 1.003 (MA20선 +0.3% — 지지 부근 매수)"

      staged_add_on:
        entry_context: "본진입 2·3차 분할 매수 (breakout 유지 확인 후)"
        formula: "limit_price_2nd = entry_price_1st * (1 + 0.005~0.010)"
        note: "1차 평단 대비 0.5~1.0% 위. 추가 급등 구간(Val_Surge_Pct>=40)에서는 추가 금지."

    stop_price_formula:
      formula: "stop_price = entry_price - ATR20 * stop_atr_multiplier"
      stop_atr_multiplier:
        default: 1.5
        tight: 1.0
        wide: 2.0
      canonical_ref: "spec/05_position_sizing.yaml:position_sizing.volatility_targeting"
      note: "stop_price는 entry_price 확정 직후 계산. ATR20 미제공 시 매수수량 산출 금지 (HF002)."

    expected_edge_calculation:
      formula: "Expected_Edge = (target_price - entry_price) / (entry_price - stop_price) * bayesian_confidence_multiplier - execution_cost_rate"
      inputs:
        target_price: "data_feed 탭 Target_Price (Naver 컨센서스 우선, Yahoo 폴백)"
        entry_price: "limit_price (위 시나리오 중 선택)"
        stop_price: "stop_price_formula 결과"
        bayesian_confidence_multiplier: "spec/05_position_sizing.yaml 참조 (기본 1.0)"
        execution_cost_rate: "0.003 (왕복 거래비용 0.3% — 증권사 수수료+세금)"
      floor: "Expected_Edge >= 1.5 → 진입 허용. 미만이면 관찰 전환 (RA003)."

  # [proposal_47 / 2026-05-15] 일간 주도주 조기탐지 레이어 — daily_leader_scan
