feat: 리밸런싱 엔진 V1 + GAS 버그 수정 (2026-06-13)
주요 변경: - tools/build_rebalance_engine_v1.py: REBALANCE_ENGINE_V1 신규 * account_snapshot 직접 합산(_build_snap_position_map) → 소수주 분리 행 병합 * 레짐 소스 macro.REGIME_PRELIM 최우선 (GAS 와 동일) - src/gas_adapter_parts/gdf_06_rebalance.gs: runRebalanceSheet_() 신규 * Logger.log / getSpreadsheet_() 로 run_all 연동 수정 - src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs * _mergePositionRecord_(): 소수주 중복 행 합산 신규 * parseInt → parseFloat (qty, availQty) - src/gas_adapter_parts/gdf_01_price_metrics.gs * 미보유 종목 SELL_READY → WATCH_EXIT_SIGNAL - spec/41_release_dag.yaml: build_rebalance_sheet 노드 추가 (step_count 63) - spec/51_formula_lifecycle_registry.yaml: REBALANCE_ENGINE_V1 등록 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
# Risk Spec Split Plan
|
||||
|
||||
`spec/03_risk_policy.yaml` is now a compatibility index.
|
||||
The canonical risk rules are the split files in this directory.
|
||||
|
||||
Canonical split files:
|
||||
|
||||
- `aggregate_risk.yaml`: Total_Heat, portfolio hard stops, correlation shock, integrated risk engine
|
||||
- `circuit_breakers.yaml`: weekly circuit breaker, trading cost control, concentration brake, sector crash protocol
|
||||
- `market_risk_cash.yaml`: market risk score based cash rules and VIX/US10Y cash adjustment
|
||||
- `portfolio_exposure.yaml`: duplicate exposure, target allocation, cash floor, ETF staged reduction
|
||||
- `risk_control.yaml`: compatibility index only; do not add thresholds here
|
||||
- `quality_control.yaml`: risk quality-control summary
|
||||
|
||||
Migration rule:
|
||||
|
||||
- Do not add numeric thresholds to `spec/03_risk_policy.yaml` or `spec/risk/risk_control.yaml`.
|
||||
- Keep old paths valid only through compatibility indexes and `spec/aliases.yaml`.
|
||||
- New documents must reference canonical split files directly.
|
||||
- `spec/00_execution_contract.yaml` remains higher authority than all risk split files.
|
||||
@@ -0,0 +1,152 @@
|
||||
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:
|
||||
- "규칙 충돌을 이유로 두 조치 모두 무시 금지"
|
||||
- "더 완화된 조치를 우선 적용 금지"
|
||||
@@ -0,0 +1,215 @@
|
||||
meta:
|
||||
title: "은퇴자산포트폴리오 — 서킷브레이커·거래통제"
|
||||
parent_file: "spec/risk/risk_control.yaml"
|
||||
version: "2026-05-16-F13_kosdaq_strict"
|
||||
language: "ko-KR"
|
||||
timezone: "Asia/Seoul"
|
||||
role: "canonical"
|
||||
migration_status: "canonical_split_active"
|
||||
|
||||
risk_control:
|
||||
opening_volatility_filter:
|
||||
monitoring_window: "09:00~09:30"
|
||||
trigger:
|
||||
soft_block: "KOSPI 장중 시가 대비 -1% 이상 → 신규 위성 매수 보류"
|
||||
hard_block: "KOSPI 장중 시가 대비 -2% 이상 → 모든 신규 매수 중단 (기존 조건부 주문 포함)"
|
||||
emergency: "KOSPI 시가 대비 -3% + 거래대금 폭발 → 손절 실행 우선. 신규 매수 당일 금지."
|
||||
observation_required: ["09:30 이후 저가 확인", "09:30 이후 반등 거래대금", "V자 반등 또는 추가 하락 여부"]
|
||||
resume_condition:
|
||||
- "09:30~10:00 사이 KOSPI 시가 대비 +0.5% 이상 회복"
|
||||
- "거래대금이 전일 동시간대 대비 급격히 감소하지 않음"
|
||||
prohibition:
|
||||
- "09:00 직후 시장가 주문 금지"
|
||||
- "09:30 이전 신규 진입 지정가 주문 입력 금지"
|
||||
- "장중 급등 직후 신규 추격매수 금지"
|
||||
- "뉴스 첫 반응만 보고 본진입 금지. 종가 확인 전까지는 시범진입 수준만 허용"
|
||||
# [proposal_90 / 2026-05-16] 코스닥 종목 전용 병렬 필터 — 코스닥의 높은 일중 변동성 반영
|
||||
kosdaq_parallel_filter:
|
||||
applicable: "코스닥 종목 신규 매수 시에만 추가 적용 (KOSPI 필터와 독립 발동)"
|
||||
trigger:
|
||||
soft_block: "KOSDAQ 장중 시가 대비 -1.5% 이상 → 코스닥 종목 신규 매수 보류"
|
||||
hard_block: "KOSDAQ 장중 시가 대비 -2.5% 이상 → 코스닥 종목 모든 신규 매수 중단"
|
||||
emergency: "KOSDAQ 장중 시가 대비 -3.5% + 거래대금 폭발 → 코스닥 보유 위성 손절 우선"
|
||||
resume_condition:
|
||||
- "09:30~10:00 사이 KOSDAQ 시가 대비 +0.7% 이상 회복"
|
||||
- "KOSPI 기준 opening_volatility_filter 블록이 해제된 상태"
|
||||
interaction:
|
||||
rule: "KOSPI 기준 필터와 KOSDAQ 기준 필터 중 더 강한 제한 적용."
|
||||
note: "코스닥 종목이라도 KOSPI 장 전체가 hard_block 상태면 코스닥 필터 별도 확인 불필요."
|
||||
prohibition:
|
||||
- "코스닥 종목 매수 시 KOSDAQ 병렬 필터 미확인 진입 금지"
|
||||
- "코스닥 지수 블록 중 다른 코스닥 종목으로 대체 매수 금지"
|
||||
|
||||
concentration_brake:
|
||||
threshold:
|
||||
warning: "상위 3종목 합산 비중 65% 이상"
|
||||
hard_block: "상위 3종목 합산 비중 70% 이상"
|
||||
action:
|
||||
warning_시: "신규 A등급 종목 매수 시 기존 상위 종목 트림 우선 검토"
|
||||
hard_block_시: "신규 매수 전면 중단. 새 종목 매수 전 기존 집중 종목 부분 익절 필수."
|
||||
exception:
|
||||
- "삼성전자·SK하이닉스 합산 비중은 special_exception 기준으로 별도 계산"
|
||||
- "ETF와 직접보유가 동일 섹터 노출일 경우 합산 집중도로 계산"
|
||||
leader_concentration_override:
|
||||
trigger: "Leader_Concentration=1 AND Price_Status=PRICE_OK AND Flow_OK=Y AND Flow_Rows>=20 AND ATR20_Status=OK AND DART_Risk=없음"
|
||||
rule: "warning=1 유지, hard_block=0 유지. 신규 추격매수는 금지하되 확인된 시범진입과 본진입은 허용."
|
||||
prohibition: "→ master_prohibitions.P3 (집중도 브레이크 무력화 금지 포함)"
|
||||
|
||||
weekly_circuit_breaker:
|
||||
measurement: "월요일 시가 → 금요일 종가 기준 포트폴리오 수익률"
|
||||
trigger:
|
||||
caution: "주간 누적 -3% 이하"
|
||||
circuit_break: "주간 누적 -5% 이하"
|
||||
action:
|
||||
caution_시: ["다음 주 신규 위성 매수 50% 감액", "현금 비중 12% 이상 확인"]
|
||||
circuit_break_시: ["다음 주 신규 매수 전면 중단", "보유 위성 time_stop 잔여일 재점검", "cash_floor 15% 이상 확보 확인"]
|
||||
reset_condition: ["다음 주 포트폴리오 수익률 +2% 이상 회복", "VIX caution 수준 하락"]
|
||||
prohibition: "→ master_prohibitions.P3 전역 적용 (서킷브레이커 발동 중 포함)"
|
||||
|
||||
turnover_control_gate:
|
||||
purpose: "신호가 많아도 과잉매매는 거래비용으로 순수익률을 갉아먹는다. 주간 회전율과 비용 비율로 자동 제한한다."
|
||||
measurement:
|
||||
weekly_turnover_cost_pct: "(해당 주 총 매수금액 + 총 매도금액) × 예상수수료율(0.015%) / 총자산 × 100"
|
||||
threshold:
|
||||
caution: "weekly_turnover_cost_pct >= 0.15% → 이번 주 신규 진입 수량 50% 감액"
|
||||
hard_block: "weekly_turnover_cost_pct >= 0.30% → 이번 주 신규 진입 전면 보류 (손절·익절 실행은 허용)"
|
||||
reset_condition: "다음 월요일 00:00 KST에 자동 초기화"
|
||||
exception: "weekly_circuit_breaker.circuit_break 발동 중 손절 집행은 이 게이트와 관계없이 실행"
|
||||
# [P_C / 2026-05-15] 주간 신규 진입 건수 상한 — 비용률(%) 기준만으로는 소액 고빈도 과매매를
|
||||
# 통제하지 못하는 공백 해소. 예: 0.05% × 10건 = 0.5%이지만 hard_block은 0.30% 기준이므로 미발동.
|
||||
weekly_trade_count:
|
||||
measurement: "월요일~금요일 신규 진입(매수 체결 기준) 건수. 손절·익절·리밸런싱 축소 매도는 제외."
|
||||
count_unit: "계좌·종목 단위. 동일 종목 분할 매수는 1건으로 합산하지 않고 체결 건수로 계산."
|
||||
threshold:
|
||||
caution: "주간 신규 진입 3건 초과 → 추가 진입은 A등급 ONLY. 수량은 계획의 최솟값(pilot_tranche)만 허용."
|
||||
hard_block: "주간 신규 진입 5건 초과 → 주 내 신규 매수 전면 보류. 손절·익절 실행은 허용."
|
||||
reset_condition: "매주 월요일 00:00 KST 자동 초기화 (weekly_turnover_cost_pct와 동시 초기화)"
|
||||
exception:
|
||||
- "weekly_circuit_breaker 발동 중 손절 집행은 카운트 제외"
|
||||
- "ISA·연금저축 정기 납입 후 의무 투자 집행 1건은 카운트 제외"
|
||||
interaction_with_cost_gate:
|
||||
rule: "weekly_trade_count와 weekly_turnover_cost_pct는 AND 조건으로 동시 적용."
|
||||
priority: "둘 중 더 강한 제한(hard_block)이 우선한다."
|
||||
prohibition:
|
||||
- "turnover_cost 미산출 상태에서 3건 이상 신규 매수 연속 집행 금지"
|
||||
- "비용 회피 목적으로 분할 주문을 하나의 주문으로 합산 계산하지 않는 행위 금지"
|
||||
- "weekly_trade_count.caution 상태에서 B등급 이하 종목 신규 진입 금지"
|
||||
|
||||
drawdown_recovery_speed_gate:
|
||||
purpose: "낙폭 이후 회복이 느리면 자금이 오래 묶이고 다음 기회를 놓친다. 회복 기한 초과 시 신규 위성을 제한해 손실 확대를 방지한다."
|
||||
measurement:
|
||||
recovery_target: "낙폭 발동 기준 수익률 수준으로 포트폴리오 수익률 복귀"
|
||||
threshold:
|
||||
minus_5_level:
|
||||
trigger: "portfolio.monthly_minus_5 발동일 (월간 -5%) 또는 weekly_circuit_breaker.circuit_break 발동일 (주간 -5%)"
|
||||
deadline: "발동일로부터 15거래일"
|
||||
slow_action: "기한 초과 시 신규 위성 진입 수량 50% 감액. performance_brake 연동."
|
||||
minus_8_level:
|
||||
trigger: "portfolio.monthly_minus_8 발동일 (월간 -8%, portfolio_hard_stop_procedure 연계)"
|
||||
deadline: "발동일로부터 25거래일"
|
||||
slow_action: "기한 초과 시 신규 위성 전면 보류 + risk_budget 50% 감액 (performance_brake 동일 원칙 준용)."
|
||||
reset_condition: "포트폴리오 수익률이 해당 낙폭 기준점 이상 회복 확인 시 자동 해제"
|
||||
exception: "코어 포지션 손절·익절 집행은 이 게이트와 무관하게 실행"
|
||||
prohibition:
|
||||
- "회복 기한 초과 상태에서 고위험 위성 신규 진입 금지"
|
||||
- "→ master_prohibitions.P3 전역 적용 (회복 미완료 중 감액 무력화 포함)"
|
||||
|
||||
# [P_A / 2026-05-15] 엔캐리 언와인드 전용 방어 모듈 — USD/JPY 조건이 correlation_shock 다단계 조건에 묻혀
|
||||
# 즉각 발동이 지연되는 구조적 공백을 해소. 2024-08-05 유형 하루 폭락 대비 선행 경보 채널 분리.
|
||||
yen_carry_unwind:
|
||||
purpose: >
|
||||
엔캐리 청산은 종목 펀더멘털과 무관한 글로벌 유동성 발작이다.
|
||||
correlation_shock의 다단계 조건(KOSPI 이탈·VIX·수급 동반 확인)을 기다리면
|
||||
이미 하루 만에 -5~-10% 폭락이 발생한 이후다.
|
||||
USD/JPY 급락을 단독 선행 트리거로 분리해 즉각 대응한다.
|
||||
trigger:
|
||||
early_warning:
|
||||
condition: "USD/JPY 2거래일 내 -1.5% 이상 급락 (엔화 급등)"
|
||||
data_source: "macro 탭 USD_JPY_Close 또는 Yahoo Finance USDJPY=X"
|
||||
note: "BOJ 금리 인상 발표·YCC 정책 변경 시 당일 적용"
|
||||
full_alert:
|
||||
condition: "USD/JPY 3거래일 내 -3% 이상 급락 OR early_warning + VIX >= 20 동시 충족"
|
||||
data_source: "macro 탭 USD_JPY_Close, VIX_Close"
|
||||
action:
|
||||
early_warning_시:
|
||||
- "위성 신규매수 즉시 중단"
|
||||
- "중복 ETF 50% 이상 즉각 축소 검토"
|
||||
- "cash_floor 목표를 overheated_or_event_week 수준(10~15%)으로 상향"
|
||||
full_alert_시:
|
||||
- "portfolio_hard_stop_procedure 즉시 준용"
|
||||
- "cash_floor 강제 25% 이상 (risk_off 기준)"
|
||||
- "위성 포지션 70% 이상 1~2회 분할 지정가 축소"
|
||||
- "코어 직접보유는 20일선·5D 수급 동반 이탈 확인 후 부분 축소 검토"
|
||||
relation_to_unified_engine:
|
||||
note: >
|
||||
full_alert 발동 시 unified_engine.trigger_matrix.Systemic 조건
|
||||
('USD/JPY 3거래일 내 3% 급락')과 동시 충족으로 간주.
|
||||
Systemic + Portfolio/Correlation 중 1개 이상 → Tier_2 이상 자동 진입.
|
||||
deduplication: "unified_engine Tier 조치와 중복 실행 금지. 더 강한 Tier 조치만 1회 적용."
|
||||
resume_condition:
|
||||
- "USD/JPY 3거래일 연속 안정화 (일간 변동 ±0.5% 이내)"
|
||||
- "VIX 20 이하 하락 확인"
|
||||
- "KOSPI 20일선 회복 확인"
|
||||
prohibition:
|
||||
- "early_warning만으로 전량 청산 금지"
|
||||
- "USD/JPY 단순 일중 변동을 트리거로 오적용 금지 (종가 기준으로만 판정)"
|
||||
- "BOJ 회의 없는 단순 환율 변동에 full_alert 적용 금지"
|
||||
- "엔캐리 해소 후 반등 직후 즉각 위성 재진입 금지 (reentry.system_risk_exit 쿨다운 준용)"
|
||||
|
||||
# [proposal_51 / 2026-05-15] 현금 가변 운용 공식화 — market_risk_score_based_cash
|
||||
sector_crash_intraday_protocol:
|
||||
purpose: >
|
||||
opening_volatility_filter(장 개시 기준)와 portfolio_hard_stop_procedure(월간 -8% 기준) 사이
|
||||
공백 구간(섹터 -4~-7% 당일 급락)에 대한 즉각 대응 프로토콜.
|
||||
applicable_sectors: "보유 종목이 속한 주도섹터 OR KOSDAQ 종합 기준"
|
||||
tiers:
|
||||
# [proposal_89 / 2026-05-16] 코스닥 독립 트리거 엄격화 — 코스닥은 코스피 대비 -1%p 낮게 조기 발동
|
||||
tier_A:
|
||||
condition: "주도섹터 -4% 이상 당일 하락 OR KOSDAQ -3% 이상"
|
||||
action:
|
||||
- "해당 섹터 위성 신규 탐색매수 당일 전면 중단"
|
||||
- "staged_entry_v2 stage_1 신규 진입 중단"
|
||||
- "기존 보유 위성 → existing_position_rule 기준 처리 (아래 참조)"
|
||||
timing: "15:30 종가 확인 후"
|
||||
existing_position_rule: # [proposal_69 / 2026-05-15] tier_A 중 보유 위성 anti_climax 처리
|
||||
check_target: "위성 포지션 전체 (CSCS < 70인 종목)"
|
||||
action_by_signal_count:
|
||||
signal_2:
|
||||
condition: "anti_climax_buy_gate 신호 합계 = 2개"
|
||||
action: "손절선을 현 평단가(본절) 또는 최근 5D 저점 중 높은 값으로 상향 재설정. 추가 매수 금지."
|
||||
signal_3_plus:
|
||||
condition: "anti_climax_buy_gate 신호 합계 >= 3개"
|
||||
action: "해당 위성 보유수량의 50% 지정가 즉시 매도 (전일종가 -0.5% 이하. 시장가 금지)."
|
||||
signal_1_or_less:
|
||||
action: "손절가 재확인 후 유지. 추가 조치 없음."
|
||||
prohibition:
|
||||
- "tier_A 발동 중 위성 신규 매수 또는 pyramiding 증액 금지"
|
||||
tier_B:
|
||||
condition: "주도섹터 -5% 이상 OR KOSDAQ -4% 이상"
|
||||
action:
|
||||
- "tier_A 조치 모두 실행"
|
||||
- "보유 위성 중 staged_entry_v2 stage_1 물량 전량 청산 (FC 귀속)"
|
||||
- "cash_floor market_risk_score_based_cash MRS +2점 상향 (임시)"
|
||||
- "pyramiding_rule 추가 증액 중단"
|
||||
timing: "당일 장중 또는 15:30 직후"
|
||||
tier_C:
|
||||
condition: "주도섹터 -7% 이상 OR KOSDAQ -6% 이상 (극단 신호)"
|
||||
action:
|
||||
- "tier_B 조치 모두 실행"
|
||||
- "opening_volatility_filter.hard_block 준용: 다음 거래일 신규 매수 전면 중단"
|
||||
- "portfolio_hard_stop_procedure step_1·2 즉시 준용"
|
||||
- "unified_engine.trigger_matrix.Portfolio 발동 여부 확인"
|
||||
timing: "당일 장중 또는 15:30 직후"
|
||||
next_day_resume:
|
||||
tier_A: "다음 거래일 주도섹터 -1% 이내 안정 또는 반등 확인 후 탐색매수 재개"
|
||||
tier_B: "다음 거래일 주도섹터 +0.5% 이상 반등 AND KOSDAQ -1.5% 이내 AND daily_leader_scan >= 4 종목 존재 시"
|
||||
tier_C: "unified_engine.resume_condition 준수 (VIX·KOSPI 안정 등)"
|
||||
interaction:
|
||||
opening_volatility_filter: "sector_crash_intraday_protocol은 종가 기준. opening_volatility_filter는 개시(09:00~09:30) 기준. 독립 발동. 동시 충족 시 더 강한 제한 적용."
|
||||
yen_carry_unwind: "섹터 급락이 엔화 급등과 동시 발생 시 yen_carry_unwind.early_warning + 이 프로토콜 tier_B 이상 동시 발동."
|
||||
output_table:
|
||||
columns: ["섹터/지수", "당일수익률(%)", "트리거단계", "즉시조치", "다음날재개조건"]
|
||||
prohibition:
|
||||
- "섹터 급락 당일 패닉 시장가 전량 청산 금지 — 분할 지정가만 허용"
|
||||
- "급락 당일 V자 반등 기대로 탐색매수 조기 재개 금지"
|
||||
- "tier_A 발동 중 다른 종목 신규 탐색매수 예외 허용 금지"
|
||||
@@ -0,0 +1,155 @@
|
||||
meta:
|
||||
title: "은퇴자산포트폴리오 — 포트폴리오 노출·현금 정책 분할 후보"
|
||||
parent_file: "spec/03_risk_policy.yaml"
|
||||
version: "2026-05-16-F9_secular_leader"
|
||||
language: "ko-KR"
|
||||
timezone: "Asia/Seoul"
|
||||
role: "canonical"
|
||||
migration_status: "canonical_split_active"
|
||||
authority_rule: "이 split 파일이 해당 섹션의 canonical source다. parent_file은 legacy compatibility index다."
|
||||
|
||||
|
||||
factor_risk_management:
|
||||
factor_risk_limit:
|
||||
purpose: >
|
||||
포트폴리오 전체의 팩터 집중도를 수치로 통제한다.
|
||||
개별 종목 리스크 게이트(Total_Heat, stop_loss)와 직교하는
|
||||
포트폴리오 레벨 팩터 가드레일이다.
|
||||
portfolio_beta:
|
||||
formula_ref: "spec/13_formula_registry.yaml:formula_registry.formulas.PORTFOLIO_BETA_V1"
|
||||
warning_threshold: 1.2
|
||||
hard_cap: 1.3
|
||||
action_warning: >
|
||||
PORTFOLIO_BETA >= 1.2 → 보고서에 [팩터경보: 포트폴리오 베타 상승] 출력.
|
||||
신규 위성 매수 시 고베타(Beta >= 1.5) 종목 추가 검토 신중.
|
||||
action_hard_cap: >
|
||||
PORTFOLIO_BETA >= 1.3 → 고베타(Beta >= 1.5) 신규 위성 매수 보류.
|
||||
기존 고베타 위성은 RW 점수 우선 재점검.
|
||||
missing_policy: "Beta 미확인 종목 제외 후 산출. 제외 비중 > 30% 시 PARTIAL 표기."
|
||||
single_stock_beta:
|
||||
high_beta_threshold: 1.5
|
||||
treatment: >
|
||||
Beta >= 1.5 종목은 trailing_stop ATR 배수 1.8배 적용
|
||||
(take_profit.trailing_stop.high_beta_leader 준용).
|
||||
very_high_beta_threshold: 2.0
|
||||
action_very_high: >
|
||||
Beta >= 2.0 위성은 최대 보유 기간 20거래일 이내로 제한.
|
||||
time_stop.satellite 기준 단축 적용.
|
||||
momentum_concentration:
|
||||
definition: "직전 20거래일 수익률(Ret20D) 기준 상위 2개 종목의 포트폴리오 비중 합산"
|
||||
warning_threshold: "상위 2종목 합산 비중 >= 50%"
|
||||
hard_cap: "상위 2종목 합산 비중 >= 60%"
|
||||
action_warning: "보고서에 [모멘텀 집중 경보] 출력. 신규 고모멘텀 종목 추가 자제."
|
||||
action_hard_cap: "상위 종목 중 약한 쪽(RW 점수 높은 쪽)의 비중 5%p 축소 검토."
|
||||
sector_beta_concentration:
|
||||
definition: "단일 섹터에 Beta >= 1.5 종목이 2개 이상이고 합산 비중 >= 25%"
|
||||
action: "해당 섹터 고베타 중 RW 점수 낮은 종목 먼저 비중 조정."
|
||||
calculation_frequency: "주간 정기점검(수요일) 및 신규 매수 직전"
|
||||
output_table:
|
||||
columns: ["항목", "현재값", "경보임계치", "하드캡", "상태", "조치"]
|
||||
rows:
|
||||
- ["포트폴리오 베타", "[PORTFOLIO_BETA_V1]", "1.2", "1.3", "[OK/경보/차단]", ""]
|
||||
- ["모멘텀 집중도(상위2종목비중)", "[산출]", "50%", "60%", "[OK/경보/차단]", ""]
|
||||
- ["섹터 고베타 집중", "[산출]", "—", "25%", "[OK/차단]", ""]
|
||||
prohibition:
|
||||
- "PORTFOLIO_BETA 미산출 상태에서 고베타 신규 위성 추가 허용 금지"
|
||||
- "Beta 미확인을 이유로 팩터 리스크 점검 전체를 생략 금지 (부분 산출 PARTIAL로 진행)"
|
||||
- "팩터 과집중 경보를 이유로 core 주도주(삼성전자·SK하이닉스) 우선 축소 금지"
|
||||
|
||||
|
||||
position_count_limit:
|
||||
id: "PCL_PORTFOLIO_EXPOSURE_ENFORCEMENT"
|
||||
canonical_ref: "spec/01_objective_profile.yaml:position_count_limit"
|
||||
purpose: >
|
||||
포트폴리오 노출 레이어에서 계좌별 종목 수 상한을 집행한다.
|
||||
계좌 성격이 다르므로 통합 합산 한도는 두지 않는다.
|
||||
연금저축은 ETF 전용 계좌 — 개별주 카운트 완전 제외.
|
||||
counting_rule:
|
||||
include: "개별주 직접 보유 (코어 + 위성)"
|
||||
exclude: ["ETF", "국내상장 해외ETF", "MMF", "RP", "단기채 ETF", "현금성 상품"]
|
||||
pension_scope: "연금저축 전체 제외 — ETF 전용 계좌"
|
||||
enforcement:
|
||||
PCL001_TAXABLE_HARD_BLOCK:
|
||||
condition: "taxable_individual_count >= 10"
|
||||
action: "ROTATE_REQUIRED (일반계좌)"
|
||||
output: >
|
||||
일반계좌 개별주 10종목 도달. 신규 매수 제안 시 교체 후보 1종목 이상 명시.
|
||||
교체 후보 선정 기준: financial_health_score 최저 → RW 점수 최고 → 보유 기간 최장.
|
||||
PCL002_TAXABLE_CAUTION:
|
||||
condition: "taxable_individual_count == 9"
|
||||
action: "CAUTION_FLAG (일반계좌)"
|
||||
output: "일반계좌 9종목. 신규 매수 전 포트폴리오 전체 검토 권고."
|
||||
PCL003_ISA_HARD_BLOCK:
|
||||
condition: "isa_individual_count >= 4"
|
||||
action: "ROTATE_REQUIRED (ISA)"
|
||||
output: "ISA 개별주 4종목 도달. 신규 매수 시 교체 후보 명시."
|
||||
PCL004_ISA_CAUTION:
|
||||
condition: "isa_individual_count == 3"
|
||||
action: "CAUTION_FLAG (ISA)"
|
||||
output: "ISA 3종목. 추가 진입 전 검토 권고."
|
||||
PCL005_SATELLITE_ROTATION_REVIEW:
|
||||
condition: "satellite_count >= 3 AND new_buy_target_bucket == satellite"
|
||||
action: "SATELLITE_ROTATION_REVIEW"
|
||||
output: >
|
||||
위성 3종목 이상 보유 중 추가 위성 진입 검토 시
|
||||
financial_health_score 가장 낮은 기존 위성 종목을 교체 후보로 우선 표시.
|
||||
output_table:
|
||||
columns: ["계좌", "현재 개별주 수", "경보", "하드차단", "상태"]
|
||||
rows:
|
||||
- ["일반계좌", "[taxable_individual_count]", "9종목", "10종목 이상", "[PASS/CAUTION/ROTATE_REQUIRED]"]
|
||||
- ["ISA", "[isa_individual_count]", "3종목", "4종목 이상", "[PASS/CAUTION/ROTATE_REQUIRED]"]
|
||||
- ["연금저축", "카운트 제외", "—", "—", "ETF 전용"]
|
||||
prohibition:
|
||||
- "PCL 미집계 상태에서 신규 매수 수량 출력 금지"
|
||||
- "ETF를 개별주 카운트에 포함해 한도 여유 있는 것처럼 계산 금지"
|
||||
- "연금저축 ETF를 개별주로 오분류해 카운트 금지"
|
||||
- "종목 수 초과를 이유로 손절 기준 미도달 종목 강제 매도 금지"
|
||||
|
||||
tactical_cash_buffer:
|
||||
amount: "총자산의 5% 고정 (방어용 cash_floor와 완전 별개)"
|
||||
purpose: "VIX 30 이상 돌파 또는 KOSPI 1일 -4% 이상 폭락 시에만 집행 가능한 긴급 실탄"
|
||||
activation_trigger:
|
||||
vix_shock: "VIX >= 30 돌파 확인 (macro 탭 VIX_Close 기준)"
|
||||
kospi_crash: "KOSPI 전일 대비 Ret1D <= -4%"
|
||||
execution_rule:
|
||||
- "A등급 주도주 중 낙폭 과대 종목 한정"
|
||||
- "1~2회 분할 지정가 투입"
|
||||
- "cash_floor 충족 상태에서만 사용 가능"
|
||||
prohibition:
|
||||
- "일상적 물타기·평단 낮추기 용도 사용 금지"
|
||||
- "B등급 이하 또는 관찰 중 종목 사용 금지"
|
||||
- "activation_trigger 미발동 시 사용 금지"
|
||||
- "cash_floor와 합산하여 운용 금지. 버퍼는 별도 현금 계선으로 관리."
|
||||
|
||||
executable_rules:
|
||||
field_dictionary_ref: "spec/12_field_dictionary.yaml:field_dictionary"
|
||||
formula_refs:
|
||||
cash_ratios: "spec/13_formula_registry.yaml:formula_registry.formulas.CASH_RATIOS_V1"
|
||||
portfolio_band_status: "spec/13_formula_registry.yaml:formula_registry.formulas.PORTFOLIO_BAND_STATUS_V1"
|
||||
rules:
|
||||
- id: "PE001_CASH_RATIOS"
|
||||
inputs: ["immediate_cash", "settlement_cash", "reserved_order_amount", "planned_buy_amount", "sell_cash_proceeds_immediate", "total_asset"]
|
||||
formula_ref: "CASH_RATIOS_V1"
|
||||
output_fields: ["immediate_cash_ratio", "settlement_cash_ratio", "buy_power_cash", "buy_power_ratio", "post_trade_immediate_cash_ratio"]
|
||||
on_missing: "NO_CASH_CHECK"
|
||||
- id: "PE002_CASH_FLOOR_GATE"
|
||||
inputs: ["post_trade_immediate_cash_ratio", "min_cash_ratio", "buy_power_ratio"]
|
||||
rules:
|
||||
- {if: "post_trade_immediate_cash_ratio < min_cash_ratio", action: "BUY_BLOCKED_TRIM_REQUIRED"}
|
||||
- {if: "post_trade_immediate_cash_ratio >= min_cash_ratio", action: "CASH_GATE_PASS"}
|
||||
output_field: "cash_floor_status"
|
||||
on_missing: "BUY_BLOCKED_NO_CASH_CHECK"
|
||||
- id: "PE003_TARGET_BUCKET_BAND"
|
||||
inputs: ["current_weight_pct", "target_band_min_pct", "target_band_max_pct"]
|
||||
formula_ref: "PORTFOLIO_BAND_STATUS_V1"
|
||||
output_field: "portfolio_band_status"
|
||||
on_missing: "DATA_MISSING_NO_ADD_TRIM_DECISION"
|
||||
- id: "PE004_DUPLICATE_EXPOSURE"
|
||||
inputs: ["same_sector_etf_weight_pct", "single_stock_sector_weight_pct", "etf_purity_ratio"]
|
||||
derived_field:
|
||||
duplicate_exposure_pct: "same_sector_etf_weight_pct * etf_purity_ratio + single_stock_sector_weight_pct"
|
||||
rules:
|
||||
- {if: "duplicate_exposure_pct >= 20", action: "ETF_STAGED_REDUCTION_REQUIRED"}
|
||||
- {if: "duplicate_exposure_pct < 20", action: "DUPLICATE_EXPOSURE_PASS"}
|
||||
output_field: "duplicate_exposure_status"
|
||||
on_missing: "DATA_MISSING_REVIEW"
|
||||
@@ -0,0 +1,92 @@
|
||||
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:
|
||||
VIX:
|
||||
below_18: "정상 집행"
|
||||
18_25: "집행액 85%"
|
||||
25_35: "집행액 60%"
|
||||
above_35: "신규 위험자산 50% 축소"
|
||||
above_45: "신규 위험자산 매수 중단"
|
||||
US10Y:
|
||||
monthly_plus_50bp: "위험자산 수량 20% 축소 및 하락 위험 상향"
|
||||
rate_cut_delay_shock: "금리 인하 지연 + 환율 1,400원 동시 돌파 시 신규 매수 전면 중단, cash_floor 15~20% 즉각 상향"
|
||||
market_risk_score_based_cash:
|
||||
purpose: "MRS(시장 위험 점수) 0~10점에 따라 현금 비중을 5~20%로 자동 조정. cash_floor.regime_numbers 고정값 대체."
|
||||
formula: "target_cash_pct = 5 + (MRS / 10) × 15"
|
||||
formula_examples:
|
||||
MRS_0: "target_cash_pct = 5% (강한 상승장 최저현금)"
|
||||
MRS_5: "target_cash_pct = 12.5%"
|
||||
MRS_10: "target_cash_pct = 20% (극단 위기 최고현금)"
|
||||
mrs_components:
|
||||
VIX:
|
||||
below_18: 0
|
||||
18_25: 2
|
||||
25_35: 3
|
||||
above_35: 4
|
||||
max_score: 4
|
||||
KOSPI_vs_MA20:
|
||||
above_MA20: 0
|
||||
below_MA20: 2
|
||||
max_score: 2
|
||||
USD_KRW:
|
||||
below_1400: 0
|
||||
1400_1450: 1
|
||||
above_1450: 2
|
||||
max_score: 2
|
||||
USD_JPY_direction:
|
||||
stable: 0
|
||||
rapid_drop_1pct_2d: 1
|
||||
max_score: 1
|
||||
credit_stress:
|
||||
none: 0
|
||||
caution: 1
|
||||
max_score: 1
|
||||
override_rule:
|
||||
rule: "target_cash_pct = max(MRS_formula_result, cash_floor.regime_numbers 해당 구간 min_cash_ratio)"
|
||||
note: "MRS 기반 결과와 기존 regime_numbers 중 더 높은 값 적용. MRS가 기존보다 낮을 경우 기존 하한 유지."
|
||||
output_table:
|
||||
columns: ["VIX점수", "KOSPI점수", "환율점수", "JPY점수", "신용점수", "MRS합계", "target_cash_pct(%)", "현재현금(%)", "조정방향"]
|
||||
daily_calculation_sop: # [proposal_74 / 2026-05-15] MRS 일일 산출 실행 프로토콜
|
||||
reference_time: "매일 15:30 종가 확정 직후"
|
||||
collection_sequence:
|
||||
step_1: "VIX 종가 수집 → score 산출 (VIX<18→0, 18~25→2, 25~35→3, >35→4)"
|
||||
step_2: "KOSPI 종가 vs MA20 비교 → score (MA20 상회→0, 이탈→2)"
|
||||
step_3: "USD/KRW 종가 → score (<1400→0, 1400~1450→1, >1450→2)"
|
||||
step_4: "USD/JPY → score (급격 하락 2거래일 내 1%↓→1, 정상→0)"
|
||||
step_5: "credit_stress → score (경계→1, 없음→0)"
|
||||
aggregation: "MRS = step_1~step_5 합산 (최소 0, 최대 10)"
|
||||
missing_data_rule:
|
||||
rule: "각 컴포넌트 데이터 미확인 시 해당 컴포넌트 최고점 보수 처리"
|
||||
VIX_missing: "→ 4점 처리"
|
||||
KOSPI_MA20_missing: "→ 2점 처리"
|
||||
USD_KRW_missing: "→ 2점 처리"
|
||||
USD_JPY_missing: "→ 1점 처리"
|
||||
credit_missing: "→ 1점 처리"
|
||||
rationale: "데이터 누락 = 위험 인식 불가 = 최고 위험 가정이 생존 원칙에 부합"
|
||||
output_requirement: "MRS 점수·각 컴포넌트 점수·target_cash_pct를 보고서 블록5 현금룰 섹션에 출력 필수"
|
||||
update_frequency: "일별 갱신. VIX 5p 이상 장중 급변 시 장중 임시 갱신 허용."
|
||||
fallback_logic: # [proposal_82 / 2026-05-15] MRS 미산출 시 조건부 보수적 기본값
|
||||
purpose: "MRS 미산출 시 시장 국면에 따른 조건부 보수적 기본값으로 위험 방어"
|
||||
conditional_default:
|
||||
VIX_high: "VIX >= 25 확인 시 → target_cash_pct 기본값 15%"
|
||||
KOSPI_below_MA20: "KOSPI 종가 < MA20 확인 시 → target_cash_pct 기본값 12%"
|
||||
normal: "두 조건 모두 미충족 시 → target_cash_pct 기본값 10%"
|
||||
all_unknown_rule: "VIX·KOSPI 모두 확인 불가 시 → target_cash_pct 15% 강제 적용 AND 신규 매수 보류(MRS 재산출 완료 후 재개)"
|
||||
priority: "daily_calculation_sop 실행 실패 시에만 발동. SOP 성공 시 비활성."
|
||||
output_requirement: "fallback 발동 시 블록5에 [MRS 미산출 — fallback 적용: X%] 표기 필수"
|
||||
prohibition:
|
||||
- "VIX >= 25 국면에서 MRS 미산출 상태로 10% 기본값 적용 금지"
|
||||
- "all_unknown 상태에서 MRS 재산출 없이 신규 매수 집행 금지"
|
||||
prohibition:
|
||||
- "MRS 점수 미산출 시 target_cash_pct 기본값 10% 적용. 명시 표기."
|
||||
- "MRS 결과가 기존 cash_floor.regime_numbers보다 낮아도 기존 하한 유지 (하향 조정 금지)"
|
||||
- "→ master_prohibitions.P3 전역 적용"
|
||||
|
||||
# [proposal_56 / 2026-05-15] 섹터 급락 당일 대응 프로토콜 — sector_crash_intraday_protocol
|
||||
@@ -0,0 +1,465 @@
|
||||
meta:
|
||||
title: "은퇴자산포트폴리오 — 포트폴리오 노출·현금 정책 분할 후보"
|
||||
parent_file: "spec/03_risk_policy.yaml"
|
||||
version: "2026-05-18-F10_score_clamp_d2_fix"
|
||||
language: "ko-KR"
|
||||
timezone: "Asia/Seoul"
|
||||
role: "canonical"
|
||||
migration_status: "canonical_split_active"
|
||||
authority_rule: "이 split 파일이 해당 섹션의 canonical source다. parent_file은 legacy compatibility index다."
|
||||
|
||||
portfolio_exposure_framework:
|
||||
principle: "비중 한도는 파산확률 제어 장치. 시장지배 주도주는 벤치마크와 비교해 판단."
|
||||
exposure_layers:
|
||||
direct_core_leaders: ["삼성전자", "SK하이닉스"]
|
||||
duplicate_beta: ["KODEX 반도체", "동일 섹터 ETF"]
|
||||
tactical_satellites: ["방산", "조선", "전력기기", "건설/EPC", "기타 고베타"]
|
||||
cash: ["현금", "MMF", "RP", "단기채 ETF"]
|
||||
valid_trim_reasons:
|
||||
- "벤치마크 대비 초과비중이 허용밴드를 초과하고 가격 추세가 훼손됨"
|
||||
- "직접보유와 ETF가 같은 팩터를 중복 보유해 실질노출이 상한 초과"
|
||||
- "포트폴리오 현금이 최소 방어현금 이하이고 신규 기회 또는 손실방어 자금이 필요"
|
||||
- "외국인·기관 5D/20D 수급 동반 이탈 + 거래대금 동반 장대음봉"
|
||||
sell_priority_engine:
|
||||
purpose: >
|
||||
여러 보유 종목·ETF가 동시에 SELL/TRIM/ROTATE 후보가 되었을 때
|
||||
어떤 주문을 먼저 실행할지 결정하는 포트폴리오 단위 우선순위 규칙.
|
||||
stop_loss.sell_signal_priority는 종목 내부 매도 신호 우선순위이고,
|
||||
이 엔진은 계좌·현금·중복노출·상대약세를 종합한 후보 간 정렬 기준이다.
|
||||
activation_any:
|
||||
- "cash_floor.trim_required_when 충족"
|
||||
- "duplicate_exposure_rule 발동"
|
||||
- "동일 리포트에서 SELL/TRIM/ROTATE 후보가 2개 이상"
|
||||
- "risk_off 또는 event_week 현금 상향 필요"
|
||||
- "보유주 진단에서 축소/교체 후보가 2개 이상"
|
||||
required_inputs:
|
||||
- "capture_read_ledger.current_holding_quantity"
|
||||
- "average_cost"
|
||||
- "current_price"
|
||||
- "unrealized_return_pct"
|
||||
- "current_weight_pct"
|
||||
- "target_weight_pct 또는 target_band"
|
||||
- "duplicate_exposure_status"
|
||||
- "cash_floor_status"
|
||||
- "rw_partial 또는 relative_weakness_exit 합계"
|
||||
- "liquidity_status 또는 AvgTradeValue_5D_M"
|
||||
- "account_type"
|
||||
- "tax_cost_estimate 또는 세금 미확인 표시"
|
||||
hard_precedence:
|
||||
1: "법적·거래정지·상장폐지·회계 리스크 또는 stop_loss.emergency — 수량 확인 시 최우선"
|
||||
2: "hard stop 손절, trailing_stop 이탈, time_stop 만료, RW>=4 — stop_loss.sell_signal_priority 적용"
|
||||
3: "cash_floor 미달 또는 policy_event_week_escalation 현금 상향 — 현금 확보 목적 매도 우선"
|
||||
4: "중복노출 상한 초과 — duplicate_exposure_rule.funding_order 적용"
|
||||
5: "보유주 진단 교체/축소 후보 — current_holdings_score 낮은 순"
|
||||
6: "익절·리밸런싱 후보 — 세후 비용 대비 이탈폭 큰 순"
|
||||
7: "단순 수익 실현 — 다른 우선순위가 없을 때만"
|
||||
candidate_scoring:
|
||||
purpose: "동일 hard_precedence 단계 안에서 후보를 정렬하는 보조 점수. 점수가 높을수록 먼저 매도."
|
||||
score_range: "0~100"
|
||||
clamp: "Sell_Priority_Score = min(max(formula_result, 0), 100)"
|
||||
clamp_rationale: >
|
||||
컴포넌트 합산 시 이론상 최대 122점 초과 가능(예: hard_stop 50 + 중복ETF 20 + 상대약세 20 + ...).
|
||||
100 초과 점수는 LLM 임의 가중치 개입 증거로 오인되므로 반드시 min(result, 100) clamp 적용.
|
||||
clamp 발동 시 출력에 "[CLAMP 발동: raw={raw_score} → 100]" 표기 필수.
|
||||
formula: >
|
||||
Sell_Priority_Score = min(max(
|
||||
hard_precedence_points
|
||||
+ duplicate_exposure_points
|
||||
+ cash_relief_points
|
||||
+ weakness_points
|
||||
+ overweight_points
|
||||
+ liquidity_points
|
||||
- tax_penalty_points
|
||||
- core_quality_protection_points
|
||||
, 0), 100)
|
||||
components:
|
||||
hard_precedence_points:
|
||||
emergency_or_hard_stop: 50
|
||||
cash_floor_trim_required: 40
|
||||
duplicate_exposure_required: 30
|
||||
holding_diagnosis_rotate_or_trim: 20
|
||||
take_profit_rebalance: 10
|
||||
duplicate_exposure_points:
|
||||
same_sector_etf: 20
|
||||
lower_quality_duplicate: 15
|
||||
no_duplicate: 0
|
||||
cash_relief_points:
|
||||
expected_net_cash_pct_ge_3: 15
|
||||
expected_net_cash_pct_1_to_3: 10
|
||||
expected_net_cash_pct_lt_1: 3
|
||||
weakness_points:
|
||||
rw_ge_4_or_rs_laggard: 35 # RS_RATIO_V1: rs_ratio < 0.80 (시장 대비 20%+ 약세)
|
||||
rw_3_or_momentum_decel: 25
|
||||
rw_2: 8
|
||||
flow_5d_20d_negative: 15
|
||||
price_below_ma20_ma60: 10
|
||||
weakness_formula_refs: # [2026-05-19_ALPHA_SHIELD_V1] X3 rs_laggard 공식 확정
|
||||
rs_laggard:
|
||||
formula_id: "RS_RATIO_V1"
|
||||
definition: "rs_ratio = stock_5d_return / kospi_5d_return < 0.80"
|
||||
rs_leader_protection: "rs_ratio >= 1.20 -> sell_priority 후순위 보호"
|
||||
canonical_ref: "spec/13_formula_registry.yaml:formula_registry.formulas.RS_RATIO_V1"
|
||||
overweight_points:
|
||||
above_target_by_5p_or_more: 12
|
||||
above_target_by_2_to_5p: 6
|
||||
within_band: 0
|
||||
liquidity_points:
|
||||
avg_trade_value_sufficient: 5
|
||||
low_liquidity: -10
|
||||
tax_penalty_points:
|
||||
high_tax_or_fee_drag: 10
|
||||
unknown_tax_cost: 3
|
||||
tax_loss_harvest_available: -5
|
||||
core_quality_protection_points:
|
||||
direct_core_leader_in_valid_uptrend: 20
|
||||
A_core_or_CSCs_ge_85: 12
|
||||
satellite_or_etf: 0
|
||||
tie_breakers:
|
||||
1: "더 높은 hard_precedence 단계"
|
||||
2: "Sell_Priority_Score 높은 후보"
|
||||
3: "cash_floor 개선 효과가 큰 후보"
|
||||
4: "중복노출 해소 효과가 큰 후보"
|
||||
5: "current_holdings_score 낮은 후보"
|
||||
6: "세후 비용이 낮은 후보"
|
||||
7: "유동성이 충분해 지정가 체결 가능성이 높은 후보"
|
||||
account_priority:
|
||||
principle: "계좌별 세금·한도·출금 가능성을 고려하되, hard stop 손절을 세금 이유로 지연하지 않는다."
|
||||
taxable_account: "세금비용이 크면 동일 우선순위 내에서 후순위. 단, 손절·hard stop은 예외."
|
||||
isa: "비과세/분리과세 한도와 납입 여력 확인 후 리밸런싱 후보 우선 가능."
|
||||
pension: "장기 코어·해외ETF 성격은 보호. 위성·중복 ETF만 우선 축소."
|
||||
output_required:
|
||||
table: "sell_priority_decision_table"
|
||||
columns: ["우선순위", "계좌", "종목명", "현재보유수량", "매도가능검산", "매도유형", "우선순위단계", "Sell_Priority_Score", "예상순현금", "세금/비용", "execution_style", "immediate_sell_qty", "rebound_wait_qty", "max_daily_qty", "매도사유", "보류사유", "다음확인사항"]
|
||||
smart_cash_raise_execution: # [2026-05-20_APEX_V1] 현금확보 매도 품질 하네스
|
||||
purpose: >
|
||||
현금 부족 해소 목적의 매도를 단순 우선순위 정렬에서 끝내지 않고,
|
||||
과매도 반등 대기·분산 위험 즉시 감축·수익보호 감축·체결 품질 제한까지 연결한다.
|
||||
formula_refs:
|
||||
cash_raise_plan: "spec/13b_harness_formulas.yaml:SMART_CASH_RAISE_PLAN_V1"
|
||||
rebound_trigger: "spec/13b_harness_formulas.yaml:REBOUND_SELL_TRIGGER_V1"
|
||||
sell_quantity_allocator: "spec/13b_harness_formulas.yaml:SELL_QUANTITY_ALLOCATOR_V1"
|
||||
execution_quality: "spec/13b_harness_formulas.yaml:EXECUTION_QUALITY_GUARD_V1"
|
||||
execution_styles:
|
||||
URGENT_LIQUIDITY_TRIM:
|
||||
trigger: "cash_floor_status=HARD_BLOCK AND rsi14>=35 AND bb_position>=20"
|
||||
rule: "sell_priority rank 순서대로 immediate_sell_qty 배정. 단일 종목 일괄 전량 금지."
|
||||
OVERSOLD_REBOUND_SELL:
|
||||
trigger: "rsi14<35 OR bb_position<20 OR close < ma20 - 8%"
|
||||
rule: "즉시 매도는 cap 이하. 잔여는 rebound_wait_qty로 분리하고 REBOUND_SELL_TRIGGER_V1 충족 시 실행."
|
||||
DISTRIBUTION_EXIT:
|
||||
trigger: "distribution_risk_score>=70"
|
||||
rule: "반등 대기보다 감축 우선. 단 시장가 전량 매도와 불리한 추격 정정 금지."
|
||||
PROFIT_PROTECT_TRIM:
|
||||
trigger: "profit_preservation_state IN [PROFIT_LOCK_20, PROFIT_LOCK_30]"
|
||||
rule: "수익 포지션 일부 이익잠금. secular_leader_gate_active=true이면 하네스 defer 상태 우선."
|
||||
quantity_policy:
|
||||
allocator: "SELL_QUANTITY_ALLOCATOR_V1"
|
||||
immediate_qty_cap_default_pct: 25
|
||||
max_daily_qty_default_pct: 50
|
||||
rebound_wait_required_when: "execution_style=OVERSOLD_REBOUND_SELL"
|
||||
prohibition:
|
||||
- "현금 부족을 이유로 과매도 후보를 전량 즉시 매도 금지"
|
||||
- "rebound_wait_qty를 LLM이 immediate_sell_qty로 이동 금지"
|
||||
- "execution_quality_status != PASS인 행을 HTS 주문표 PASS로 출력 금지"
|
||||
- "코어 주도주 직접보유는 tier 1~8 후보 소진 전 현금확보 1순위 금지"
|
||||
prohibition:
|
||||
- "보유수량 미확인 상태에서 Sell_Priority_Score가 높아도 매도수량 숫자 출력 금지"
|
||||
- "세금 최적화를 이유로 hard stop·cash_floor hard stop 매도를 지연 금지"
|
||||
- "주도주 직접보유를 중복 ETF보다 먼저 매도하려면 hard stop 또는 명확한 thesis 훼손 근거 필요"
|
||||
- "매도 우선순위를 산문으로만 설명하고 표를 생략 금지"
|
||||
- "sell_priority_decision_table 없이 복수 매도 후보 중 특정 종목 수량을 확정 금지"
|
||||
# ── 현재 시장 국면 주도 섹터 종목 TRIM 방어 규칙 ────────────────────────────
|
||||
# 배경: REGIME_TRIM_50 등 현금 확보 목적 매도 시 sell_priority_engine을 거치지 않으면
|
||||
# 시장 주도 섹터 직접보유 종목(SK하이닉스 등)이 잘못 1순위로 선택되는 오류 발생.
|
||||
regime_leading_sector_protection:
|
||||
rule: >
|
||||
현재 market_regime_state가 LEADER_CONCENTRATION 또는 SECULAR_LEADER_RISK_ON이고
|
||||
sector_flow Rotation_Rank 1~2위 섹터의 직접보유 종목은
|
||||
현금 확보 목적 매도(REGIME_TRIM_50·cash_floor_raise)에서 sell_priority tier=9(마지막) 고정.
|
||||
override_conditions_all_required:
|
||||
- "해당 종목에 hard_stop(EXIT_100·TRAILING_STOP_BREACH) 발동"
|
||||
- "OR thesis 훼손 명시: 실적 하향·외국인+기관 20D 동반 순매도·MA20+MA60 동시 이탈"
|
||||
- "OR tier 1~8 후보가 모두 소진되어 남은 선택지가 없음"
|
||||
gas_check: >
|
||||
runSellPriority() 결과에서 해당 종목이 tier=9로 표시되는지 확인.
|
||||
tier=9가 아닌 상위 순위로 나타나면 calcSellPriorityScore_() 입력 데이터 오류.
|
||||
prohibition:
|
||||
- "현재 장 주도 섹터(반도체·AI전력 등) 직접보유를 '수익이 있어서' 이유로 1차 매도 선정 금지"
|
||||
- "ETF 중복노출(KODEX 반도체·TIGER AI전력기기) 미확인 상태에서 코어주도주 TRIM 금지"
|
||||
- "sell_priority_table 출력 전 '주도주를 먼저 팔자'는 판단 표현 금지"
|
||||
duplicate_exposure_rule:
|
||||
calculation: "반도체 실질노출 = 삼성전자 직접비중 + SK하이닉스 직접비중 + 반도체 ETF × ETF 반도체 순도"
|
||||
funding_order: ["①중복 섹터 ETF", "②20D 수급 이탈·20일선 하회 위성", "③동일 섹터 내 후순위", "④시장지배 코어 직접보유 (마지막)"]
|
||||
leader_quality_switch: # [proposal_86 / 2026-05-16] ETF→반도체 주도주 직접 전환 가속
|
||||
purpose: >
|
||||
SECULAR_LEADER_RISK_ON 국면에서 반도체 ETF 성과가 직접 주도주 대비 열위일 때
|
||||
ETF 비중을 감축하고 직접 주도주로 노출 품질을 높인다.
|
||||
etf_staged_reduction(proposal_58)과 병행 가능. 이 규칙이 우선 발동 트리거 역할.
|
||||
trigger_required_all:
|
||||
- "market_regime_state == SECULAR_LEADER_RISK_ON"
|
||||
- "same_sector_etf_weight_pct > 0 (반도체 ETF 보유 중)"
|
||||
- "삼성전자 OR SK하이닉스 중 1개 이상이 SECULAR_LEADER_RISK_ON 조건 통과"
|
||||
- "ETF Ret10D <= 직접 주도주(삼성전자 OR SK하이닉스) Ret10D - 3%p"
|
||||
action:
|
||||
step_1: "ETF 30~50% 감축 검토 (etf_staged_reduction.step_1과 동일 규칙 적용)"
|
||||
step_2: "감축 대금은 동일일 즉시 전량 투입 금지. 2거래일 이내 대기."
|
||||
step_3: "2거래일 이내 주도주 staged_entry_v2 stage_1 OR stage_2 조건 충족 시 전환 매수 실행"
|
||||
prohibition:
|
||||
- "ETF 매도대금으로 anti_climax_buy_gate 미통과 주도주 추격매수 금지"
|
||||
- "ETF 감축 후 semiconductor_total_cap 초과 직접매수 금지"
|
||||
- "SECULAR_LEADER_RISK_ON 비활성 시 이 규칙 적용 금지 — etf_staged_reduction만 사용"
|
||||
- "ETF 성과 비교 데이터 미확인 시 트리거 발동 금지"
|
||||
output_table:
|
||||
columns:
|
||||
- "ETF종목명"
|
||||
- "ETF_Ret10D(%)"
|
||||
- "직접주도주_Ret10D(%)"
|
||||
- "차이(%p)"
|
||||
- "감축검토수량"
|
||||
- "전환대상주도주"
|
||||
- "전환실행예정일"
|
||||
|
||||
etf_staged_reduction: # [proposal_58 / 2026-05-15] ETF-개별주 중복 노출 단계적 감축
|
||||
purpose: >
|
||||
ETF-개별주 중복 노출 발생 시 즉각 전량 청산이 아닌 단계적 감축으로
|
||||
추세 지속 기회비용 손실과 중복 리스크를 동시에 관리한다.
|
||||
trigger: >
|
||||
duplicate_exposure_rule 발동 조건 충족:
|
||||
동일 섹터 ETF + 개별주 동시 보유 비중이 총자산 대비 20%p 이상
|
||||
step_1_immediate_reduction:
|
||||
action: "ETF 보유수량의 50% 즉시 매도 (지정가, 당일 장중)"
|
||||
rationale: "중복 노출 절반 즉시 해소. 개별주로의 집중 시작."
|
||||
order_type: "지정가 — 전일종가 -0.5% 이하 호가 우선. 시장가 금지."
|
||||
prohibition:
|
||||
- "패닉 시장가 전량 매도 금지"
|
||||
- "ETF를 매도하기 전 개별주 비중이 총자산 15% 미만인 경우 step_1 연기 가능"
|
||||
step_2_sector_trend_check:
|
||||
timing: "step_1 실행 후 2~5거래일 대기"
|
||||
conditions:
|
||||
continue_reduction:
|
||||
description: "잔여 50% 추가 매도 진행 조건"
|
||||
criteria:
|
||||
- "sector_flow.Rotation_Score 해당 섹터 순위가 3위 이하로 하락"
|
||||
- "주도섹터 ETF(대표지수) 대비 해당 ETF Ret10D <= -3%p"
|
||||
- "daily_leader_scan에서 해당 섹터 C5=0 (섹터 주도 상실)"
|
||||
action: "잔여 50% 매도. 섹터 ETF 포지션 완전 청산."
|
||||
hold_remainder:
|
||||
description: "잔여 50% 유지 조건"
|
||||
criteria:
|
||||
- "sector_flow.Rotation_Score 해당 섹터 순위 1~2위 유지"
|
||||
- "Ret10D_ETF >= 주도섹터ETF Ret10D -2%p 이내"
|
||||
- "daily_leader_scan에서 해당 섹터 C5=1 유지"
|
||||
action: >
|
||||
잔여 50% 30거래일 추가 보유. 30거래일 후 step_2 재점검.
|
||||
개별주 비중이 총자산 25% 이상 확대된 시점에 자동 매도 전환.
|
||||
step_3_full_exit_trigger:
|
||||
description: "단계 관계없이 즉시 전량 매도하는 비상 조건"
|
||||
conditions:
|
||||
- "해당 ETF ATR20_Status=DATA_MISSING AND 2거래일 이상 지속"
|
||||
- "섹터 crash_intraday_protocol tier_B 이상 발동"
|
||||
- "weekly_circuit_breaker.circuit_break 발동"
|
||||
- "portfolio_hard_stop_procedure 발동"
|
||||
action: "전량 지정가 분할 매도. 1거래일 내 완료."
|
||||
output_table:
|
||||
columns:
|
||||
- "ETF종목명"
|
||||
- "현재보유수량"
|
||||
- "1단계매도수량"
|
||||
- "잔여수량"
|
||||
- "섹터추세판정"
|
||||
- "2단계처리방향"
|
||||
- "완전청산예상일"
|
||||
prohibition:
|
||||
- "step_1 실행 없이 step_2로 바로 진행 금지 — 50% 우선 감축은 필수"
|
||||
- "ETF 매도 후 동일 섹터 다른 ETF 즉시 매수로 대체 금지 (중복 재발)"
|
||||
- "개별주 미확보 상태에서 ETF 전량 청산 금지 — 섹터 노출 완전 소멸 방지"
|
||||
target_allocation_structure: # [proposal_55 / 2026-05-15] 3-버킷 목표 운영 구조
|
||||
purpose: >
|
||||
포트폴리오 운영 목표 비중을 3개 버킷으로 명시.
|
||||
실제 비중이 목표 밴드를 벗어나면 리밸런싱 신호 발생.
|
||||
각 버킷은 기존 규칙(special_exception·cash_floor·sector_cap)에 우선하지 않는다.
|
||||
목표 구조는 방향성 지침이며, 기존 risk_block이 항상 우선한다.
|
||||
buckets:
|
||||
core_bucket:
|
||||
label: "코어 (Core)"
|
||||
target_pct: 65
|
||||
band: "60~72%"
|
||||
definition: >
|
||||
CSCS >= 70 종목 또는 special_exception 대상.
|
||||
삼성전자·SK하이닉스·방산·조선 대장주·전력기기 주도주.
|
||||
60거래일 이상 보유 목표.
|
||||
rebalancing_trigger:
|
||||
trim: "코어 합산 비중 > 72% → 초과분 부분 익절 검토 (take_profit.rebalancing_trim 준용)"
|
||||
add: "코어 합산 비중 < 60% AND orbit_state != unrealistic → A등급 코어 추가매수 검토"
|
||||
prohibition:
|
||||
- "코어 버킷 확대를 이유로 위성·현금 버킷 한도 이하로 압박 금지"
|
||||
tactical_satellite_bucket:
|
||||
label: "전술 위성 (Tactical Satellite)"
|
||||
target_pct: 20
|
||||
band: "10~25%"
|
||||
definition: >
|
||||
CSCS < 70 종목. staged_entry_v2 탐색매수→확인매수→주력편입 대상.
|
||||
평균 보유 목표 20~60거래일.
|
||||
이 버킷이 수익률 엔진이다. 목표 구조 내에서 최대 25%까지 허용.
|
||||
rebalancing_trigger:
|
||||
trim: "위성 합산 비중 > 25% → relative_weakness_exit 점수 높은 종목부터 감축"
|
||||
add: "위성 합산 비중 < 10% AND daily_leader_scan 탐색 후보 존재 → 탐색매수 1건 검토"
|
||||
concentration_rule: "단일 위성 종목 최대 7% (stock_model.core_satellite_rule.max_weight 준수)"
|
||||
cash_fc_bucket:
|
||||
label: "현금 + 탐색 실패 허용 예산 (Cash + FC)"
|
||||
target_pct: 15
|
||||
band: "10~22% (MRS 연동 가변)"
|
||||
definition: >
|
||||
즉시 인출 가능 현금 + D+2 추정현금성자산.
|
||||
MRS 기반 목표현금(market_risk_score_based_cash) + FC 예산(explore_loss_budget) 합산.
|
||||
강한 상승장(MRS=0): 하한 10%. 리스크 이벤트(MRS=8~10): 상한 22%.
|
||||
fc_reserve:
|
||||
formula: "FC_reserve = 총자산 × 0.025 (월 탐색 실패 허용 예산)"
|
||||
note: "FC_reserve는 현금 버킷 내 별도 슬롯. 탐색매수 손절 시 FC_reserve에서 차감."
|
||||
rebalancing_trigger:
|
||||
raise: "현금 < 10% OR MRS 기반 목표현금 > 현재 즉시현금 → 위성 부분 매도 또는 코어 익절"
|
||||
deploy: "현금 > 22% AND orbit_state=achievable → 탐색매수·확인매수 적극 집행"
|
||||
orbit_adjustment_rule: # [proposal_72 / 2026-05-15] orbit_monthly_tracker 오프셋 결과 하한 clamp
|
||||
purpose: "orbit_monthly_tracker의 cash_floor 하한 조정 오프셋이 현금 버킷을 10% 미만으로 밀어내는 것을 방지."
|
||||
clamp_rule: "최종 현금 목표 = max(orbit_adjusted_target, dynamic_cash_floor)"
|
||||
dynamic_cash_floor: # [proposal_85 / 2026-05-16] SECULAR_LEADER_RISK_ON 시 clamp 하한 7%
|
||||
secular_leader_risk_on: "7% — SECULAR_LEADER_RISK_ON 조건 전부 충족 시만 적용"
|
||||
normal: "10% — 기본값"
|
||||
event_week_or_overheated: "12~15%"
|
||||
risk_off: "15~25%"
|
||||
secular_leader_risk_on_required_all:
|
||||
- "market_regime_state == SECULAR_LEADER_RISK_ON"
|
||||
- "MRS <= 3"
|
||||
- "Total_Heat < 7%"
|
||||
secular_leader_risk_on_note: >
|
||||
normal.min_cash_ratio = 7%(cash_floor.regime_numbers.normal)와 동일한 수준.
|
||||
즉 SECULAR_LEADER_RISK_ON에서도 기존 normal 하한(7%)을 벗어나지 않는다.
|
||||
이 완화는 orbit_clamp 10%와 normal min 7% 사이의 3%p 공간을 해소하는 것.
|
||||
calculation_sequence:
|
||||
step_1: "orbit_monthly_tracker.adjustment_rules에 따라 orbit_offset(±%p) 계산"
|
||||
step_2: "MRS 기반 목표현금(market_risk_score_based_cash) + orbit_offset = orbit_adjusted_target"
|
||||
step_3: "SECULAR_LEADER_RISK_ON 조건 충족 시 dynamic_cash_floor = 7%, 미충족 시 10%"
|
||||
step_4: "orbit_adjusted_target < dynamic_cash_floor → dynamic_cash_floor로 강제 clamp"
|
||||
prohibition:
|
||||
- "D+2 추정현금성자산을 즉시현금 cash_floor 충족으로 간주 금지"
|
||||
- "SECULAR_LEADER_RISK_ON 해제 즉시 clamp 하한 10%로 복귀 (중간값 유지 금지)"
|
||||
note: "clamp 발동 시 블록 5(현금 룰 판정) 출력에 [CLAMP 발동: orbit_offset 일부 무시, floor=X%] 표기 필수."
|
||||
bucket_rebalancing_workflow:
|
||||
step_1: "매주 수요일 정기점검: 3개 버킷 현재 비중 산출"
|
||||
step_2: "MRS 산출 → cash_fc_bucket 목표 조정"
|
||||
step_3: "각 버킷 벗어남 확인 → 리밸런싱 우선순위 결정"
|
||||
step_4: "리밸런싱 방향: trim 우선(위험 낮추기) → add 이후(기회 포착)"
|
||||
priority:
|
||||
1: "cash_fc_bucket.raise가 최우선 (risk_block 준수)"
|
||||
2: "tactical_satellite_bucket.trim 두 번째"
|
||||
3: "core_bucket 조정 마지막"
|
||||
output_table:
|
||||
columns:
|
||||
- "버킷"
|
||||
- "목표비중(%)"
|
||||
- "현재비중(%)"
|
||||
- "목표밴드"
|
||||
- "이탈여부"
|
||||
- "리밸런싱 방향"
|
||||
- "즉시실행 필요"
|
||||
prohibition:
|
||||
- "목표 구조를 이유로 master_prohibitions·cash_floor·risk_block 완화 금지"
|
||||
- "코어 65% 목표를 채우기 위해 위험 코어 종목을 무리하게 매수 금지"
|
||||
- "위성 20% 목표를 채우기 위해 anti_climax_buy_gate·minimalist_buy_gate 통과 없이 진입 금지"
|
||||
orbit_state_override_rule: # [proposal_70 / 2026-05-15] orbit_state가 target_allocation_structure add 트리거보다 항상 우선
|
||||
purpose: "orbit_state_action_map이 target_allocation_structure의 add 트리거보다 항상 우선함을 명시."
|
||||
override_rule:
|
||||
unrealistic:
|
||||
condition: "orbit_state = unrealistic"
|
||||
action: "target_allocation_structure의 모든 add 트리거 무시. orbit_state_action_map.unrealistic 규칙(A등급 1건/월)이 최종 제한."
|
||||
stretch:
|
||||
condition: "orbit_state = stretch"
|
||||
action: "tactical_satellite_bucket.add 트리거 발동 시에도 orbit_state_action_map.stretch 기준(A등급만, 주 최대 3건) 내에서만 실행."
|
||||
achievable:
|
||||
condition: "orbit_state = achievable"
|
||||
action: "target_allocation_structure 버킷 트리거 정상 발동. override 없음."
|
||||
priority_order:
|
||||
"1": "orbit_state_action_map (최상위)"
|
||||
"2": "target_allocation_structure (하위 지침)"
|
||||
prohibition:
|
||||
- "orbit_state=unrealistic 상태에서 버킷 add 트리거만으로 신규 매수 집행 금지"
|
||||
- "orbit_state 확인 없이 버킷 트리거 실행 금지"
|
||||
# ── [2026-05-21_CLA_HARNESS_V1] 반도체 클러스터 상태 분리 ───────────────────
|
||||
cluster_states:
|
||||
purpose: >
|
||||
CLA(CONCENTRATED_LEADER_ADVANCE) 레짐 발동 시 반도체 클러스터의 기존보유 유지(HOLD)와
|
||||
신규추가매수(BUY)를 분리해 엔진의 '리더 팔고 위성 추가매수' 오판을 구조적으로 차단한다.
|
||||
CLUSTER_OPEN:
|
||||
description: "기본 상태 (CLA 레짐 비발동). 반도체 O2 섹터 기본 25% 상한 적용."
|
||||
trigger: "market_regime != CLA"
|
||||
new_buy_allowed: true
|
||||
cap_pct: 25
|
||||
harness_field: cluster_state
|
||||
harness_value: "CLUSTER_OPEN"
|
||||
CLUSTER_HOLD_ONLY:
|
||||
description: >
|
||||
CLA 레짐 발동 시 클러스터 상태. 기존 보유분 HOLD는 허용.
|
||||
신규 BUY는 RAG_V1=PASS AND cluster_combined_pct < 60% 조건 모두 충족 시만 허용.
|
||||
O2 25% 상한 임시 해제 — CLA 해제 시 즉시 복귀.
|
||||
trigger: "market_regime == CLA"
|
||||
hold_allowed: true
|
||||
new_buy_conditions:
|
||||
- rag_v1: PASS
|
||||
- cluster_combined_pct_max: 60
|
||||
new_buy_blocked_action: HOLD
|
||||
cap_pct: 60
|
||||
harness_field: cluster_state
|
||||
harness_value: "CLUSTER_HOLD_ONLY"
|
||||
regime_based_o2_rule:
|
||||
rule: >
|
||||
O2 반도체 섹터 상한은 cluster_state=CLUSTER_OPEN 에서 기본 25%,
|
||||
SECULAR_LEADER_RISK_ON 에서 35%, cluster_state=CLUSTER_HOLD_ONLY 에서 60%까지 적용한다.
|
||||
cluster_state=CLUSTER_HOLD_ONLY 에서는 기존 보유분이 25% 초과해도 강제매도 없음.
|
||||
신규 추가매수는 RAG_V1 통과 + 60% 상한 적용.
|
||||
original_o2: "spec/03_risk_policy.yaml:semiconductor_total_cap"
|
||||
cla_override: "CLA 발동 시 O2 적용 범위를 CLUSTER_OPEN 상태로 한정"
|
||||
prohibition:
|
||||
- "CLA 레짐에서 코어 반도체 직접보유를 현금확보 1순위로 선정 금지"
|
||||
- "cluster_state 필드 없이 반도체 종목 SELL 판단 금지"
|
||||
- "CLUSTER_HOLD_ONLY 상태를 LLM이 임의로 CLUSTER_OPEN으로 변경 금지"
|
||||
|
||||
cash_floor: # ── 구조 수정: duplicate_exposure_rule 자식(4칸) → portfolio_exposure_framework 직속(2칸) (2026-05-14)
|
||||
normal: "총자산 7~10%"
|
||||
overheated_or_event_week: "총자산 10~15%"
|
||||
risk_off: "총자산 15~25%"
|
||||
rule: >
|
||||
cash_floor는 immediate_cash + eligible_settlement_cash_d2 (즉시현금 + D+2 정산예정현금)을 현금 방어선으로 준수하되, 계좌 범위와 제한을 엄격히 적용한다.
|
||||
일반계좌의 D+2 현금은 cash_defense_eligible=true로 인정하며 일반계좌의 immediate_cash와 합산하여 방어선으로 취급한다.
|
||||
ISA/연금저축 계좌의 D+2 및 즉시현금은 일반계좌 신규매수 재원으로 합산하는 것을 금지한다.
|
||||
cash_shortfall 계산 로그에는 immediate_cash, settlement_cash_d2, restricted_cash를 명확히 분리 출력한다.
|
||||
settlement_rule: "일반계좌의 즉시현금 + D+2 정산현금을 유동성 방어선(cash_floor) 및 매수 가능 자금의 원장으로 인정한다."
|
||||
buying_power_rule: "매수가능현금 = (일반계좌 즉시현금 + D+2 정산현금) - 예약된 주문금액."
|
||||
numeric_definitions:
|
||||
settlement_cash_ratio: "D+2 정산현금 / 총자산 × 100"
|
||||
total_cash_ratio: "D+2 정산현금 / 총자산 × 100"
|
||||
buy_power_ratio: "(D+2 정산현금 - 예약된 주문금액) / 총자산 × 100"
|
||||
post_trade_total_cash_ratio: "(D+2 정산현금 - 신규매수예상금액 + 매도대금정산분) / 총자산 × 100"
|
||||
regime_numbers:
|
||||
normal:
|
||||
min_cash_ratio: 7
|
||||
target_cash_ratio: 10
|
||||
overheated_or_event_week:
|
||||
min_cash_ratio: 10
|
||||
target_cash_ratio: 15
|
||||
risk_off:
|
||||
min_cash_ratio: 15
|
||||
target_cash_ratio: 25
|
||||
rebalancing_formula:
|
||||
buy_allowed_when: "buy_power_ratio >= target_cash_ratio + rebalancing_buy_ratio AND post_trade_total_cash_ratio >= min_cash_ratio"
|
||||
trim_required_when: "post_trade_total_cash_ratio < min_cash_ratio OR buy_power_ratio < rebalancing_buy_ratio"
|
||||
policy_event_week_escalation:
|
||||
base_condition: "미중 정상회담·FOMC·CPI/PCE·고용·금통위·지정학 이벤트가 해당 주에 예정됨"
|
||||
raise_to_12pct_if_any: ["USD/KRW 1450원 초과", "VIX 18 초과", "KOSPI/KOSDAQ 장중 고점 대비 -2% 이상", "SOXX -4% 이상 하락", "외국인 KOSPI 일간 순매도 1조원 이상 또는 5D 누적 순매도"]
|
||||
raise_to_15pct_if_any: ["USD/KRW 1500원 돌파", "VIX 25 이상", "정책 이벤트 결과가 관세·희토류·반도체 규제·호르무즈 중 2개 이상 악화", "KOSPI 20일선 종가 이탈"]
|
||||
execution_priority: ["중복 ETF", "손실 중 약한 위성", "유동성 낮은 테마 ETF", "코어 직접보유"]
|
||||
required_output: ["현재 즉시현금비중", "D+2 추정현금성자산", "매수가능현금", "목표 즉시현금비중", "리밸런싱 후 최소 즉시현금비중", "추가 필요 현금", "매도 후보별 예상 순현금", "실행 후 즉시현금비중"]
|
||||
|
||||
|
||||
# ── [2026-05-18_ROUTING_OPTIMIZATION_V1] 팩터 과집중 수치 임계치 ─────────────
|
||||
# 배경: 포트폴리오.yaml 원칙에 "고베타·고모멘텀 과집중 차단"이 추가됐으나
|
||||
# "얼마가 과한 것인가?"에 대한 수치 기준이 없어 AI가 주관적 판단에 의존.
|
||||
@@ -0,0 +1,16 @@
|
||||
meta:
|
||||
title: "은퇴자산포트폴리오 — 리스크 품질관리 분할 후보"
|
||||
parent_file: "spec/03_risk_policy.yaml"
|
||||
version: "2026-05-15-F8_split"
|
||||
language: "ko-KR"
|
||||
timezone: "Asia/Seoul"
|
||||
role: "canonical"
|
||||
migration_status: "canonical_split_active"
|
||||
authority_rule: "이 split 파일이 해당 섹션의 canonical source다. parent_file은 legacy compatibility index다."
|
||||
|
||||
quality_control:
|
||||
canonical_ref: "master_prohibitions P1~P5 및 hard_stops 우선. 이 섹션은 요약 보조." # [P138]
|
||||
rules:
|
||||
- "숫자·기준시각·출처 없는 추천 금지"
|
||||
- "현금 확보는 시장지배 코어보다 중복 ETF와 약한 위성부터"
|
||||
- "데이터·ATR·수량 관련 금지 규칙 → master_prohibitions P2·P5 및 hard_stops 참조"
|
||||
@@ -0,0 +1,22 @@
|
||||
meta:
|
||||
title: "은퇴자산포트폴리오 — 리스크 제어 호환 인덱스"
|
||||
parent_file: "spec/03_risk_policy.yaml"
|
||||
version: "2026-05-15-F12_index_only"
|
||||
language: "ko-KR"
|
||||
timezone: "Asia/Seoul"
|
||||
role: "compatibility_index"
|
||||
purpose: "기존 risk_control 경로를 보존하기 위한 인덱스 파일."
|
||||
|
||||
canonical_split_files:
|
||||
aggregate_risk: "spec/risk/aggregate_risk.yaml"
|
||||
circuit_breakers: "spec/risk/circuit_breakers.yaml"
|
||||
market_risk_cash: "spec/risk/market_risk_cash.yaml"
|
||||
|
||||
legacy_path_aliases:
|
||||
"spec/risk/risk_control.yaml:risk_control.aggregate_risk_cap": "spec/risk/aggregate_risk.yaml:risk_control.aggregate_risk_cap"
|
||||
"spec/risk/risk_control.yaml:risk_control.market_risk_score_based_cash": "spec/risk/market_risk_cash.yaml:risk_control.market_risk_score_based_cash"
|
||||
"spec/risk/risk_control.yaml:risk_control.weekly_circuit_breaker": "spec/risk/circuit_breakers.yaml:risk_control.weekly_circuit_breaker"
|
||||
|
||||
migration_rule:
|
||||
- "신규 참조는 canonical_split_files의 경로를 사용한다."
|
||||
- "이 파일에는 수치 임계값을 추가하지 않는다."
|
||||
Reference in New Issue
Block a user