Files
QuantEngineByItz/spec/05_position_sizing.yaml
T

392 lines
27 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: "RetirementAssetPortfolio.yaml"
version: "2026-05-16-F3_kosdaq_strict"
language: "ko-KR"
timezone: "Asia/Seoul"
has_code_implementation: true
code_path: "src/quant_engine/compute_formula_outputs.py"
purpose: "메인 manifest에서 로드되는 구조화 규칙 명세 파일."
position_sizing:
sequence: ["BUY_PERMISSION_MATRIX_V1", "계좌별 투자 가능 현금", "목표비중", "변동성 조정", "손절가 기준 손실허용액", "유동성 상한", "정수 수량", "매수금액=지정가×수량", "잔여 현금 이월"]
pre_permission_gate: # [2026-05-20_APEX_V1] POSITION_SIZE_V1 선행 허가 매트릭스
purpose: >
정수 매수수량을 계산하기 전에 현금·Total Heat·선행 알파·돌파 확인·설거지 위험·기대우위를
하나의 하네스 상태로 잠근다. 이 게이트가 BLOCKED/WATCH이면 POSITION_SIZE_V1을 호출해도
final_qty는 null 또는 0주 관찰만 허용한다.
formula_ref: "spec/13b_harness_formulas.yaml:BUY_PERMISSION_MATRIX_V1"
required_inputs:
- "cash_floor_status"
- "heat_gate_status"
- "alpha_lead_score"
- "follow_through_state"
- "distribution_risk_score"
- "expected_edge"
states:
ALLOW_PILOT: "선행 파일럿만 허용. max_tranche_pct 20~30."
ALLOW_ADD_ON: "FOLLOW_THROUGH_CONFIRM_V1 확인 후 본진입/증액 허용."
WATCH: "조건 대기. 수량 산출 금지."
BLOCKED: "매수 차단. 수량 산출 금지."
hard_rules:
- "cash_floor_status != PASS → BLOCKED"
- "heat_gate_status=BLOCK_NEW_BUY → BLOCKED"
- "distribution_risk_score >= 55 → WATCH 또는 BLOCKED"
- "alpha_lead_score < 75 AND follow_through_state != CONFIRMED_ADD_ON → WATCH"
- "expected_edge floor 미달 → BLOCKED"
output_contract:
buy_permission_json: "종목별 buy_permission_state, max_tranche_pct, blocked_reason_codes"
buy_qty_inputs_json: "buy_permission_state가 ALLOW_*가 아니면 final_qty=null"
prohibition:
- "BUY_PERMISSION_MATRIX_V1 미출력 상태에서 POSITION_SIZE_V1만으로 신규 BUY 수량 확정 금지"
- "설거지 차단(BLOCK_BUY)을 시장 해설·뉴스로 완화 금지"
- "ALLOW_PILOT 상태에서 계획수량 30% 초과 금지"
volatility_targeting:
formula: "수량 = floor((총투자자산 × risk_budget) / (20일 ATR × atr_multiplier))"
default: {risk_budget: 0.007, atr_multiplier: 1.5}
risk_budget_note: "0.007은 base값. 수량 산출 전 반드시 cascade_risk_budget_rule 적용 후 최종값 사용. bayesian_confidence.application_order 선행 필수."
requirements:
- "20일 ATR·지정가·총투자자산이 모두 확인된 경우에만 정수 수량 산출."
- "20일 ATR이 [데이터누락]이면 매수수량 0주 처리."
- "산출 수량은 계좌별 현금·목표비중·섹터한도 중 최솟값으로 재삭감."
- "ATR 화면값이 장중 지연값인지 종가 기준인지 불명확하면 정수 수량 산출 불가."
liquidity_constraint:
cap:
core_large_cap: "1회 주문금액은 최근 5거래일 평균 거래대금의 1.0% 이하"
normal_core: "0.5% 이하"
satellite: "0.25~0.5% 이하"
etf: "1.0% 이하. 괴리율·스프레드 미확인 시 0.5% 이하."
final_quantity_rule: "최종수량 = min(ATR수량, 현금한도수량, 목표비중한도수량, 섹터한도수량, 유동성상한수량)"
split_order: "산출 주문금액이 유동성 상한의 50% 초과 시 최소 2회 분할."
execution_quality_guard: # [2026-05-20_APEX_V1]
formula_ref: "spec/13b_harness_formulas.yaml:EXECUTION_QUALITY_GUARD_V1"
rule: >
매수·매도 모두 주문금액이 avg_trade_value_5d의 1%를 초과하면 분할 필요,
3%를 초과하면 HTS 단일 주문 PASS 금지. 스프레드·호가단위·장중변동성 검증 실패 시
validation_status=EXECUTION_QUALITY_BLOCKED.
output_required:
- "execution_quality_status"
- "split_count"
- "child_order_amount_krw"
- "hts_allowed"
prohibition:
- "execution_quality_status!=PASS인데 HTS 주문표 PASS 금지"
- "시장가 주문 금지. 비상 예외는 하네스 reason_code 필요"
bayesian_confidence:
base_prior: "데이터가 완전하지 않으면 기본 확률 중립 이하. prior 상향은 데이터 완성도 기준으로만. → master_prohibitions.P3"
multiplier:
high_confidence: "핵심 필드 모두 OK + 최근 30건 신호 net_expectancy > 0 → risk_budget 1.0배"
medium_confidence: "핵심 필드 1개 PARTIAL 또는 성과검증 30건 미만 → 0.5배"
low_confidence: "핵심 필드 2개 이상 PARTIAL/DATA_MISSING → 0.25배"
no_bet: "ATR20 미확인, Flow_Rows<5, DART_Risk 존재, 상장 리스크, 기대값<=0 → 0주"
application_order: "volatility_targeting 수량 산출 전 risk_budget에 multiplier 먼저 곱한다."
performance_brake: # regime_reset은 아래 완전 버전 하나만 유지 (중복 제거)
rule: "계좌 총자산이 3거래일 연속 하락하거나 최근 5건 매매 승률이 40% 미만 시, 목표 risk_budget을 절반(예: 0.007 → 0.0035)으로 삭감하여 파산확률을 원천 차단한다."
scope: "price-flow 불일치(kelly.brake_conditions)와는 독립적인 성과 기반 감액 트리거."
reset_condition: "계좌 총자산 3거래일 연속 회복 AND 연속 5건 매매 승률 50% 이상 복귀 시 risk_budget 단계적 원복. 전액 즉시 복구 금지 — +25%p씩 최대 2회에 걸쳐 순차 복귀."
equity_curve_protection: # [2026-05-19_ALPHA_SHIELD_APEX_V2] ECP001
rule: "총자산 곡선이 10일 이동평균선(total_asset_ma10)을 하회할 경우, 시스템 전체 base_risk_budget을 50% 즉시 삭감(0.007 → 0.0035)한다."
priority: "최상위 리스크 브레이크. 다른 모든 multiplier 적용 전 base 삭감."
rationale: "개별 종목 승률과 무관하게 계좌 전체 추세가 꺾이면 리스크 노출을 물리적으로 축소."
regime_reset:
rule: "시장 국면 전환(KOSPI 20일선 이탈 또는 VIX 25 돌파) 시, 기존 모든 confidence multiplier를 0.5x~0.7x로 강제 리셋하고 신규 데이터 5건 확인 전까지 유예한다."
recovery_condition: "KOSPI 20일선 안정 회복 AND VIX 18 이하 하락 AND 신규 성과 데이터 5건 이상 확인 후 multiplier 원복 검토 (performance_brake 동일 단계 원복 규칙 준용)."
prohibition: ["필요수익률 높다는 이유로 multiplier 상향 금지", "뉴스·테마·목표가만으로 high_confidence 부여 금지", "성과검증 표 없으면 high_confidence 금지"]
# [P_B / 2026-05-15] Net-R 피드백 루프 — performance_evidence 결과가 risk_budget으로 직접 환류하는
# 명시적 경로 부재로 A등급 금지 시에도 risk_budget 0.007 full 산출 가능한 공백 해소.
net_return_feedback:
source: "performance_evidence.pass_fail — net_expectancy 및 downgrade_rule 결과"
rule_1:
condition: "최근 20건 net_expectancy <= 0 (비용차감 후 기대값 0 이하)"
action: "bayesian_multiplier를 medium_confidence(0.5x) 강제 적용. high_confidence 부여 금지."
note: "performance_evidence.pass_fail.downgrade_rule(A등급 금지)과 중첩 적용."
rule_2:
condition: "최근 30건 net_expectancy <= -2%p"
action: >
base_risk_budget 0.007 → 0.003 강제 삭감.
performance_evidence.pass_fail.retire_rule 발동과 동시에 적용.
해당 신호 타입(섹터·진입 패턴)을 표에 명시하고 LLM 보고서에 RETIRE 표시.
reset_condition: >
최근 5건 net_expectancy > 0 회복 후 performance_brake.reset_condition과 동일한
단계적 원복 규칙 준용 (+25%p씩 최대 2회). 즉각 0.007 복귀 금지.
output_required:
- "net_return_feedback 상태: NORMAL / CAUTION(rule_1) / REDUCED(rule_2) / RETIRE"
- "현재 유효 base_risk_budget 값"
- "rule_2 발동 시 해당 신호 타입 명시"
prohibition:
- "net_expectancy 미산출(거래 20건 미만) 상태에서 이 규칙 적용 금지 — NORMAL로 간주"
- "→ master_prohibitions.P3 전역 적용 (REDUCED 상태 원복 포함)"
kelly:
status: "brake_only"
purpose: >
과유불급. 부정확한 승률 W 기반 증액은 파산 가속기다.
켈리는 오직 가격-수급 불일치 돌발 상황에서 ATR 수량을 절반으로 깎는 브레이크로만 사용한다.
increase_allowed: false
brake_conditions:
- "가격-수급 불일치: Close 5거래일 연속 하락이나 Frg_5D 또는 Inst_5D만 기계적 순매수 증가"
- "flow_credit < 0.40 AND 주가 추세 하락 이탈 동시 성립 (flow_credit 정의: quant_feed_contract.investor_flow_rules.active_quality_gate.formula 참조)"
action: "brake_conditions 해당 시 volatility_targeting ATR수량의 50% 강제 감액 (Half-Brake). 조건 해소 확인 전 원복 금지."
prohibition:
- "Kelly 공식으로 risk_budget 증액 금지"
- "승률 W 단독 추정으로 배팅 계산 금지"
- "→ master_prohibitions.P3 전역 적용 (kelly brake 해제 포함)"
# [Q1 / 2026-05-15] risk_budget 범위 표현이 cascade 기본값(0.007=0.7%)과 겉으로 충돌해
# LLM이 상한(1.2%=0.012)을 기본값으로 오산출하는 할루시네이션 방지.
risk_budget:
base: 0.007 # 총자산의 0.7% — cascade_risk_budget_rule의 base_risk_budget과 동일
ceiling: 0.012 # 총자산의 1.2% — CSCS >= 90 AND bayesian high_confidence 경우에만 허용
floor: 0.001 # cascade_risk_budget_rule.floor 참조. 미만이면 no_bet(0주)
canonical_formula: "cascade_risk_budget_rule을 거친 final값이 실제 적용값. 이 범위는 참고 상한/하한만."
prohibition: "base(0.007) 무시하고 ceiling(0.012) 직접 사용 금지. 반드시 cascade_risk_budget_rule 통과 후 결정."
cascade_risk_budget_rule:
purpose: >
kelly Half-Brake × Bayesian 감액이 동시 발동할 때 실제 risk_budget을 명시한다.
미문서화 상태에서 0주 또는 근사 0주 산출이 반복되는 것을 방지한다.
step_1_base: "base_risk_budget = volatility_targeting.default.risk_budget (0.007)"
step_2_bayesian: "bayesian_adjusted = base × bayesian_confidence_multiplier # high:×1.0 / medium:×0.5 / low:×0.25 / no_bet:0주"
step_3_kelly: "final = bayesian_adjusted × 0.50 # kelly Half-Brake 발동 시에만 적용"
worst_case_examples:
high_confidence_kelly_brake: "0.007 × 1.0 × 0.50 = 0.0035"
low_confidence_kelly_brake: "0.007 × 0.25 × 0.50 = 0.000875 → floor 적용으로 no_bet 처리"
floor:
min_risk_budget: 0.001
action: "산출된 final < 0.001 이면 수량=0주(no_bet). 0.001로 올려 강제 진입 금지."
no_bet_override: "bayesian_confidence_multiplier=0(no_bet 등급)이면 연쇄 감액 계산 무관하게 수량=0주 강제."
# [Q6 / 2026-05-15] performance_brake·regime_reset·net_return_feedback 3개 규칙이
# 동시 발동 시 처리 순서 없어 연쇄 삭감(0.007×0.5×0.5×0.5=0.000875 → 0주)으로
# 좀비 상태 지속되는 공백 해소.
simultaneous_trigger_rule:
purpose: "cascade 외부 성과 기반 규칙(performance_brake·regime_reset·net_return_feedback·equity_curve_protection)이 동시 발동 시 처리 기준."
rule: >
세 규칙은 각각 독립적으로 base_risk_budget을 조정한다.
단, 최종 조정 결과는 cascade_risk_budget_rule의 step_1→step_2→step_3 순서를 따르며,
외부 규칙들은 step_1의 base_risk_budget 입력값만 변경한다.
priority_order:
1: "equity_curve_protection: 자산 MA10 하회 시 base 0.007 → 0.0035 선제 삭감 (ECP001)"
2: "net_return_feedback (rule_2 발동 시): base를 0.0035 또는 0.007 → 0.003 강제 삭감"
3: "performance_brake (발동 시): 현재 결과의 50% 추가 삭감"
4: "regime_reset (발동 시): 결과에 multiplier 0.5x~0.7x 적용"
deduplication: "동일 규칙이 여러 차례 발동해도 해당 step은 1회만 적용. 중복 삭감 금지."
floor_check: "모든 단계 적용 후 final < 0.001이면 no_bet(0주). 강제 진입 금지."
recovery:
rule: "세 규칙 각각의 reset_condition이 충족되는 순서대로 단계별 원복."
example: "net_return_feedback 먼저 reset → base 0.003 → 0.007. performance_brake reset → 50% 삭감 해제."
execution_cost_gate:
required: ["왕복수수료", "거래세 또는 세금효과", "예상 호가스프레드", "예상 슬리피지"]
default_slippage: {core_large_cap: "0.10%", normal_core: "0.20%", satellite: "0.30~0.50%", thin_liquidity: "0.70% 이상 또는 신규매수 금지"}
net_rr_rule: "비용 차감 후 기대수익비 2:1 미만이면 A등급 금지."
designated_price_calc:
buy:
math: "지정가 = 진입희망가 + (ATR20 × 0.05)"
purpose: "호가 우선 체결을 위한 소폭 상향 보정. ATR20 미확인 시 사용 금지."
sell:
math: "지정가 = 목표가 - (세금+수수료율 합산) - (ATR20 × 0.05)"
purpose: "비용 선반영 실질 익절가 산출. HTS 입력 기준값."
on_atr_missing:
buy: "희망가 그대로 사용. [ATR보정불가] 표기."
sell: "목표가 그대로 사용. [ATR보정불가] 표기."
prohibition: "ATR20=DATA_MISSING 상태에서 이 공식 산출값을 [계산값]으로 표기 금지."
correlation_check:
default_sector_cap: 25
benchmark_core_sector_cap: {normal: "벤치마크 중립비중 + 10%p", risk_on_earnings: "벤치마크 + 15%p, 총자산 65% 초과 금지", risk_off: "벤치마크 중립비중 또는 총자산 50% 중 낮은 값"}
exception: "삼성전자·SK하이닉스는 special_exception.kospi_semiconductor_leadership, 반도체 ETF는 duplicate_exposure_rule 우선."
zero_share: "0주 산출 시 관찰"
# [proposal_92 / 2026-05-16] 코스닥 종목 비중 상한 별도 설정
kosdaq_weight_cap:
purpose: "코스닥 종목은 유동성·변동성·구조적 리스크가 코스피보다 높으므로 단일 비중 상한을 별도 적용."
single_stock_max:
kosdaq_satellite: "총자산 5% — 코스피 위성 7% 대비 -2%p"
kosdaq_core: "총자산 10% — 코스닥 종목은 코어 편입 후에도 코스피 general core(18%) 상한 미적용"
aggregate_cap:
rule: "코스닥 종목 합산(코어+위성) 총자산 20% 이하 유지"
exception: "삼성전자·SK하이닉스는 코스피 종목이므로 이 캡 미적용"
action: "초과 시 신규 코스닥 매수 전면 중단. 기존 포지션 손절·익절 실행은 허용."
staged_entry_size_adjustment:
purpose: "staged_entry_v2의 코스닥 종목 단계별 투입 비중을 코스피보다 보수적으로 설정"
stage_1_explore: "코스닥 종목: 총자산 0.3~0.5% (코스피 0.5~1.0% 대비 절반 수준)"
stage_2_confirm: "코스닥 종목: 총자산 0.8~1.5% (코스피 1.5~3.0% 대비 절반 수준)"
stage_3_core_load: "코스닥 종목: 총자산 2.0~4.0% (코스피 4.0~7.0% 대비 절반 수준. kosdaq_core 상한 10% 이내)"
prohibition:
- "코스닥 종목에 코스피 코어 비중 규칙(18% 상한) 적용 금지"
- "코스닥 aggregate 20% 초과 시 신규 코스닥 매수 금지"
- "코스닥 단일 종목 5% 초과를 CSCS 점수만으로 정당화 금지"
- "staged_entry_v2 실행 시 코스닥 종목에 코스피 투입 비중 그대로 사용 금지"
special_exception:
kospi_semiconductor_leadership:
principle: "삼성전자·SK하이닉스가 KOSPI를 주도하는 장세에서는 절대비중만으로 매도·매수제한을 결정하지 않는다."
benchmark_gate:
rule: "KOSPI 내 삼성전자+SK하이닉스 합산 비중 확인 후 포트폴리오 직접보유 비중과 비교."
if_missing: "벤치마크 대비 초과비중 판단 금지. 단, 손실예산·현금부족·추세이탈 기준은 적용."
samsung_electronics:
target_band: "총자산 32~42%; 주도장에서 45%까지 허용"
max_weight_soft: "45%"
hard_stop_weight: "48%"
add_buy_condition: ["비중 38% 이하", "Price_Status=PRICE_OK, Flow_OK=Y", "20일선 위 또는 눌림 후 지지 확인, 외국인 또는 기관 20D 순매수, 거래대금 급감 아님", "돌파 직후 전량매수 금지", "반도체 실질노출이 semiconductor_total_cap 이내"]
trim_condition: ["45% 초과 + 현금 7% 미만", "45% 초과 + 20일선 종가 이탈", "45% 초과 + 5D 동반 순매도", "48% 초과 시 초과분 3회 이내 분할 축소"]
no_trim_condition: ["KOSPI 주도력 유지, 20일선 위, 20D 수급 훼손 없음", "단순히 18% 초과한다는 이유"]
sk_hynix:
target_band: "총자산 8~18%; 강한 실적장세·수급 우위에서 22%까지 허용"
max_weight_soft: "22%"
hard_stop_weight: "25%"
add_buy_condition: ["Price_Status=PRICE_OK, Flow_OK=Y", "20일선 위 또는 신고가 후 눌림", "기관 또는 외국인 20D 순매수", "돌파 첫날은 시범진입만", "신규매수 후 단일종목 손실예산 1.0% 이내"]
trim_condition: ["22% 초과 + 20일선 종가 이탈", "22% 초과 + 5D 동반 순매도", "25% 초과 시 2~3회 분할 축소"]
semiconductor_total_cap:
calculation: "삼성전자 + SK하이닉스 + 반도체 ETF 실질노출"
base_cap: "총자산 60%"
risk_on_earnings_cap: "총자산 65%; 현금 7% 이상 유지"
risk_off_cap: "총자산 50%"
action_above_cap: "중복 ETF → 수급 이탈 종목 → 후순위 반도체 순서 축소. 삼성전자·SK하이닉스 직접보유는 마지막."
# [proposal_84 / 2026-05-16] 주도주 리스크 예산 계단 — offensive_risk_budget_ladder
offensive_risk_budget_ladder:
purpose: >
SECULAR_LEADER_RISK_ON 국면에서 삼성전자·SK하이닉스에 한해
staged_entry 단계별로 risk_budget을 계단형으로 상향한다.
base 0.007 → stage_2에서 0.009 → stage_3에서 0.0105.
ceiling 0.012는 어떤 경우에도 초과하지 않는다.
activation_required_all:
- "market_regime_state == SECULAR_LEADER_RISK_ON"
- "종목이 삼성전자 OR SK하이닉스"
- "CSCS >= 85"
- "bayesian_confidence == high_confidence"
- "Total_Heat < 7%"
- "post_trade_immediate_cash_ratio >= cash_floor.normal.min_cash_ratio (7%)"
- "Expected_Edge >= 1.8"
levels:
level_1_stage1:
applied_stage: "staged_entry_v2 stage_1 신규 또는 초기 진입"
risk_budget: 0.007
note: "base값 그대로. SECULAR_LEADER_RISK_ON 발동만으로 상향 없음."
level_2_stage2:
applied_stage: "staged_entry_v2 stage_2_confirm 조건 충족 시"
activation_extra:
- "stage_2 진입 조건 충족 (price +1.5% 이상 상승, C2·C4 재확인)"
- "미실현수익 양수 (현재가 > stage_1 평단가)"
risk_budget: 0.009
level_3_stage3:
applied_stage: "staged_entry_v2 stage_3_core_load 조건 충족 시"
activation_extra:
- "20일 신고가 돌파 (종가 기준)"
- "20D 수급 유지 (C4 지속)"
- "반도체 sector_flow Rotation_Score 1위"
risk_budget: 0.0105
hard_limits:
- "0.012 ceiling 초과 절대 금지 — 상한은 risk_budget.ceiling과 동일"
- "Total_Heat >= 7%이면 ladder 비활성. cascade_risk_budget_rule caution 50% 감액 우선 적용"
- "performance_brake 발동 시 ladder 비활성 (base 0.007에 50% 삭감 적용)"
- "net_return_feedback REDUCED 발동 시 ladder 비활성 (base 0.003 고정)"
- "ladder 비활성 조건 해소 전까지 level_2·level_3 미적용. level_1(0.007) 유지."
deactivation:
condition: "SECULAR_LEADER_RISK_ON 비활성화 즉시 ladder 전체 비활성. base 0.007로 복귀."
output_required:
- "보고서에 [ladder_state: ACTIVE/INACTIVE, 적용 level, risk_budget값] 표기 필수"
# [proposal_50 / 2026-05-15] 피라미딩(증액) 규칙 — pyramiding_rule
pyramiding_rule:
purpose: "이기는 종목에 증액, 지는 종목은 절대 증액 금지(물타기 금지). 수익 중 종목만 켈리 원칙에 따라 단계적 증액."
prerequisite: "staged_entry_v2 stage_2 이상 완료, 현재 미실현 수익 양수, anti_climax_buy_gate <= 1"
scale_in_rules:
first_add:
trigger: "진입가 대비 +3~+5% 도달 AND stage_2 수급 조건(C4) 유지"
size: "기존 보유수량의 20~30% 추가. 총자산 대비 합산 비중 7% 이내 유지."
method: "지정가. 현재가 기준 -0.3~-0.5% 매수. 추격매수 금지."
second_add:
trigger: "진입가 대비 +8~+10% 도달 AND C4 수급 지속 AND sector_priority_ranking Tier_1 유지"
size: "기존 보유수량의 15~20% 추가. 총자산 대비 합산 비중 10% 이내."
method: "지정가. 현재가 기준 -0.3~-0.5%."
max_add_count: "2회. 이후 추가 증액 금지."
trailing_stop_reset:
rule: "증액 후 trailing_stop 기준가를 새 평단가 기준으로 재설정. 기존 trailing_stop이 더 빡빡한 경우 기존 기준 유지."
scale_down_rules:
MA20_breach: "종가 MA20 하회 시 증액분 우선 청산. 원래 stage_1 수량만 유지."
sector_weakness: "sector_priority_ranking Tier_2 이하로 강등 시 증액분 전량 청산."
prohibition:
- "손실 중 추가매수(물타기) 절대 금지 — 진입가 대비 음수 수익률 종목 증액 금지"
- "aggregate_risk_cap 초과 증액 금지"
- "증액 후 합산 비중 total 10% 초과 금지 (special_exception 제외)"
- "소수점 수량 산출 금지. 정수 단위만."
# [proposal_54 / 2026-05-15] 탐색 실패 허용 예산(Failure Cut) — explore_loss_budget
explore_loss_budget:
purpose: >
staged_entry_v2 stage_1 탐색매수의 손절 손익은 이 FC 예산 계정에 귀속.
performance_brake·net_return_feedback 등 성과 기반 규칙에서 제외하여
탐색 실패 공포로 인한 공격 슬롯 마비를 방지한다.
budget:
formula: "monthly_FC_budget = 총자산 × 0.025 (월 2.5%)"
note: "매월 1일 초기화. 미사용 잔액은 이월 불가."
accounting_rules:
in_scope: "staged_entry_v2 stage_1 탐색 손절, staged_exit_on_stall 타임아웃 청산"
out_scope: "stage_2 이상 손절, core 손절, stop_loss 정상 발동 손절"
net_return_exclusion: "FC 귀속 손익은 net_return_feedback.rule_2 판정 계산에서 제외"
performance_brake_exclusion: "FC 귀속 손익은 performance_brake 발동 판정에서 제외"
budget_exhaustion:
condition: "당월 FC 잔액 = 0"
action: "stage_1 탐색매수 중단. stage_2·stage_3은 정상 가동."
reset: "다음 달 1일 budget 초기화 → 탐색 재개"
output_table:
columns: ["월", "월초예산(원)", "사용금액(원)", "잔액(원)", "당월탐색건수", "당월손절건수"]
orbit_gap_interaction: # [proposal_81 / 2026-05-15] FC 손절의 orbit_gap 포함/제외 및 FC 소진 시 슬롯 조정
purpose: "FC 탐색 손절비용의 orbit_gap 계산 포함 여부 및 FC 소진 시 다음 달 슬롯 조정 규칙"
orbit_gap_treatment:
rule: "orbit_gap 계산의 실제누적수익률에 FC 손절 비용 포함 (총자산 기준 전체 반영)"
exception: "performance_feedback_loop의 재교정 계산에서만 FC 분리 적용 (탐색 실패율 별도 추적)"
rationale: "orbit_gap은 순자산 변화를 측정하므로 FC 손절도 총자산 감소로 반영해야 현실적 궤도 추적 가능"
fc_exhaustion_rule:
trigger: "당월 FC 소진율 >= 100% (= monthly_FC_budget 전액 소진)"
action_next_month:
stage_1_reduction: "다음 달 탐색매수(stage_1) 허용 건수 -1건 자동 감액"
output_required: "블록11A section_C FC잔액 항목에 [FC 소진 — 다음 달 stage_1 -1건 적용 예정] 표기"
reset_condition: "FC 소진율 < 50%인 달이 1개월 경과 시 다음 달부터 감액 해제"
prohibition:
- "FC 손절을 orbit_gap에서 제외해 궤도 달성률을 과장 표기 금지"
- "FC 소진 후 다음 달 슬롯 감액 없이 동일 건수 유지 금지"
prohibition:
- "FC 예산 핑계로 stage_1 탐색 손절을 performance_brake에 포함시켜 과도한 규제 금지"
- "FC 예산 소진 후 stage_1 탐색 강행 금지"
- "FC 예산을 stage_2 이상 손절에 사용 금지 (별도 계정)"
# [proposal_60 / 2026-05-15] 성과 피드백 루프 통합 — performance_feedback_loop
performance_feedback_loop:
purpose: >
daily_leader_scan → staged_entry_v2 → pyramiding_rule → take_profit/stop_loss →
net_expectancy 측정 → C1~C5 임계치 재교정의 전체 피드백 루프.
30건 매매 데이터 후 파라미터를 데이터 기반으로 업데이트한다.
trigger:
primary: "30건 매매 완료 (탐색 진입 기준 카운트)"
secondary: "net_expectancy < 0 상태 10건 연속 지속 시 즉시 중간 점검"
emergency: "손절률 > 55% 또는 평균수익 < 2% 시 즉시 전체 임계치 상향 검토"
net_expectancy:
formula: "net_expectancy = (win_rate × avg_win_pct) - (loss_rate × avg_loss_pct)"
target: "net_expectancy > 0.5% per trade"
targets:
win_rate_target: ">= 55%"
avg_win_target: ">= 4%"
avg_loss_target: "<= 3.5%"
note: "explore_loss_budget(FC) 귀속 손절은 별도 집계. net_expectancy 계산 제외."
recalibration_rules:
if_win_rate_below_45pct: "탐색 후보 등재 최소 점수 4점 → 4.5점 상향"
if_avg_loss_above_5pct: "anti_climax_buy_gate 임계치 3개 → 2개 하향 (더 보수적)"
if_net_expectancy_above_1pct: "탐색 후보 최소 점수 4점 → 3.5점 하향 (MRS <= 3 구간에서만)"
pyramiding_success_below_50pct: "1차 증액 트리거 +3% → +4%로 상향"
data_required_per_trade:
- "입장일·청산일·입장 시 daily_leader_scan 점수(C1~C5 각각)"
- "입장 단계(stage_1/2/3)·청산 유형·수익률(%)·보유기간"
- "입장 시 MRS 점수·anti_climax_buy_gate 신호 수"
prohibition:
- "30건 미만 데이터로 임계치 변경 금지"
- "단일 대형 손실 건을 근거로 긴급 임계치 상향 금지"
- "재교정 결과가 risk_block(master_prohibitions P1~P5)과 충돌하면 재교정 결과 파기"