feat(quant-engine): v8.9 제안서 P0-P3 로드맵 채택 — 15개 의사결정 엔진 신규 구현

suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml의
implementation_todo_v8_9(P0~P4) 전체를 spec/tool/golden case 레벨로 구현.

- P0: PORTFOLIO_TRANSITION_UTILITY_V1, SELL_LOT_PARETO_SELECTOR_V1, FORECAST_SIMULATION_ENGINE_V1
- P1: SECTOR_EXPOSURE_GRAPH_V1/LEADER_LIFECYCLE_GATE_V1, EXECUTION_CAPACITY_LADDER_V1, MODEL_GOVERNANCE_KILL_SWITCH_V1
- P2: SCENARIO_SHOCK_MATRIX_V1, TRANSITION_SET_ENUMERATOR_V1, IMMUTABLE_DECISION_LEDGER_V1, EXECUTION_PLAN_COMPILER_V1
- P3: STATE_VECTOR_CONSTRUCTOR_V1, WALK_FORWARD_BOOTSTRAP_V1, TRANSITION_SET_ENUMERATOR_V1(MRC/CVaR 확장),
      REBALANCE_CADENCE_GATE_V1, WEEKLY_LEGACY_TRANSFER_PLAN_V1

기존 regime/cluster 연동 정책 수치(현금방어선, 반도체 cap)는 그대로 유지하고 신규 cap 필드만 추가.
spec/09_decision_flow.yaml과 runtime/active_artifact_manifest.yaml에 전 엔진 배선 완료.
governance/todo/v8_9_p{0,1,2,3}_adoption_plan.yaml에 각 단계 작업 추적 기록.

