meta:
  title: "은퇴자산포트폴리오 — 총위험·포트폴리오 하드스톱"
  parent_file: "spec/risk/risk_control.yaml"
  version: "2026-05-15-F12_split"
  language: "ko-KR"
  timezone: "Asia/Seoul"
  role: "canonical"
  migration_status: "canonical_split_active"

risk_control:
  attention_map:
    always_check:
      - "unified_engine.trigger_matrix: 3개 트리거 중 발동 여부 확인"
      - "weekly_circuit_breaker: 주간 누적 수익률 확인"
    check_if_triggered:
      monthly_minus_8: "portfolio_hard_stop_procedure"
      correlation_shock_conditions: "correlation_shock"
      opening_minus_1pct: "opening_volatility_filter"
      top3_over_65pct: "concentration_brake"
      turnover_cost_high: "turnover_control_gate"
      after_drawdown: "drawdown_recovery_speed_gate"
    skip_if_not_triggered: "위 조건 미발동 시 해당 섹션 읽기 생략 허용"
  aggregate_risk_cap:
    formula: "Total_Heat = Σ (entry_price_i - stop_price_i) × quantity_i / 총자산 × 100  [단위: %]"
    threshold:
      warning:    "Total_Heat >= 7%  → 신규 매수 시 기존 포지션 손절선 재확인 필수"
      hard_block: "Total_Heat >= 10% → 신규 매수 전면 금지. Total_Heat < 7% 회복 전까지 유지."
    calculation_rule:
      - "stop_price는 확정된 HTS 조건부 주문 가격. 미설정 시 entry_price × (1 - ATR20/entry_price × 2.0) 사용. (ATR×2.0은 Total_Heat 과소측정 방지용 보수적 추정. 실제 HTS 손절가는 stop_loss.core.hts_entry_formula(ATR×1.5) 기준)"
      - "신규 매수 산출 전 현재 Total_Heat를 반드시 계산하고 주문표에 표시한다."
    output_column: "Total_Heat(%)"
    pre_quantity_gate:  # [proposal_65 / 2026-05-15] final_quantity_rule 실행 전 선행 차단 게이트
      purpose: >
        신규 매수 수량 산출(final_quantity_rule) 실행 전 Total_Heat 수준을 먼저 확인.
        이 게이트를 통과하지 못하면 final_quantity_rule 실행 자체를 생략한다.
      check_sequence:
        step_1: "신규 매수 제안 시 Total_Heat 현재값 산출"
        step_2: "hard_block(>=10%) 확인 → 발동 시 즉시 매수 스킵. final_quantity_rule 실행 없음"
        step_3: "caution(7~9%) 확인 → final_quantity_rule 수량 × 0.5 감액 후 실행"
        step_4: "정상(<7%) → final_quantity_rule 정상 실행"
      action_by_level:
        hard_block:
          condition: "Total_Heat >= 10%"
          action: "모든 신규 매수(stage_1·stage_2·pyramiding·pullback 포함) 전면 차단"
          exception: "pyramiding_rule 2차 증액(기존 보유 증액)은 caution 적용으로 완화. hard_block 예외."
          report: "'Total_Heat 한도 초과(현재 값%) — 신규 매수 불가' 보고서에 필수 표기"
        caution:
          condition: "7% <= Total_Heat < 10%"
          action: "final_quantity_rule 산출 수량 × 0.5. 최소 1주. 0주이면 매수 포기."
          report: "'Total_Heat caution(현재 값%) — 수량 50% 감액' 보고서에 필수 표기"
        normal:
          condition: "Total_Heat < 7%"
          action: "final_quantity_rule 정상 실행"
      prohibition:
        - "Total_Heat 미산출 상태에서 신규 매수 수량 산출 금지"
        - "pyramiding hard_block 예외를 일반 신규진입에 적용 금지"
    prohibition:
      - "Total_Heat 미산출 시 A등급 신규 매수 금지"
      - "→ master_prohibitions.P3 전역 적용 (hard_block 완화 포함)"
      - "개별 종목 stop_loss 없이 Total_Heat 계산에 포함하는 것 금지 → 손절가 미설정 포지션은 Total_Heat 최대값(15%)으로 가정"
  portfolio:
    monthly_minus_5: "core_satellite 신규매수 중단"
    monthly_minus_8: "위험자산 20% 축소. portfolio_hard_stop_procedure 즉시 실행."
    drawdown_minus_12: "전략 재검토, 현금 확대"
  bankruptcy:
    minus_20: "위성 중단, 신규매수 축소, 목표확률 재계산"
    minus_30_or_monthly_minus_12: "공격전략 중단, 위험자산 축소"
    minus_40_or_margin_risk: "생존모드. 신규 위험자산 중단"

  portfolio_hard_stop_procedure:
    trigger: "portfolio.monthly_minus_8 발동 시 즉시 순서대로 실행"
    step_1: "신규 매수 전면 중단. 당일 예약 주문 취소 확인."
    step_2: "위성 포지션 우선 축소: time_stop 초과 전량 청산 → Flow_OK=N 위성 전량 청산 → 5D 동반 순매도 위성 30~50% 축소. 위성 합계 총자산 3% 이하."
    step_3: "중복 ETF 초과분 1~2회 분할 지정가 매도."
    step_4: "cash_floor 15% 이상 확인. 미달이면 step_3 후 재확인."
    step_5: "코어 유지 원칙. 단 20일선 종가 이탈 + 5D 수급 동반 이탈 시 30% 부분 축소 검토."
    resume_condition: ["포트폴리오 수익률 monthly_minus_5 수준 회복", "cash_floor 충족", "VIX 안정·수급 개선 중 1개 이상"]
    prohibition: ["→ master_prohibitions.P3 전역 적용", "회복 기대로 위성 손절 지연 금지"]

  correlation_shock:
    trigger:
      required_all: ["포트폴리오 평가액 3거래일 연속 하락", "보유 위험자산 70% 이상이 3거래일 누적 하락"]
      required_one: ["KOSPI 20일·60일선 모두 하회", "VIX 25 이상", "credit_stress caution 이상", "USD/KRW 급등에도 해외자산 방어 실패", "USD/JPY 3거래일 내 3% 급락 + 글로벌 동반 하락"]
    action:
      stage_1: "신규 위험자산 매수 중단."
      stage_2: "중복 ETF → 20D 수급 이탈 종목 → 20일선 하회 위성 순서로 축소."
      stage_3: "cash_floor 25~30% 상향. 시장지배 주도주 직접보유는 마지막 축소대상."
    execution: "즉시 전량청산 아님. 1차 30%, 2차 30%, 잔여 40% 단계 집행."
    exception_rule:
      decoupling_sector_leadership:
        activation_required_all:
          - "Price_Status=PRICE_OK, Flow_OK=Y"
          - "최근 5거래일 내 52주 신고가 또는 ATH, 또는 섹터 1M/3M 상대강도 상위권"
          - "외국인+기관 합산 20D 순매수 양수"
          - "종가가 20일선 위 또는 신고가 후 눌림 구간"
          - "거래대금 최근 5거래일 평균 대비 급감 아님"
        permitted_override:
          - "stage_2 1차 축소 순서에서 제외. 신규매수는 금지."
          - "trailing_stop을 20일 ATR 1.2~1.5배로 타이트하게 재설정."
        sunset: "5거래일마다 재검증. 20일선 이탈·5D 외인·기관 동반 순매도·장대음봉+거래대금 폭증 중 2개 이상이면 예외 해제."
    prohibition: ["3일 동반하락만으로 현금 30% 강제 인상 금지", "인버스·레버리지 ETF를 기본 헷지로 사용 금지", "현금 확보 위해 삼성전자·SK하이닉스 직접보유를 중복 ETF보다 먼저 줄이지 않는다", "decoupling 예외를 신규 추격매수 근거로 사용 금지"]

  unified_engine:
    purpose: "산재된 리스크 트리거를 단일 엔진으로 통합. 위기 발생 시 규칙 충돌 없이 즉각 대응."
    trigger_matrix:
      Systemic:
        conditions: ["USD/JPY 3거래일 내 3% 급락(엔화 폭등)", "VIX 30 돌파", "credit_stress 발동"]
      Portfolio:
        conditions: ["월간 손실 > 8% (monthly_minus_8)", "최대낙폭 > 12% (drawdown_minus_12)"]
      Correlation:
        conditions: ["보유종목 70% 이상 3거래일 연속 동반 하락", "KOSPI 20일·60일선 동시 하회"]
    action_tiers:
      Tier_1_Soft:
        trigger: "Systemic·Portfolio·Correlation 중 1개 충족"
        action: ["신규 매수 전면 중단", "위성 비중 50% 단계 축소 검토"]
      Tier_2_Medium:
        trigger: "Systemic·Portfolio·Correlation 중 2개 충족"
        action: ["중복 ETF 전량 매도", "현금 비중 20% 확보"]
      Tier_3_Hard:
        trigger: "Tier_2 조치 후에도 회복 실패"
        action: ["생존 모드 진입", "코어 직접보유 외 전량 현금화"]
    priority_rule: "individual_risk_rule의 예외 조항이 unified_engine Tier 조치보다 우선할 수 없다."
    prohibition: ["→ master_prohibitions.P3 전역 적용", "unified_engine 대신 개별 트리거만 선택 적용 금지"]

  circuit_interaction_rule:  # [proposal_73 / 2026-05-15] 복수 리스크 차단 조치가 동시 발동 시 충돌 해소 우선순위
    purpose: >
      sector_crash_intraday_protocol, correlation_shock, unified_engine, opening_volatility_filter 등
      복수의 리스크 차단 조치가 동시 발동할 경우, 어떤 조치가 우선하는지를 명문화하여 규칙 충돌을 제거한다.
    priority_rule:
      rule_1: "지속 기간이 더 긴 조치가 우선한다."
      rule_2: "지속 기간이 동일하면 적용 범위가 더 넓은 조치가 우선한다."
      rule_3: "적용 범위도 같으면 unified_engine 조치가 개별 프로토콜보다 우선한다."
    interaction_matrix:
      - {circuit_A: "unified_engine.Tier_3_Hard (전체 포트폴리오)", circuit_B: "sector_crash_intraday_protocol.tier_C (섹터 전량 청산)", winner: "unified_engine.Tier_3_Hard", reason: "범위 더 넓음"}
      - {circuit_A: "correlation_shock (3거래일+)", circuit_B: "opening_volatility_filter (당일)", winner: "correlation_shock", reason: "지속 기간 더 김"}
      - {circuit_A: "sector_crash_intraday_protocol.tier_A (신규 매수 중단)", circuit_B: "opening_volatility_filter.hard_block (신규 매수 중단)", winner: "둘 다 적용 — 더 엄격한 조치 유지", reason: "동급 범위, 동일 효과"}
    output_requirement: "복수 조치 발동 시 블록 4(플레이북) 상단에 [CIRCUIT 충돌 해소] 표기 후 우선 조치와 그 근거를 명시."
    stop_loss_execution_sequence:  # [proposal_79 / 2026-05-15] 동시 발동 시 포지션 청산 실행 순서
      purpose: "weekly_circuit_breaker + sector_crash_intraday_protocol tier_C 동시 발동 시 포지션 청산 실행 순서"
      trigger_condition: "weekly_circuit_breaker 발동 AND sector_crash_intraday_protocol.tier_C 동시 발동"
      execution_order:
        step_1: "sector_crash 해당 섹터 위성(satellite) 포지션 중 staged_entry stage_1 물량 우선 손절"
        step_2: "relative_weakness_exit RW점수 가장 높은 위성 포지션 부분 청산 (RW=3: 40%, RW>=4: 80%)"
        step_3: "코어(core_bucket) 포지션 현상 유지 — 두 조치 해제까지 신규 매수 전면 중단"
      new_buy_block: "weekly_circuit_breaker AND tier_C 동시 해제 조건 모두 충족 후에만 신규 매수 재개"
      output_requirement: "블록4 플레이북 상단에 [복수 circuit 발동 — 실행 순서 ①→②→③ 진행 중] 표기"
      prohibition:
        - "step_1 실행 전 step_2·step_3 실행 금지"
        - "코어 포지션을 위성보다 먼저 청산 금지"
    prohibition:
      - "규칙 충돌을 이유로 두 조치 모두 무시 금지"
      - "더 완화된 조치를 우선 적용 금지"
