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:
2026-06-13 13:20:14 +09:00
commit ee3e799de1
1474 changed files with 176087 additions and 0 deletions
+389
View File
@@ -0,0 +1,389 @@
meta:
title: "은퇴자산포트폴리오 — 정수 수량·변동성 타기팅·베이지안 명세"
parent_file: "RetirementAssetPortfolio.yaml"
version: "2026-05-16-F3_kosdaq_strict"
language: "ko-KR"
timezone: "Asia/Seoul"
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)과 충돌하면 재교정 결과 파기"