검증: validate_specs/validate_golden_coverage_100(100%)/validate_calibration_registry_v1/
validate_schema_model_generation_v1/validate_agents_shrink_v1 전부 PASS. golden test 53/53 PASS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-18 00:06:52 +09:00
parent aed1eae421
commit aedabdd37b
82 changed files with 7515 additions and 5 deletions
+114
View File
@@ -537,6 +537,73 @@ formulas:
activation_threshold:
min_t20_sample: 30
retirement_condition: performance_degradation
SELL_LOT_PARETO_SELECTOR_V1:
purpose: >
SELL_WATERFALL_ENGINE_V1의 동일 hard_precedence 단계 안에서 후보 lot을 점수화하고,
세금 회피 효과·반등 후 재진입 비용·놓친 상승분까지 포함한 다목적(Pareto) 비교로
동순위 후보 중 어느 lot을 먼저 매도할지 결정론적으로 선택한다.
(governance/todo/v8_9_p0_adoption_plan.yaml P0-2.1,
source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:sell_and_cash_repair_optimizer_v8_9)
applicable: SELL_WATERFALL_ENGINE_V1의 동일 stage 내 후보가 2개 이상일 때.
inputs:
- field: avoided_tail_loss_krw
unit: KRW
- field: cash_repair_benefit_krw
unit: KRW
- field: concentration_reduction_benefit_krw
unit: KRW
- field: tax_loss_benefit_krw
unit: KRW
note: 손실 lot 매도 시 세금 절감 효과(tax-loss harvesting). 비과세 계좌는 0.
- field: tax_fee_slippage_krw
unit: KRW
- field: reentry_cost_krw
unit: KRW
note: 매도 후 동일·유사 종목 재진입 시 예상 거래비용·스프레드 비용.
- field: missed_upside_penalty_krw
unit: KRW
note: 매도하지 않았다면 얻었을 상승분 추정치. CE70_NET_PROFIT_KRW 분포가 있으면 그 값을 사용하고, 없으면 0(추정 금지).
expression: >
LOT_SELL_SCORE_KRW = avoided_tail_loss_krw + cash_repair_benefit_krw + concentration_reduction_benefit_krw
+ tax_loss_benefit_krw - tax_fee_slippage_krw - reentry_cost_krw - missed_upside_penalty_krw
output:
field: lot_sell_score_krw
unit: KRW
pareto_dominance_rule:
purpose: 동일 hard_precedence 단계 안에서 단일 점수만으로 비교하기 모호할 때 다목적 우위를 결정론적으로 판정.
objectives_maximize: [avoided_tail_loss_krw, cash_repair_benefit_krw, concentration_reduction_benefit_krw, tax_loss_benefit_krw]
objectives_minimize: [tax_fee_slippage_krw, reentry_cost_krw, missed_upside_penalty_krw]
dominates_if: >
candidate A가 모든 objectives_maximize 항목에서 B 이상이고 모든 objectives_minimize 항목에서 B 이하이며,
적어도 한 항목에서 A가 B보다 우월하면 A dominates B.
tie_breaker_if_no_dominance:
- lot_sell_score_krw 높은 순
- tax_fee_slippage_krw 낮은 순
- reentry_cost_krw 낮은 순
missing_policy:
missed_upside_penalty_krw: CE70_NET_PROFIT_KRW 분포 없으면 0 사용(추정 아님 — 보수적 하한). 0 사용 사실을 output에 명시.
tax_loss_benefit_krw: 계좌유형 미확인 시 0 (taxable 가정 금지, ISA/연금 비과세 가정도 금지 — DATA_MISSING 표기)
canonical_ref: spec/risk/portfolio_exposure.yaml:sell_priority_engine.candidate_scoring
implementation: tools/build_sell_waterfall_engine_v4.py
owner: quant_team
lifecycle_state: shadow
input_fields:
- avoided_tail_loss_krw
- cash_repair_benefit_krw
- concentration_reduction_benefit_krw
- tax_loss_benefit_krw
- tax_fee_slippage_krw
- reentry_cost_krw
- missed_upside_penalty_krw
output_fields:
- lot_sell_score_krw
golden_cases:
- V89_029_deconcentration_trim
- V89_030_profit_lock
- V89_031_tax_drag_too_high
activation_threshold:
min_t20_sample: 30
retirement_condition: performance_degradation
SMART_MONEY_LIQUIDITY_GATE_V1:
purpose: '스마트머니·유동성 차단 게이트. SM001(외국인+기관 동시 순매도→BLOCK_BUY), SM002(5일 평균 거래대금 <
50억→LIMIT_QUANTITY), SM003(RSI14>70 AND flow_credit<0.3→BLOCK_BUY) 결정론 구현. FINAL_JUDGMENT_GATE_V1의
@@ -946,3 +1013,50 @@ formulas:
activation_threshold:
min_t20_sample: 30
retirement_condition: performance_degradation
WEEKLY_LEGACY_TRANSFER_PLAN_V1:
purpose: >
주간 레거시종목→CMA 이전 계획(weekly_legacy_to_cma_transfer_plan_krw)을 입금이 실제로
확인되기 전까지는 deployable_cash_krw에 합산하지 않는다. 계획 단계(planned)와
확정 단계(confirmed)를 분리해 "이전될 돈을 이미 쓸 수 있는 돈"으로 취급하는 오류를 막는다.
(governance/todo/v8_9_p3_adoption_plan.yaml P3-E,
source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:implementation_todo_v8_9.P3_sell_and_rebalance,
portfolio_policy_v8_9.operator_cashflow_config)
applicable: CASH_RATIOS_V1·DEPLOYABLE_CASH_KRW_V1 계산 직전. weekly_legacy_to_cma_transfer_plan_krw가 0보다 클 때.
inputs:
- field: weekly_legacy_to_cma_transfer_plan_krw
unit: KRW
default: 4000000
note: spec/risk/portfolio_exposure.yaml의 operator_cashflow_config 고정 계획값(월별 갱신).
- field: transfer_confirmed
unit: boolean
note: 실제 계좌 입금 확인 여부. 계획만으로는 false.
- field: transfer_confirmed_amount_krw
unit: KRW_or_null
note: 확인된 입금액. transfer_confirmed=false면 null.
rule: >
transfer_confirmed=false인 동안 weekly_legacy_to_cma_transfer_plan_krw는 deployable_cash_krw
계산에 포함되지 않는다(plan_status=PLANNED_NOT_DEPLOYABLE). transfer_confirmed=true가 되면
transfer_confirmed_amount_krw만 deployable_cash_krw에 합산한다(plan_status=CONFIRMED_DEPLOYABLE).
계획액과 확정액이 다르면 확정액을 우선한다(계획액으로 추정 보완 금지).
output:
field: deployable_cash_contribution_krw
unit: KRW
additional_outputs:
- plan_status
missing_policy: transfer_confirmed가 null이면 false로 간주(보수적 — 입금 미확인 상태와 동일 처리).
canonical_ref: spec/risk/portfolio_exposure.yaml:cash_floor
implementation: tools/build_weekly_legacy_transfer_plan_v1.py
owner: quant_team
lifecycle_state: shadow
input_fields:
- weekly_legacy_to_cma_transfer_plan_krw
- transfer_confirmed
- transfer_confirmed_amount_krw
output_fields:
- deployable_cash_contribution_krw
- plan_status
golden_cases:
- V89_005_deployable_cash_negative
activation_threshold:
min_t20_sample: 30
retirement_condition: performance_degradation