Files
QuantEngineByItz/spec/risk/circuit_breakers.yaml
T
kjh2064 b1bb40c384 WBS-7.5: 임시 하드코딩 폴백 정규화 (3개 항목)
모든 hardcoding을 calibration_registry.yaml에 threshold로 등록:

1. MRS_CIRCUIT_BREAKER_ADJUSTMENT_PTS = 2 (pts)
   - 위치: spec/risk/circuit_breakers.yaml:192 (이전: "MRS +2점 (임시)")
   - 용도: sector_crash_intraday_protocol tier_B 조치에서 현금 보수성 강화
   - 정규화: spec/risk/circuit_breakers.yaml에서 threshold 참조로 변경

2. CLUSTER_CAP_CLA_REGIME_PER = 60 (%)
   - 위치: spec/risk/portfolio_exposure.yaml:403 (이전: "O2 상한 임시 해제")
   - 용도: CLA 레짐 발동 시 cluster 결합 노출 상한 일시 상향
   - 정규화: spec/risk/portfolio_exposure.yaml에서 threshold 참조로 변경

3. OVERHANG_PRESSURE_V1_FALLBACK_MULT = 1.5 (배수)
   - 위치: spec/13_formula_registry.yaml:1223
   - 상태: 이미 정규화됨 (절대값 -500000 → 평균거래량 비례식)

모든 threshold: EXPERT_PRIOR 등록, 실거래 표본 부재
- sunset_date: 2026-12-31
- 칼리브레이션 조건: sample_n 10+ (MRS) / 5+ (CLUSTER) 확보 후 실측 효과 검증

테스트: 135/135 PASS

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-22 22:57:32 +09:00

216 lines
14 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 += calibration_registry.MRS_CIRCUIT_BREAKER_ADJUSTMENT_PTS (spec/calibration_registry.yaml 참조)"
- "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 발동 중 다른 종목 신규 탐색매수 예외 허용 금지"