meta: title: "은퇴자산포트폴리오 — 상세 보고서 양식" parent_file: "RetirementAssetPortfolio.yaml" version: "2026-05-15-G1" purpose: > 보고서 출력 시에만 로드하는 상세 양식 파일. 투자 판단(분석·수량산출)만 필요한 세션에서는 이 파일 없이 메인 파일만으로 충분. load_instruction: "메인 manifest의 load_sequence.STEP_3_for_output 및 spec_files.report_templates 참조." output_format_templates: rendering_contract: purpose: "사람용 보고서를 표 중심으로 렌더링하기 위한 상위 양식 계약." language_rendering: default_locale: "ko-KR" section_title_korean_first: true status_label_map_source: "spec/07_output_schema.yaml:korean_display_labels" prefer_korean_reason_text: true preserve_english_only_for: - "공식_ID" - "종목코드" - "파일경로" - "명령어" - "JSON key" prohibit_direct_english_status: - "PASS" - "FAIL" - "BLOCKED" - "ACTIVE" - "INACTIVE" - "BUY" - "SELL" - "TRIM" required_sequence: - "routing_serving_trace" - "QEH_AUDIT_BLOCK" - "capture_read_ledger" - "data_completeness_matrix" - "backdata_feature_bank_table" - "benchmark_relative_harness_table" - "alpha_lead_table" - "anti_distribution_table" - "profit_preservation_table" - "smart_cash_raise_table" - "execution_quality_table" - "proposal_reference_sheet" # ── [2026-05-20_HARNESS_V5] 신규 필수 섹션 ────────────────────────────── - "breakout_quality_gate_table" - "anti_whipsaw_gate_table" - "smart_cash_raise_v2_table" # ───────────────────────────────────────────────────────────────────────── - "order_quantity_4stage_gate" - "decision_trace_table" - "sell_priority_decision_table 또는 발동조건 미충족 사유" - "current_holdings_analysis_report_template 또는 발동조건 미충족 사유" - "proposal_reference_sheet 또는 제안 산출 불가 사유" - "concise_hts_input_sheet 또는 산출금지 사유" - "reference_price_ledger 또는 WATCH 없음" - "immediate_execution_playbook 또는 산출금지 사유" - "market_context_learning_note 또는 생략 사유" - "core_satellite_timing_gate_table" - "engine_feedback_loop_report" - "prediction_evaluation_improvement_report" blocked_report_rule: id: "BLOCKED_REPORT_V5" trigger: "required_sequence의 필수 섹션이 하나라도 누락된 경우" action: "해당 섹션 이후의 모든 주문표·HTS 입력 시트를 BLOCKED_REPORT로 처리" hard_lock_sections: - section: "breakout_quality_gate_table" missing_action: "신규 BUY 주문표 전체 BLOCKED_BREAKOUT_GATE_MISSING" - section: "anti_whipsaw_gate_table" missing_action: "SELL/TRIM 주문표 전체 BLOCKED_WHIPSAW_GATE_MISSING" - section: "smart_cash_raise_v2_table" missing_action: "현금확보 매도 주문표 BLOCKED_CASH_ROUTE_MISSING" prose_rule: allowed: "각 표의 근거·매도사유·다음확인사항 칸 안의 짧은 문장" prohibited: "서론/본론/결론형 산문, 임의 제목, 표 밖 수량·현금·평단 근거 서술" enum_rule: order_type: ["BUY", "SELL", "STOP_LOSS", "TAKE_PROFIT", "TRAILING_STOP", "HOLD", "WATCH"] mode: ["lead", "lag", "hybrid", "none"] validation_status: ["PASS", "BLOCKED", "INSUFFICIENT_DATA", "MANUAL_CHECK_REQUIRED"] human_label_rule: "사용자 보고서에는 spec/07_output_schema.yaml:korean_display_labels를 적용하되, 원 enum에서 벗어난 새 용어를 만들지 않는다." terminology_rule: prohibited_order_terms: ["부분감액", "1차 감액", "부분정리", "전량", "전량매도"] replacement_rule: "주문구분은 SELL/TRIM 등 canonical action으로, 수량은 확인된 정수 수량으로 분리한다." note: "'전량'은 모드가 아니다. 보유수량 검산 후 SELL 수량이 현재보유수량과 같을 때만 근거 칸에서 설명 가능하다." learning_note_rule: location: "주문 검산·HTS 주문표·보유주 진단 이후에만 배치한다." role: "사용자 이해를 돕는 해설이며 주문 검증, 수량 산출, validation_status를 대체하지 않는다." prohibition: - "학습 해설에서 신규 주문수량·지정가·손절가·익절가·현금 숫자 생성 금지" - "표에서 검증되지 않은 계좌·보유·현금 숫자 인용 금지" - "거시 설명만으로 BUY/SELL/TRIM/ROTATE 결론 변경 금지" routing_serving_trace_report: purpose: "요청 라우팅·번들·프롬프트·JSON 검증 상태를 QEH_AUDIT_BLOCK 이전에 고정하는 서빙 원장." columns: ["항목", "확정값", "근거", "검산상태", "차단사유"] required_rows: - "request_route" - "bundle_selected" - "prompt_entrypoint" - "json_validation_status" - "capture_required" - "cash_ledger_basis" fill_rule: - "RetirementAssetPortfolio.yaml manifest와 DATA_SOURCE_ROUTING 결과를 사용한다." - "JSON 검증 실패 또는 bundle/entrypoint 미확정이면 QEH_AUDIT_BLOCK 이후 주문표는 BLOCKED_REPORT로 제한한다." - "cash_ledger_basis는 settlement_cash_d2_krw 원칙을 명시한다." QEH_AUDIT_BLOCK_report: purpose: "하네스 공식 검산 표. 주문표·판단표보다 먼저 출력한다." columns: ["공식_ID", "사용입력", "하네스값", "LLM_변경여부", "판정", "차단/허용 액션"] required_formulas: ["TOTAL_HEAT_V1", "CASH_RATIOS_V1", "SELL_PRIORITY_V1"] optional_formulas: ["GOAL_RETIREMENT_V1", "CASH_SHORTFALL_V1"] fill_rule: - "data._harness_context 값은 재계산하지 않고 그대로 복사한다." - "LLM_변경여부는 항상 NO여야 하며, 다른 값이면 보고서 INVALID." - "blocked_actions는 산문으로 완화하지 않는다." backdata_feature_bank_table: purpose: "GAS 자동 수집 진입-청산 백데이터 원장. 수동 등록보다 GAS 원장을 우선한다." canonical_ref: "spec/16_data_gaps_roadmap.yaml:phase_4_backdata_collection.B1_gas_backdata_feature_bank" columns: ["Record_Date", "Trade_ID", "Signal_Date", "Ticker", "Name", "Account", "Entry_Stage", "Source_Origin", "Entry_Price", "Close_At_Entry", "MA20_At_Entry", "MA60_At_Entry", "ATR20_At_Entry", "Volume_Ratio_5D", "Flow_Credit", "Late_Chase_Risk_Score", "Follow_Through_Score", "Breakout_Score", "Rebound_Preservation_Score", "Setup_Decision", "Exit_Reason", "PnL_Pct", "Holding_Days", "MAE_Pct", "MFE_Pct"] fill_rule: - "backdata_feature_bank_json 값을 그대로 사용한다." - "Source_Origin=GAS_AUTO 행을 우선 표기하고, performance fallback이나 manual correction은 뒤로 둔다." - "값이 없으면 추정하지 말고 '_' 또는 '-'로 비운다." benchmark_relative_harness_table: purpose: "KOSPI 대비 시계열 상대평가와 위성 품질·손익·현금창출 목적 잠금을 표시한다." canonical_ref: "spec/13_formula_registry.yaml:BENCHMARK_RELATIVE_TIMESERIES_V1, SATELLITE_ALPHA_QUALITY_GATE_V1, SATELLITE_AGGREGATE_PNL_GATE_V1, CASH_CREATION_PURPOSE_LOCK_V1" columns: ["종목", "brt_verdict", "excess_drawdown_pctp", "recovery_ratio_20d", "downside_beta", "rs_line_20d_slope", "saqg_v1", "sell_reason_validity", "sapg_status", "공식_ID"] fill_rule: - "benchmark_relative_timeseries_json, saqg_json, sapg_json, cash_creation_purpose_lock_json 값을 그대로 사용한다." - "saqg_v1=EXCLUDED 또는 WATCHLIST_ONLY이면 BUY 후보·파일럿·HTS 주문표에 포함하지 않는다." - "sapg_status=SAPG_CRITICAL이면 위성 신규 BUY는 전면 차단한다." - "LLM이 초과낙폭·회복률·하락장 베타·RS선 기울기를 재계산하지 않는다." alpha_lead_table: purpose: "뒷북 매수를 줄이기 위한 선행 알파 후보와 추격 금지 상태를 표시한다." canonical_ref: "spec/13b_harness_formulas.yaml:ALPHA_LEAD_SCORE_V1, FOLLOW_THROUGH_CONFIRM_V1" columns: ["종목", "alpha_lead_score", "follow_through_status", "rs_rank", "volume_surge", "upside_pct", "buy_permission", "공식_ID", "검산상태"] fill_rule: - "alpha_lead_json 및 follow_through_json 값을 그대로 사용한다." - "buy_permission_json이 BLOCKED이면 HTS BUY 주문표를 생성하지 않는다." - "선행 점수의 산문 재해석으로 final_action을 변경하지 않는다." anti_distribution_table: purpose: "설거지·분산매도 구간의 추격 매수와 늦은 물타기를 차단한다." canonical_ref: "spec/13b_harness_formulas.yaml:DISTRIBUTION_RISK_SCORE_V1" columns: ["종목", "distribution_risk_score", "risk_label", "price_position", "val_surge_pct", "inst20d", "frg20d", "blocked_action", "공식_ID"] fill_rule: - "distribution_risk_json 값을 그대로 사용한다." - "risk_label=HIGH 또는 blocked_action 존재 시 BUY/ADD_ON은 BLOCKED로만 출력한다." profit_preservation_table: purpose: "수익 포지션의 이익 보호 상태와 손절 상향·익절·트레일링 상태를 고정한다." canonical_ref: "spec/13b_harness_formulas.yaml:PROFIT_PRESERVATION_STATE_V1" columns: ["종목", "profit_state", "unrealized_pnl_pct", "ratchet_state", "tp_state", "trailing_state", "allowed_action", "공식_ID"] fill_rule: - "profit_preservation_json 값을 그대로 사용한다." - "수익 포지션을 현금확보 대상으로 쓸 때도 smart_cash_raise_table의 제안그룹과 충돌 여부를 표시한다." smart_cash_raise_table: purpose: "현금확보 매도를 일괄 투매가 아니라 즉시매도·반등대기·보류로 나누는 제안 계획표." canonical_ref: "spec/13b_harness_formulas.yaml:SMART_CASH_RAISE_PLAN_V1, SELL_QUANTITY_ALLOCATOR_V1, REBOUND_SELL_TRIGGER_V1" columns: ["우선순위", "종목", "cash_raise_group", "target_cash_krw", "immediate_sell_qty", "rebound_wait_qty", "protected_qty", "rebound_trigger", "예상순현금", "공식_ID"] fill_rule: - "cash_raise_plan_json과 smart_sell_quantities_json 값을 그대로 사용한다." - "보유수량 미확인 또는 CAPTURE_REQUIRED이면 수량 칸에 숫자를 쓰지 않는다." - "rebound_wait_qty는 즉시 HTS 매도수량이 아니므로 concise_hts_input_sheet에 합산하지 않는다." execution_quality_table: purpose: "주문 단가·호가·체결 품질·유동성 조건을 최종 주문표 전에 검산한다." canonical_ref: "spec/13b_harness_formulas.yaml:EXECUTION_QUALITY_GUARD_V1, LIMIT_PRICE_POLICY_V1" columns: ["종목", "order_type", "limit_price", "tick_status", "liquidity_status", "gap_status", "execution_permission", "차단사유", "공식_ID"] fill_rule: - "execution_quality_json과 limit_price_policy_json 값을 그대로 사용한다." - "tick_status != VALID 또는 execution_permission != PASS이면 HTS 주문표 검산상태 PASS 금지." proposal_reference_sheet: purpose: "사용자 판단용 제안 원장. 가격·수량·기준시점·차단사유만 남기고 주문 실행 의미는 섞지 않는다." columns: ["계좌", "종목", "종목명", "제안구분", "예상지정가(원)", "기준시점(종가/장중)", "제안가 기준", "예상수량(주)", "수량 기준", "손절1(원)", "손절수량1(주)", "손절2(원)", "손절수량2(주)", "손절3(원)", "손절수량3(주)", "익절가1(원)", "익절수량1(주)", "익절가2(원)", "익절수량2(주)", "익절가3(원)", "익절수량3(주)", "실행가능여부", "차단사유"] fill_rule: - "prices_json, sell_quantities_json, buy_qty_inputs_json, decisions_json 값을 우선 사용한다." - "validation_status=PASS 여부와 무관하게 산출 가능한 가격·수량은 표시한다." - "실행가능여부는 proposal_only / execution_wait / execution_ready 중 하나를 사용한다." - "이 표는 HTS 즉시 입력표가 아니므로 concise_hts_input_sheet와 반드시 분리한다." - "SELL/TRIM/방어 제안은 예상지정가에 stop_price를 우선 사용한다." - "익절 제안은 예상지정가에 tp1_price를 우선 사용하고 없으면 tp2_price를 사용한다." - "BUY 제안은 order_blueprint limit_price 우선, 없으면 buy_qty_inputs_json 보조 입력을 사용한다." - "WATCH/HOLD는 주문가가 아니라 참고 방어가임을 차단사유 또는 설명에 명시한다." - "SELL/TRIM 제안 수량은 sell_quantities_json.sell_qty 우선 사용한다." - "BUY 제안 수량은 buy_qty_inputs_json.final_qty 우선 사용한다." - "WATCH/HOLD는 주문 실행 수량이 아니라 판단 참고 수량임을 수량 기준 컬럼에 명시한다." - "익절 1/2/3 가격·수량은 tp_quantity_ladder_json과 prices_json을 결합해 표시한다." - "손절1/2는 stop_loss.core/satellite quantity_rule 기준으로 core=50/50, satellite=70/30 분할을 표시한다." - "손절3은 profit_preservation_json.protected_stop_price 또는 auto_trailing_stop가 있을 때만 표시한다." reference_price_ledger: purpose: "WATCH/PENDING/BLOCKED 행의 참고 가격 원장. 주문표가 아니며 평가용 참고 상태를 공개한다." title_required: "WATCH 감시 원장 — 주문 아님, HTS 입력 금지" columns: ["ticker", "name", "reference_stop_price", "reference_price_basis", "reference_tp_state", "hts_allowed", "reason_code"] forbidden_columns: ["지정가", "손절가", "익절가", "매도가", "주문가", "주문수량", "손절수량", "익절수량", "매도수량", "주문금액"] fill_rule: - "hts_allowed는 항상 false로 기재한다." - "WATCH 행에 주문 가능 단가·수량처럼 보이는 한글 컬럼명을 쓰면 INVALID_COLUMN 처리한다." - "reference_tp_state는 tp1/tp2 상태를 함께 공개한다. 예: tp1=PENDING; tp2=PENDING." capture_read_ledger_report: purpose: "계좌·보유·현금 판독 증빙 원장. 이 표 없이 HTS 주문표를 출력하지 않는다." columns: ["파일/화면", "계좌", "화면종류", "읽은값", "확신도", "주문표반영", "판독_상태", "다음확인사항"] fill_rule: - "spec/00_execution_contract.yaml:capture_read_ledger.columns를 우선 적용한다." - "보유수량·평단·현금·미체결 주문의 출처를 읽은값에 구분해 적는다." - "NOT_PROVIDED 또는 CAPTURE_READ_FAILED이면 해당 계좌 주문수량은 산출하지 않는다." prohibition: - "자동투자/약정 화면 수치를 보유수량·평단·현금으로 사용 금지" - "원장 행 없이 본문에서 총자산·현금·보유수량 근거 생성 금지" order_quantity_4stage_gate_report: purpose: "주문표 출력 직전 4단계 검산 결과 표." columns: ["계좌", "종목명", "1단계_원장", "2단계_현금", "3단계_보유수량", "4단계_미체결", "최종검산상태", "차단사유", "다음확인사항"] pass_rule: "네 단계가 모두 통과일 때만 immediate_execution_playbook 검산상태=PASS를 허용한다." fail_rule: "하나라도 실패·미확인이면 주문표 대신 산출금지 사유를 출력한다." decision_trace_table: purpose: "상태 머신의 각 판단 단계에서 어떤 규칙이 적용되어 어떤 결론이 선택/차단됐는지 남기는 재현성 검산 표." canonical_ref: "spec/09_decision_flow.yaml:decision_flow.deterministic_execution_control" activation: trigger: "모든 분석·주문·리뷰 출력에서 필수" priority: "order_quantity_4stage_gate 이후, 보유주 진단 및 HTS 주문표 이전" columns: ["단계", "check_id", "rule_ref", "사용입력", "결과", "선택행동", "차단행동", "누락입력", "동률처리", "다음상태"] fill_rule: - "각 행은 decision_flow.states의 상태 또는 output validation 단계 하나를 나타낸다." - "rule_ref는 파일 경로와 YAML path를 함께 적는다." - "사용입력은 실제 사용한 필드명만 적고, 값이 민감하거나 길면 evidence 참조로 대체한다." - "누락입력이 있으면 선택행동은 BLOCKED/INSUFFICIENT_DATA/WATCH 중 하나로 제한한다." - "동률처리는 deterministic_execution_control.tie_breaker_order 번호를 적는다." prohibition: - "판단 추적표 없이 final_action 또는 HTS 주문표 출력 금지" - "decision_trace에 없는 rule_id를 근거로 최종 결론 변경 금지" - "동률처리 없이 동일 점수 후보 중 임의 선택 금지" sell_priority_decision_table: purpose: "여러 매도·축소·교체 후보가 동시에 존재할 때 HTS 주문 실행 순서를 정하는 포트폴리오 단위 표. 활성 시 current_holdings_analysis_report_template보다 먼저 렌더링한다." canonical_ref: "spec/risk/portfolio_exposure.yaml:portfolio_exposure_framework.sell_priority_engine" activation: trigger: - "SELL/TRIM/ROTATE 후보가 2개 이상" - "cash_floor 미달 또는 이벤트 주 현금 상향 필요" - "중복노출 축소와 보유주 진단 축소 후보가 동시에 존재" priority: "order_quantity_4stage_gate 이후, current_holdings_analysis_report_template보다 먼저" columns: ["우선순위", "계좌", "종목명", "실행그룹", "현재보유수량", "매도가능검산", "매도유형", "우선순위단계", "Sell_Priority_Score", "예상순현금", "세금/비용", "매도사유", "보류사유", "다음확인사항"] fill_rule: - "우선순위단계는 sell_priority_engine.hard_precedence 중 하나를 사용한다." - "Sell_Priority_Score는 동일 단계 후보 정렬용이며 hard_precedence를 뒤집지 않는다." - "현재보유수량 또는 평균단가가 미확인이면 매도가능검산=미통과, 수량은 미산출로 둔다." - "예상순현금은 세금·수수료 미확인 시 숫자 대신 '세금/비용 확인 필요'로 둔다." prohibition: - "이 표 없이 여러 매도 후보의 실행 순서를 산문으로만 제시 금지" - "보유수량 미확인 후보에 정수 매도수량 기재 금지" - "세금 최적화만으로 hard stop 후보를 후순위로 미루지 않는다." market_context_learning_note: purpose: "거시·미시 경제 상황, 시장 움직임, 투자자 고민 포인트, 핵심 용어, 판단근거를 학습용으로 정리하는 조건부 해설 블록." activation: trigger: - "사용자가 학습형 설명을 요청한 경우" - "주간·월간 점검 보고서" - "시장국면 변경, 리밸런싱, 대규모 매도/축소, 신규 주도주 편입 검토가 발생한 경우" priority: "주문 검산·HTS 주문표·보유주 진단 이후, 부록 또는 후반부" note: "실행 판단을 먼저 확정한 뒤 독자의 이해를 돕기 위한 해설로만 사용한다." columns: ["구분", "현재 관찰값/상태", "투자자가 고민할 점", "판단에 미친 영향", "핵심 용어", "다음 확인 데이터"] row_types: macro: "금리, 환율, 유가, VIX, KOSPI/KOSDAQ 추세, credit spread 등 포트폴리오 위험예산과 현금비중에 영향을 주는 배경." micro_market: "섹터 순환, 주도주 집중, 거래대금, 외국인/기관 수급, ETF·직접주 중복노출 등 시장 내부 움직임." investor_dilemma: "지금 사야 하는가, 기다려야 하는가, 현금을 얼마나 남겨야 하는가, 손실 종목을 버틸 근거가 있는가 같은 실제 의사결정 질문." decision_basis: "BUY/HOLD/SELL/TRIM/ROTATE/WATCH 결론에 영향을 준 rule_id, 수치, hard stop, missing_data." glossary: "Total_Heat, cash_floor, ATR20, Expected_Edge, Flow_Rows, flow_credit, lead/lag/hybrid mode 등 보고서 내 핵심 용어." fill_rule: - "현재 관찰값/상태는 data_basis, data_completeness_matrix, risk_gate, market_regime_state, sector_flow, macro에서 검증된 값만 사용한다." - "판단에 미친 영향은 어떤 주문 결론을 새로 만들지 말고 이미 확정된 portfolio_decision 또는 prohibited_calculations에 연결한다." - "다음 확인 데이터는 구체 출처를 적는다. 예: macro 시트, sector_flow 시트, HTS 보유종목 화면, 미체결 주문 화면." - "수치가 없으면 추정하지 말고 '미확인' 또는 '다음 확인 필요'로 적는다." example_rows: macro: ["거시", "VIX·환율·KOSPI MA20 상태 확인 필요", "현금비중을 낮춰도 되는가", "MRS와 cash_floor 판단에만 반영", "MRS, cash_floor", "macro 시트, KOSPI MA20, USD/KRW"] micro_market: ["미시/시장", "특정 섹터 수급 집중 여부 확인", "ETF와 직접주 중 어느 노출이 효율적인가", "중복노출·리밸런싱 후보 판단에 반영", "sector_flow, duplicate_exposure", "sector_flow, core_satellite"] investor_dilemma: ["고민 포인트", "매수 신호는 있어도 ATR20 또는 현금이 미확인일 수 있음", "기회비용과 검산 실패 중 무엇을 우선할 것인가", "validation_status 미통과 시 주문 금지", "ATR20, validation_status", "data_feed, account_snapshot"] decision_basis: ["판단근거", "Total_Heat·cash_floor·Flow_Rows가 핵심 gate", "왜 A등급이어도 즉시매수가 아닐 수 있는가", "hard stop이 전략 점수보다 우선", "Total_Heat, Flow_Rows", "risk_gate, triggered_rules"] glossary: ["용어", "Expected_Edge는 기대수익 대비 손실위험 비율", "손절폭이 넓으면 수량이 줄어드는 이유", "position_sizing 산식 이해 보조", "Expected_Edge, ATR20", "spec/13_formula_registry.yaml"] output_rule: - "각 행은 교육 목적의 해설이며 주문 산출 근거 표를 대체하지 않는다." - "항목별 설명은 2~3문장 이내로 제한한다." - "용어 설명은 보고서에서 실제 사용한 용어를 우선한다." - "판단근거는 rule_id 또는 파일 경로를 함께 적는다." prohibition: - "학습 해설에서 신규 매수·매도 결론 생성 금지" - "학습 해설만으로 validation_status를 PASS로 변경 금지" - "웹이나 일반 지식만으로 workbook/account_snapshot 결론 대체 금지" - "출처 없는 최신 시장 상황 단정 금지" data_flow_analysis_report: purpose: > 블록 2(데이터 완성도 매트릭스) 직후, 블록 3(캡처 판독 원장) 전에 1페이지로 삽입. 데이터→신호→판단→행동 4단계 흐름을 표로 가시화해 병목 단계를 즉시 파악. flow_table: columns: - "종목명" - "[D]데이터상태 (OK/PARTIAL/MISSING)" - "[S]신호 (추세/수급/유동성 각각 Pass/Fail)" - "[J]판단 (A/B/C/D등급·이유)" - "[A]행동 (즉시/조건부/보류/금지)" - "병목단계 (D/S/J 중 어느 단계가 블록인지)" - "다음확인우선순위" fill_rule: - "[D]: 블록 2 데이터 완성도 매트릭스에서 직접 참조." - "[S]: minimalist_buy_gate 3핵심 지표 결과." - "[J]: sector_model.grade + Expected_Edge + flow_credit 종합. (결합 공식 → fill_rule_J_detail)" - "[A]: 최종 즉시실행/조건부/보류/금지 결론." - "병목단계: [D]에서 막히면 'D', [S]에서 막히면 'S', [J]에서 막히면 'J'." absence_rule: "통과 이유 없는 A등급 금지. 모든 칸은 값 또는 '없음'으로 채운다." fill_rule_J_detail: # [P139] [J] 단계별 상한 설정 — 3개 시스템 결합 공식 step_1: "sector_model.score_axes_formula 산출 → A_core/B_wait/C_watch/D_exclude 상한 설정" step_2: "Expected_Edge < 1.5이면 최대 B등급 (A 승격 불가)" step_3: "flow_credit < 0.40이면 최대 C등급 (A·B 승격 불가)" step_4: "step_1~3 모두 통과 시에만 sector_model.grade 결론 채택" precedence: "Expected_Edge 기준 > sector_model.grade (충분조건 vs 필요조건)" output_format: "A/B/C/D 중 하나 + 근거 (예: B — Expected_Edge 1.8 충족, flow_credit 0.55 partial)" minimalist_output: - "3지표([S]) 모두 Pass인 종목은 강조 표시." - "병목이 [D]인 종목은 '다음확인우선순위'에 구체 출처 명시." - "병목이 [S]인 종목은 실패한 지표와 임계치 명시." current_holdings_analysis_report_template: purpose: "현재 보유주를 대상으로 유지/축소/교체/관찰을 판단하는 전용 보고서 양식." activation: trigger: "보유수량이 확인된 종목이 1개 이상이거나 position_review_cycle.documentation 점검 주기에 도달했을 때" priority: "제안 검토 표 다음, 매수/매도 예시 이전" note: "신규 종목 추천이 아니라 기존 보유 포지션 점검 전용이다." decision_score_formula: > current_holdings_score = 0.30*trend_score + 0.30*flow_score + 0.20*edge_score + 0.10*concentration_score + 0.10*execution_score. trend_score, flow_score, edge_score, concentration_score, execution_score는 모두 0~100 정규화 값으로 입력한다. score_components: # [R4] 컴포넌트별 산출 규칙 trend_score: "100": "현재가 > 20일선 AND 20일선 > 60일선 AND 5일선 위 주행" "70": "현재가 > 20일선 AND 20일선 > 60일선 (5일선 이탈)" "40": "현재가 > 20일선 (60일선 하향배열)" "10": "현재가 < 20일선" missing: "20일선·60일선 미확인 → 50점(중립)" flow_score: "100": "Frg_5D + Inst_5D 동반 순매수 AND flow_credit >= 0.60" "70": "Frg_5D 또는 Inst_5D 중 1개 순매수 AND flow_credit >= 0.40" "40": "flow_credit 0.20~0.39" "10": "Frg_5D + Inst_5D 동반 순매도" missing: "Flow_OK=N 또는 Flow_Rows<5 → 25점" edge_score: formula: "Expected_Edge = (익절가 - 진입가) / (진입가 - 손절가)" "100": "Expected_Edge >= 2.5" "70": "1.8 <= Expected_Edge < 2.5" "40": "1.2 <= Expected_Edge < 1.8" "10": "Expected_Edge < 1.2" missing: "손절가·익절가 미설정(legacy_position) → 0점" concentration_score: "100": "current_weight <= target_weight" "70": "target_weight < current_weight <= target_weight + 3%p" "40": "target_weight + 3%p < current_weight <= target_weight + 5%p" "10": "current_weight > target_weight + 5%p" missing: "target_weight 미설정 → 50점(중립)" execution_score: "100": "진입 후 D+5 이내 수익 구간 진입 OR 시범진입 후 본진입 계획 유효" "70": "진입 후 D+20 이내 플러스 구간 유지" "40": "진입 후 D+20 경과, 0% 근방" "10": "진입 후 D+20 경과, 손실 구간 AND time_stop 임박" missing: "진입일 미확인 → 50점(중립)" thresholds: keep: "score >= 70 AND current_weight within target_band ±5%p AND grade in (A,B)" trim: "score 50~69 OR current_weight exceeds target_band by >5%p OR duplicate_factor_overweight" rotate: "score < 50 OR grade in (C,D) AND flow_negative_20d" watch: "보유수량 0 또는 판독 미완료" keep_criteria: - "현재비중이 목표비중 대비 ±5%p 이내" - "등급 A 또는 B" - "기대수익비(Expected_Edge) >= 1.8" - "20일 수급과 추세가 동시에 유지" trim_criteria: - "현재비중이 목표비중 대비 +5%p 초과" - "기대수익비(Expected_Edge) 1.2~1.8" - "동일 섹터 또는 동일 팩터 중복 노출이 상한 초과" - "수익률이 플러스여도 포트폴리오 집중도만 과다하면 축소" rotate_criteria: - "등급 C 또는 D" - "20일 수급 음수" - "반등 실패 또는 대체주 우위" - "손익률 -5% 이하이면서 회복 논리 부재" watch_criteria: - "보유수량 0" - "평단 또는 현재가 판독 미완료" - "핵심 데이터 누락으로 score 산출 불가" columns: ["계좌", "종목명", "현재보유수량", "평단", "현재가", "현재비중(%)", "손익률(%)", "섹터/팩터", "등급", "판단점수", "유지/축소/교체", "근거", "다음점검일"] input_example: fields: ["trend_score", "flow_score", "edge_score", "concentration_score", "execution_score", "current_weight", "target_band", "grade", "Expected_Edge"] sample_values: ["85", "78", "82", "60", "75", "12.4", "10.0", "A", "2.1"] sample_calc: "0.30*85 + 0.30*78 + 0.20*82 + 0.10*60 + 0.10*75 = 78.2" sample_judgement: "점수 78.2, 현재비중 12.4%, 목표밴드 10.0% 대비 +2.4%p, grade A이므로 유지" sample_fill_rule: "trend/flow/edge는 데이터에서, concentration/execution은 계좌비중과 주문검산에서 채운다." output_phrases: keep: "유지 — 점수 {score}, 비중 {current_weight}%가 목표밴드 {target_band}% 이내, 등급 {grade}, 기대수익비 {expected_edge}." trim: "축소 — 점수 {score}, 현재비중이 목표밴드 대비 과다, 중복 노출 또는 기대수익비 저하 확인." rotate: "교체 — 점수 {score}, 20일 수급 음수 또는 반등 실패로 기존 포지션 교체 필요." watch: "관찰 — 보유수량 0 또는 핵심 데이터 미완료로 판단 보류." output_rule: - "판단점수와 등급을 함께 표기한다." - "유지/축소/교체/관찰 중 하나만 최종 출력한다." - "문장형 근거와 수치형 점수를 동시에 보여준다." keep_row: ["일반계좌", "예시종목", "120", "24800", "27500", "12.4", "+10.8", "반도체", "A", "82", "유지", "주도 섹터 + 수급 유지 + 기대수익비 충족", "D+5"] trim_row: ["ISA", "예시종목", "80", "38000", "36000", "8.1", "-5.3", "전력기기", "B", "61", "축소", "섹터 중복 + 기대수익비 저하 + 리밸런싱 대상", "D+3"] rotate_row: ["연금저축", "예시종목", "50", "59000", "54500", "4.2", "-7.6", "개별 성장주", "C", "42", "교체", "수급 이탈 + 반등 실패 + 대체주 우위", "D+2"] watch_row: ["일반계좌", "예시종목", "0", "0", "0", "0.0", "0.0", "없음", "D", "0", "관찰", "보유 없음 또는 판독 미완료", "D+7"] required_inputs: - "현재보유수량" - "평단" - "현재가" - "현재비중" - "섹터/팩터" - "등급" - "기대수익비" prohibition: - "현재보유수량·평단·현재가 없이 보유주 분석 금지" - "신규매수 제안과 동일 표에 혼용 금지" - "보유주 분석에서 손절가·익절가를 강제로 생성하지 않는다" market_leader_screening_report_template: purpose: "떠오르는 주도주를 관찰 후보·편입 후보·금지 후보로 나누는 전용 스크리닝 보고서." activation: trigger: "sector_flow 또는 quant_feed 갱신 시, 또는 매주 정기 점검 시" priority: "current_holdings_analysis_report_template 및 immediate_execution_playbook 다음" note: "이 블록은 core_satellite 자산배분 표와 분리된 주도주 발굴용이다." source_binding: required_sheets: ["core_satellite", "sector_flow", "macro", "event_risk"] freshness_rule: "주도주 후보 표의 모든 행은 Price_Date, sector_flow.AsOfDate, macro.AsOfDate를 함께 적고, 하나라도 다르면 '데이터 불일치'로 표시한다." unit_normalization_rule: "AvgTradeValue_5D_M와 AvgTradeValue_20D_M는 보고서 출력 시 억원 단위로 환산해 표기한다. 원 단위와 혼용 금지." quantity_integrity_rule: "보유수량, 주문수량, 계좌원장, 판독상태 중 하나라도 미확정이면 후보 분류보다 '판독 미완료'를 우선한다." columns: ["종목명", "섹터", "Rotation_Score", "5D수급", "20D수급", "상대강도", "유동성", "실적추정", "등급", "분류", "액션", "편입근거", "금지근거"] observe_row: ["한미반도체", "반도체 장비", "88", "양호", "양호", "우수", "충분", "상향", "A", "관찰 후보", "현금·중복노출 확인 후 재평가", "반도체 과다보유 시 즉시 편입 금지"] include_row: ["기아", "자동차", "82", "양호", "양호", "우수", "충분", "유지", "A", "편입 후보", "섹터 순환매와 수급 동시 확인", "현금 미확보 시 추격매수 금지"] ban_row: ["LS ELECTRIC", "AI전력", "58", "혼조", "혼조", "보통", "충분", "혼조", "C", "금지 후보", "테마는 강하나 단기 수급 이탈", "상대강도 회복 전까지 신규매수 금지"] incomplete_row: ["TIGER 코리아AI전력기기", "AI전력 ETF", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "판독 미완료", "수량·비중·판독상태 미확정", "수량 미확정은 후보 판단보다 먼저 보류"] candidate_gate: observe_candidate: "Allowed_Action=CONDITIONAL_HOLD 이고 Rotation_Score >= 50 이면 관찰 후보" include_candidate: "Allowed_Action=CONDITIONAL_HOLD 이고 sector_flow.Alert_Level in (INFLOW_MODERATE, NEUTRAL) 이며 중복노출이 과도하지 않을 때 편입 후보" ban_candidate: "Allowed_Action=SELL_ALLOWED 또는 sector_flow.Alert_Level in (OUTFLOW_ALERT, OUTFLOW_CAUTION) 이면 금지 후보" incomplete_candidate: "판독 미완료 또는 수량 미확정이면 어떤 등급도 부여하지 않고 데이터 재확인으로 되돌린다." rules: - "주도주 후보는 core_satellite 자산배분 후보와 다른 개념으로 표기한다." - "관찰 후보는 강하지만 계좌 중복노출이 높아 즉시 매수하면 안 되는 종목이다." - "편입 후보는 현금·수량·손절가·익절가를 갖춘 경우에만 매수 제안으로 전환한다." - "금지 후보는 테마성 강세라도 수급·유동성·실적 중 하나라도 훼손되면 신규매수 금지로 둔다." - "핵심 데이터의 단위가 맞지 않으면 후보 분류보다 데이터 불일치 표기를 우선한다." - "수량 판독이 불완전한 종목은 절대 관찰/편입 후보로 승격하지 않는다." required_inputs: - "sector_flow Rotation_Score" - "5D/20D 수급" - "상대강도" - "유동성" - "실적추정" - "기존 보유와의 중복노출" prohibition: - "주도주 후보를 core_satellite 후보로 오독하지 않는다" - "관찰 후보를 즉시매수 후보로 승격하지 않는다" - "금지 후보를 테마가 강하다는 이유로 편입하지 않는다" market_micro_macro_flow_scenario_report_template: purpose: "미시(종목)·거시(국면)·전체 자금흐름·향후 시나리오를 한 페이지로 묶는 통합 진단 보고서." activation: trigger: "macro_snapshot, sector_flow, quant_feed 중 2개 이상 갱신되었거나 주간 점검일에 도달했을 때" priority: "current_holdings_analysis_report_template 다음, buy/sell 예시 이전" note: "미시·거시·흐름 중 하나라도 빠지면 시나리오 결론을 내리지 않고 '보류'로 적는다." micro_panel: columns: ["종목명", "가격상태", "수급상태", "유동성상태", "실적상태", "등급", "판단"] required_inputs: ["Price_Status", "Flow_OK", "Flow_Rows", "AvgTradeValue_5D_M", "컨센서스 방향", "등급"] rule: "개별 종목은 추세·수급·유동성·실적 4축이 동시에 맞아야 A/B 판정을 허용한다." macro_panel: columns: ["지표", "최근값", "추세", "국면판정", "포트폴리오함의"] required_inputs: ["KOSPI", "KOSDAQ", "USD/KRW", "VIX", "미국 10년물", "미국 HY OAS", "WTI", "국내 CP/CD 스프레드"] rule: "거시는 위험선호/중립/위험회피의 국면판정에만 사용하고, 개별 종목의 가격대는 대체하지 않는다." capital_flow_panel: columns: ["흐름항목", "방향", "강도", "해석", "행동"] required_inputs: ["외국인 5D/20D", "기관 5D/20D", "sector_flow Rotation_Score", "ETF 상대강도", "현금비중", "미체결 주문"] rule: "전체 자금흐름은 매수 트리거가 아니라 비중조절·후행진입·리밸런싱 우선순위를 정하는 입력값이다." scenario_matrix: columns: ["시나리오", "발동조건", "확률가중", "예상국면", "우선행동", "금지행동"] base_probability_rule: "점수 대신 국면·흐름·가격 일치 정도로 가중만 부여하고, 정밀 확률처럼 과장하지 않는다." bull_extension: trigger: "Risk-On + VIX<18 + KOSPI 20일선 위 + 외국인/기관 20D 순매수 + sector_flow 집중" probability_weight: "높음" implication: "주도주 유지, 선행형은 소액 시범진입, 약한 보유주는 축소" action: "코어 유지, 위성은 주도 섹터로만 제한적으로 이동" rotation: trigger: "KOSPI 횡보 + 섹터별 상대강도 급변 + 자금이 기존 주도주에서 신규 리더로 이동" probability_weight: "중간" implication: "보유주 교체보다 자금 재배치 우선" action: "보유주 진단에서 교체 후보와 유지 후보 분리" risk_off_squeeze: trigger: "VIX>25 또는 KOSPI 20일·60일선 동시 하회 + 외국인/기관 20D 동반 매도" probability_weight: "중간~높음" implication: "현금 비중 확대, 신규매수 축소, 반등매도 우선" action: "후행형만 허용, 전술 위성 축소, 리밸런싱 우선" event_shock: trigger: "DART 리스크/금리/환율/유가 급변으로 1~3일 내 가격·수급 동시 충격" probability_weight: "낮음~중간" implication: "일시적 노이즈와 구조적 훼손을 분리" action: "즉시 추격매수 금지, 데이터 재확인 후 대응" sideways_drift: trigger: "가격·수급·거시가 모두 중립이고 거래대금이 축소" probability_weight: "중간" implication: "회전율 낮추고 현금·대기 비중을 높임" action: "보유주 유지/관찰 중심, 신규진입 보류" output_rule: - "미시·거시·자금흐름·시나리오를 한 표 안에 함께 보여준다." - "시나리오 결론은 우선행동과 금지행동을 동시에 써야 한다." - "확률은 정밀 예측이 아니라 상대적 가중으로만 표기한다." prohibition: - "거시만 보고 종목 매수/매도 결론을 내리지 않는다" - "자금흐름만 보고 추격매수 결론을 내리지 않는다" - "시나리오를 한 가지만 고정해 다른 국면 전환 가능성을 지우지 않는다" engine_feedback_loop_report: purpose: "매일 제안값과 다음 거래일 결과를 비교해 오차 원인과 개선 제안을 누적하는 평가 섹션." canonical_ref: "Temp/proposal_evaluation_history.json" location: "QEH_AUDIT_BLOCK 직후" columns: ["제안일", "평가일", "종목", "제안", "검산", "제안가", "결과가", "T+1수익률%", "평가", "원인", "개선제안"] fill_rule: - "tools/update_proposal_evaluation_history.py가 생성한 proposal_evaluation_history records를 사용한다." - "T+1 평가 전 행은 PENDING_T1로 두고 성패를 단정하지 않는다." - "MISMATCHED 행은 원인을 rule/feature 수준으로 분류하고 개선 제안을 남긴다." - "표본이 적을 때는 임계치 변경을 제안하되 즉시 강제하지 않는다." prediction_evaluation_improvement_report: purpose: "예측 결과 평가 수치와 YAML/GS/JSON/PY 갭을 함께 보여주어 엔진 개선 우선순위를 정하는 섹션." canonical_ref: "Temp/proposal_evaluation_history.json, tools/measure_harness_coverage.py, tools/update_proposal_evaluation_history.py" location: "engine_feedback_loop_report 직후, alpha_feedback_loop_report 이전" columns: ["항목", "값", "의미", "갭"] fill_rule: - "proposal_evaluation_history summary와 하네스 커버리지 측정 결과를 그대로 사용한다." - "YAML/GS/JSON/PY 각 층의 커버리지와 갭을 숫자로 병기한다." - "개선 제안은 평가 기록의 improvement_proposal과 error_cause를 우선 사용한다." - "이 섹션은 다음날 엔진 개선과 반복오류 방지의 근거 원장이다." - "gap 경고가 '경고'이면 운영 검증 실패로 처리하고 주문 실행표를 차단한다." - "커버리지 목표는 YAML/GS/JSON/PY 각 100%이며 미달 시 원인코드를 함께 출력한다." core_satellite_timing_gate_table: purpose: "core_satellite 후보의 T+1 강제매도 위험과 매도충돌을 분리 평가하는 표." canonical_ref: "spec/13_formula_registry.yaml:T1_FORCED_SELL_RISK_V1" location: "reference_price_ledger 직후, alpha_feedback_loop_report 이전" columns: ["종목", "종목명", "후보등급", "실행추천상태", "타이밍", "진입점수", "청산점수", "T+1위험", "T+1상태", "매도충돌", "충돌상태", "공식근거"] fill_rule: - "core_satellite.Execution_Recommendation_State를 그대로 출력한다." - "BUY_PILOT_ALLOWED 이외 상태는 HTS 주문표로 승격하지 않는다." - "SELL_OR_TRIM_FIRST, BUY_BLOCKED_SELL_CONFLICT, BUY_BLOCKED_T1_EXIT_RISK 순으로 중요도 정렬한다." # ── [2026-05-20_HARNESS_V5] H6: 뒷박 차단 게이트 표 ──────────────────────── breakout_quality_gate_table: purpose: "신규 BUY 후보의 뒷박(Late Chase) 차단 점수와 게이트 상태를 하네스 값으로 표시." canonical_ref: "spec/13_formula_registry.yaml:BREAKOUT_QUALITY_GATE_V2" harness_key: "breakout_quality_gate_json" location: "execution_quality_table 직후, order_quantity_4stage_gate 이전" columns: - "종목" - "종목명" - "뒷박점수(0~100)" - "게이트상태" - "주요차단사유" - "BUY허용여부" gate_states: PILOT_ALLOWED: "BUY 허용 — 정상 진입 가능" WATCH_COOLING_OFF: "대기 — 추격 리스크 있음. 신규 BUY 보류." BLOCKED_LATE_CHASE: "차단 — 뒷박 판정. BUY 절대 금지." fill_rule: - "breakout_quality_gate_json 하네스 값을 그대로 복사한다. LLM 재계산 금지." - "BLOCKED_LATE_CHASE 종목은 BUY허용여부='NO (H6 차단)' 기재 후 주문표 승격 금지." - "breakout_quality_gate_json 없으면 표 전체를 'DATA_MISSING — GAS 재실행 필요'로 표시." prohibition: - "breakout_quality_score를 LLM이 재계산하거나 조정 금지" - "BLOCKED_LATE_CHASE 상태를 서사로 완화해 BUY 허용으로 승격 금지" - "이 표 없이 신규 BUY 주문표 출력 금지 (BLOCKED_BREAKOUT_GATE_MISSING)" version: "2026-05-20_HARNESS_V5" # ── [2026-05-20_HARNESS_V5] H7: 가짜 매도 차단 게이트 표 ────────────────── anti_whipsaw_gate_table: purpose: "매도 후보의 가짜 매도(Whipsaw) 가능성을 하네스 값으로 표시하고 1거래일 홀드 여부 결정." canonical_ref: "spec/13b_harness_formulas.yaml:ANTI_WHIPSAW_HOLD_GATE_V1" harness_key: "anti_whipsaw_gate_json" location: "breakout_quality_gate_table 직후" columns: - "종목" - "종목명" - "Whipsaw점수" - "게이트상태" - "홀드일수" - "당일매도허용여부" - "주요사유" gate_states: CONFIRMED_SELL: "매도 허용" INCONCLUSIVE: "50% 매도 허용, 50% 1거래일 후 재평가" WHIPSAW_SUSPECTED: "당일 매도 전량 차단 — 1거래일 홀드" fill_rule: - "anti_whipsaw_gate_json 하네스 값을 그대로 복사한다. LLM 재계산 금지." - "WHIPSAW_SUSPECTED 종목은 당일 매도허용여부='NO (H7 WHIPSAW_SUSPECTED)' 기재." - "anti_whipsaw_gate_json 없으면 'DATA_MISSING — GAS 재실행 필요' 표시." prohibition: - "anti_whipsaw_score를 LLM이 재계산하거나 조정 금지" - "WHIPSAW_SUSPECTED 종목을 서사로 완화해 당일 전량 매도 허용 금지" - "이 표 없이 SELL/TRIM 주문표 출력 금지 (BLOCKED_WHIPSAW_GATE_MISSING)" version: "2026-05-20_HARNESS_V5" # ── [2026-05-20_HARNESS_V5] H8: 4경로 현금확보 결정 표 ───────────────────── smart_cash_raise_v2_table: purpose: "현금 부족 시 4경로(ROUTE_A~D) 결정론적 현금확보 라우팅 결과를 하네스 값으로 표시." canonical_ref: "spec/13b_harness_formulas.yaml:SMART_CASH_RAISE_V2" harness_key: "smart_cash_raise_json" location: "anti_whipsaw_gate_table 직후" columns: - "종목" - "종목명" - "확정경로" - "경로설명" - "매도수량" - "반등대기비율(%)" - "결정근거" route_labels: ROUTE_A: "위성 비중 트림 (33~50% 즉시)" ROUTE_B: "과매도 분할 매도 (K2 50/50)" ROUTE_C: "코어 익절 잠금 (익절수량만)" ROUTE_D: "긴급 전량매도 (인간 승인 필수)" NO_ACTION: "현금확보 비대상" fill_rule: - "smart_cash_raise_json 하네스 값을 그대로 복사한다. LLM 라우트 선택 금지." - "ROUTE_D는 emergency_full_sell=true 또는 BREACH_IMMEDIATE_EXIT 사유를 반드시 기재." - "smart_cash_raise_json 없으면 현금확보 매도 주문표를 BLOCKED_CASH_ROUTE_MISSING으로 처리." prohibition: - "smart_cash_raise_route를 LLM이 임의 변경 금지" - "ROUTE_D를 인간 승인 없이 서사로 발동 금지" - "이 표 없이 현금확보 매도 주문표 출력 금지" version: "2026-05-20_HARNESS_V5" rebalancing_report_template: purpose: "리밸런싱이 필요할 때만 출력하는 전용 보고서 양식. 목표비중·이탈폭·세후 순현금·제안순서를 한 번에 보여준다." activation: trigger: "rebalancing_trigger.threshold 또는 cash_floor.rebalancing_hard_stop 충족 시" priority: "제안 검토 표 다음, 통합 주문표 이전" note: "리밸런싱이 아니면 기본 출력 금지" columns: ["계좌", "종목명", "현재비중(%)", "목표비중(%)", "이탈폭(p)", "조치유형", "지정가(원)", "수량(주)", "예상순현금(원)", "세금수수료(원)", "실행순서", "검산상태"] trim_row: ["일반계좌", "예시종목", "15.0", "10.0", "+5.0", "축소", "24800", "60", "1488000", "12000", "중복 ETF → 약한 위성 순", "PASS"] buy_row: ["ISA", "예시종목", "8.0", "10.0", "-2.0", "매수", "12500", "80", "-1000000", "8000", "현금 확보 후 분할 재배치", "PASS"] required_inputs: - "현재비중" - "목표비중" - "이탈폭" - "예상 세금·수수료" - "예상 순현금" prohibition: - "현재비중·목표비중·이탈폭 없이 리밸런싱 표 금지" - "세후 순현금 계산 없이 축소/매수 결정 금지" - "리밸런싱은 일반 매수제안 표와 혼용하지 않는다"