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
+460
View File
@@ -97,6 +97,21 @@ formula_registry:
- HORIZON_REBALANCE_PLAN_V1
- PIPELINE_RUNTIME_PROFILE_V1
- STRATEGY_ROUTING_AUDIT_V1
- PORTFOLIO_TRANSITION_UTILITY_V1
- SELL_LOT_PARETO_SELECTOR_V1
- FORECAST_SIMULATION_ENGINE_V1
- SECTOR_EXPOSURE_GRAPH_V1
- LEADER_LIFECYCLE_GATE_V1
- EXECUTION_CAPACITY_LADDER_V1
- MODEL_GOVERNANCE_KILL_SWITCH_V1
- SCENARIO_SHOCK_MATRIX_V1
- TRANSITION_SET_ENUMERATOR_V1
- IMMUTABLE_DECISION_LEDGER_V1
- EXECUTION_PLAN_COMPILER_V1
- STATE_VECTOR_CONSTRUCTOR_V1
- REBALANCE_CADENCE_GATE_V1
- WALK_FORWARD_BOOTSTRAP_V1
- WEEKLY_LEGACY_TRANSFER_PLAN_V1
implementation_map:
REGIME_CONDITIONAL_MACRO_FACTOR_V1: tools/build_predictive_alpha_dialectic_engine_v2.py:NF1
REBOUND_CAPTURE_THESIS_FACTOR_V1: tools/build_predictive_alpha_dialectic_engine_v2.py:NF2
@@ -121,6 +136,21 @@ formula_registry:
HORIZON_REBALANCE_PLAN_V1: tools/build_horizon_rebalance_plan_v1.py
PIPELINE_RUNTIME_PROFILE_V1: src/quant_engine/pipeline_runtime_anomaly_lib_v1.py
STRATEGY_ROUTING_AUDIT_V1: tools/build_strategy_routing_audit_v1.py
PORTFOLIO_TRANSITION_UTILITY_V1: tools/build_portfolio_transition_optimizer_v1.py
SELL_LOT_PARETO_SELECTOR_V1: tools/build_sell_waterfall_engine_v4.py
FORECAST_SIMULATION_ENGINE_V1: tools/build_forecast_simulation_engine_v1.py
SECTOR_EXPOSURE_GRAPH_V1: tools/build_sector_exposure_graph_v1.py
LEADER_LIFECYCLE_GATE_V1: tools/build_sector_exposure_graph_v1.py
EXECUTION_CAPACITY_LADDER_V1: tools/build_execution_capacity_ladder_v1.py
MODEL_GOVERNANCE_KILL_SWITCH_V1: tools/build_model_governance_kill_switch_v1.py
SCENARIO_SHOCK_MATRIX_V1: tools/build_scenario_shock_matrix_v1.py
TRANSITION_SET_ENUMERATOR_V1: tools/build_transition_set_enumerator_v1.py
IMMUTABLE_DECISION_LEDGER_V1: tools/build_immutable_decision_ledger_v1.py
EXECUTION_PLAN_COMPILER_V1: tools/build_execution_plan_compiler_v1.py
STATE_VECTOR_CONSTRUCTOR_V1: tools/build_state_vector_constructor_v1.py
REBALANCE_CADENCE_GATE_V1: tools/build_rebalance_cadence_gate_v1.py
WALK_FORWARD_BOOTSTRAP_V1: tools/build_walk_forward_bootstrap_v1.py
WEEKLY_LEGACY_TRANSFER_PLAN_V1: tools/build_weekly_legacy_transfer_plan_v1.py
formulas:
FLOW_CREDIT_V1:
purpose: 가격·거래량·5D 수급 품질을 0~1 점수로 계산
@@ -2740,6 +2770,398 @@ formula_registry:
- rebound_tp_price가 있으면 HTS 주문표에 '반등 익절가' 컬럼 필수 표기
canonical_ref: AGENTS.md:Direction C1, K2
version: 2026-05-22_3RD_HARNESS
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
- field: tax_fee_slippage_krw
unit: KRW
- field: reentry_cost_krw
unit: KRW
- field: missed_upside_penalty_krw
unit: KRW
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:
dominates_if: >
A가 모든 maximize 목표(avoided_tail_loss_krw, cash_repair_benefit_krw, concentration_reduction_benefit_krw,
tax_loss_benefit_krw)에서 B 이상이고 모든 minimize 목표(tax_fee_slippage_krw, reentry_cost_krw,
missed_upside_penalty_krw)에서 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·tax_loss_benefit_krw 미확인 시 0(보수적 하한). DATA_MISSING으로 표기.
canonical_ref: spec/risk/portfolio_exposure.yaml:sell_priority_engine.candidate_scoring
implementation: tools/build_sell_waterfall_engine_v4.py
version: 2026-06-17_P0_v8_9_adoption
FORECAST_SIMULATION_ENGINE_V1:
purpose: >
개별 종목의 점 추정 기대수익률이 아니라 레짐별 손익분포에서 CE70(30%분위)·CE90(10%분위)·
CVaR95(95% 신뢰구간 꼬리손실 평균)를 산출한다. 표본 부족 시 가짜 분포를 만들지 않고
WATCH_ONLY 또는 DATA_MISSING으로 정직하게 반환한다.
(governance/todo/v8_9_p0_adoption_plan.yaml P0-3.1,
source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:forecast_and_simulation_engine_v8_9)
applicable: PORTFOLIO_TRANSITION_UTILITY_V1의 ce70_net_profit_krw 입력 직전.
inputs:
- field: net_profit_distribution_after_tax_fee_slippage
source: spec/29_backtest_harness_contract.yaml:current_metrics
unit: list_of_KRW
- field: sample_count_total
unit: count
- field: sample_count_same_regime
unit: count
- field: execution_mode
unit: enum
minimum_sample_rules:
AUDIT_ONLY: {sample_count_total_min: 0, sample_count_same_regime_min: 0}
SHADOW: {sample_count_total_min: 30, sample_count_same_regime_min: 10}
PILOT: {sample_count_total_min: 80, sample_count_same_regime_min: 20}
LIVE_LIMITED: {sample_count_total_min: 150, sample_count_same_regime_min: 30}
LIVE_FULL: {sample_count_total_min: 300, sample_count_same_regime_min: 50}
agents_md_cross_check: "AGENTS.md §6b: Live T+20 표본 30건 미만이면 active/PASS_100 승격 금지"
expression:
ce70_net_profit_krw: quantile(net_profit_distribution_after_tax_fee_slippage, 0.30)
ce90_net_profit_krw: quantile(net_profit_distribution_after_tax_fee_slippage, 0.10)
cvar95_loss_krw: mean(losses beyond 95th percentile loss threshold in net_profit_distribution_after_tax_fee_slippage)
output:
field: ce70_net_profit_krw
unit: KRW_or_null
missing_policy: 표본이 minimum_sample_rules 미달이면 모든 출력 null + gate=WATCH_ONLY. 0으로 대체 금지.
canonical_ref: spec/29_backtest_harness_contract.yaml:current_metrics.walk_forward
implementation: tools/build_forecast_simulation_engine_v1.py
version: 2026-06-17_P0_v8_9_adoption
SECTOR_EXPOSURE_GRAPH_V1:
purpose: >
섹터를 L1:L2:L3:L4 canonical ID로 분류하고 ETF 구성종목을 lookthrough하여 직접보유와
합산한 실질노출을 계산하며, 테마 간 중복 베타를 residualize한다.
(governance/todo/v8_9_p1_adoption_plan.yaml P1-A.1)
canonical_sector_id_format: 'L1:L2:L3:L4, 예: EQ:TECH:SEMIS:HBM'
inputs:
- field: direct_weight_pct
unit: percent
- field: etf_constituents_json
unit: json
- field: etf_weight_pct
unit: percent
- field: sector_id
unit: string
- field: peer_sector_betas
unit: list_of_ratio
expression:
lookthrough_etf_weight_pct: "sum(constituent.weight_pct * etf_weight_pct / 100 for constituent in etf_constituents_json if constituent.sector_id == sector_id)"
sector_family_total_pct: "direct_weight_pct + lookthrough_etf_weight_pct"
output:
field: sector_family_total_pct
unit: percent
missing_policy: etf_constituents_json 미확인 시 ETF_BUY_BLOCKED. lookthrough를 0으로 추정 금지.
canonical_ref: spec/risk/portfolio_exposure.yaml:duplicate_exposure_rule
implementation: tools/build_sector_exposure_graph_v1.py
version: 2026-06-17_P1_v8_9_adoption
LEADER_LIFECYCLE_GATE_V1:
purpose: >
종목의 시장 주도력을 CAPTAIN/CORE_LEADER/ENABLER/CYCLICAL_BETA/LAGGARD/DISTRIBUTION_RISK로
분류하고 승급·강등을 결정론적으로 평가한다.
(governance/todo/v8_9_p1_adoption_plan.yaml P1-A.2)
roles: [CAPTAIN, CORE_LEADER, ENABLER, CYCLICAL_BETA, LAGGARD, DISTRIBUTION_RISK]
inputs:
- field: relative_strength_leads_sector
unit: boolean
- field: volume_quality_confirmed
unit: boolean
- field: above_ma60_or_reclaim_confirmed
unit: boolean
- field: earnings_revision_status
unit: 'enum: positive | neutral | negative'
- field: institutional_flow_status
unit: 'enum: accumulation | neutral | distribution'
- field: current_role
unit: enum
output:
field: leader_role
unit: enum
missing_policy: 입력 결측 시 current_role 유지. 임의 승급/강등 금지.
canonical_ref: spec/strategy/leader_scan.yaml
implementation: tools/build_sector_exposure_graph_v1.py
version: 2026-06-17_P1_v8_9_adoption
EXECUTION_CAPACITY_LADDER_V1:
purpose: >
계획된 주문금액이 종목의 실제 체결 가능 용량을 초과하지 않도록 캡핑하고,
broker_microstructure_packet이 없으면 주문 계획을 차단한다.
(governance/todo/v8_9_p1_adoption_plan.yaml P1-B.1)
inputs:
- field: planned_order_amount_krw
unit: KRW
- field: avg_trade_value_20d_krw
unit: KRW
- field: intraday_trade_value_krw
unit: KRW
- field: orderbook_top3_depth_krw
unit: KRW
- field: spread_bps
unit: basis_points
expression: >
order_capacity_krw = min(planned_order_amount_krw, avg_trade_value_20d_krw * 0.003,
intraday_trade_value_krw * 0.01, orderbook_top3_depth_krw * 0.30)
output:
field: order_capacity_krw
unit: KRW
missing_policy: broker_microstructure_packet 필드 결측 시 EXECUTION_PLAN_BLOCKED. 추정 금지.
canonical_ref: spec/05_position_sizing.yaml
implementation: tools/build_execution_capacity_ladder_v1.py
version: 2026-06-17_P1_v8_9_adoption
MODEL_GOVERNANCE_KILL_SWITCH_V1:
purpose: >
data_quarantine_rate, implementation_shortfall, T5_hit_rate, calibration_error,
drawdown 5개 지표를 감시해 기준 이탈 시 execution_mode를 자동으로 한 단계 강등한다.
(governance/todo/v8_9_p1_adoption_plan.yaml P1-C.1)
promotion_ladder: [AUDIT_ONLY, SHADOW, PILOT, LIVE_LIMITED, LIVE_FULL]
inputs:
- field: data_quarantine_rate_pct
unit: percent
- field: implementation_shortfall_ratio
unit: ratio
- field: t5_hit_rate_pct
unit: percent
- field: t5_sample_count
unit: count
- field: calibration_error
unit: ratio
- field: calibration_error_limit
unit: ratio
- field: account_mdd_pct
unit: percent
- field: account_mdd_budget_pct
unit: percent
kill_switch_conditions:
- id: data_quarantine_rate_above_5pct
condition: data_quarantine_rate_pct > 5.0
- id: implementation_shortfall_above_2x_expected
condition: implementation_shortfall_ratio > 2.0
- id: t5_hit_rate_below_50pct_for_30_trades
condition: t5_sample_count >= 30 AND t5_hit_rate_pct < 50.0
- id: calibration_error_above_limit
condition: calibration_error > calibration_error_limit
- id: unexpected_drawdown_breach
condition: account_mdd_pct > account_mdd_budget_pct
output:
field: execution_mode
unit: enum
missing_policy: 입력 결측 시 평가 가능한 지표만으로 판정. 전부 결측이면 execution_mode 변경 없음(DATA_MISSING).
canonical_ref: spec/57_shadow_promotion_scorecard.yaml
implementation: tools/build_model_governance_kill_switch_v1.py
version: 2026-06-17_P1_v8_9_adoption
SCENARIO_SHOCK_MATRIX_V1:
purpose: >
base_case 분포에 adverse/liquidity_drought/crisis/fx_shock/tax_cost 5개 스트레스를
결정론적으로 적용해 시나리오별 CE70/CVaR95를 산출한다.
(governance/todo/v8_9_p2_adoption_plan.yaml P2-A)
scenario_definitions:
base_case: {shock_multiplier: 1.0}
adverse_case: {shock_multiplier: 1.5}
liquidity_drought_case: {shock_multiplier: 1.3, capacity_derate_pct: 40}
crisis_case: {shock_multiplier: 2.0, correlation_to_one: true}
fx_shock_case: {shock_multiplier: 1.2, applies_only_to: foreign_assets}
tax_cost_case: {shock_multiplier: 1.0, additional_cost_pct: 5}
inputs:
- field: net_profit_distribution_after_tax_fee_slippage
unit: list_of_KRW
- field: scenario_id
unit: enum
output:
field: scenario_results
unit: 'list_of_{scenario_id, scenario_ce70_krw, scenario_cvar95_krw}'
missing_policy: 분포 없으면 전체 DATA_MISSING. 시나리오별 임의 분포 생성 금지.
canonical_ref: spec/formulas/domains/simulation.yaml:FORECAST_SIMULATION_ENGINE_V1
implementation: tools/build_scenario_shock_matrix_v1.py
version: 2026-06-17_P2_v8_9_adoption
TRANSITION_SET_ENUMERATOR_V1:
purpose: >
candidate 1건씩이 아니라 조합(transition_set) 단위로 hard_constraint_pass와
transition_utility_krw를 재평가해, 개별로는 통과하는 후보들의 조합이 cash_floor·
concentration cap을 넘는 경우를 차단한다.
(governance/todo/v8_9_p2_adoption_plan.yaml P2-B)
inputs:
- field: evaluated_candidates
unit: list_of_object
- field: max_set_size
unit: count
default: 3
output:
field: selected_transition_set
unit: list_of_candidate_id
missing_policy: evaluated_candidates 비어있으면 selected_transition_set=[] + NO_TRADE.
canonical_ref: spec/formulas/domains/portfolio.yaml:PORTFOLIO_TRANSITION_UTILITY_V1
implementation: tools/build_transition_set_enumerator_v1.py
version: 2026-06-17_P2_v8_9_adoption
IMMUTABLE_DECISION_LEDGER_V1:
purpose: >
모든 의사결정을 append-only로 기록한다. 동일 decision_id 재기록은 거부하고,
T1/T5/T20/MAE/MFE는 원본 레코드를 수정하지 않고 별도 append로만 추가한다.
(governance/todo/v8_9_p2_adoption_plan.yaml P2-C)
inputs:
- field: decision_id
unit: string
- field: input_hash_bundle
unit: string
- field: execution_mode
unit: enum
- field: candidate_ids
unit: list_of_string
- field: selected_transition_id
unit: string_or_null
required_fields:
- decision_id
- timestamp
- engine_version
- input_hash_bundle
- execution_mode
- candidate_ids
- selected_transition_id
- hard_blocks
- transition_utility_krw
- operator_override
- order_ids
- fill_prices
- slippage
- T1_return
- T5_return
- T20_return
- MAE
- MFE
output:
field: ledger_append_status
unit: 'enum: APPENDED | DUPLICATE_DECISION_ID | REJECTED_MISSING_FIELDS'
missing_policy: required_fields 결측 시 REJECTED_MISSING_FIELDS.
canonical_ref: spec/formulas/domains/portfolio.yaml:PORTFOLIO_TRANSITION_UTILITY_V1
implementation: tools/build_immutable_decision_ledger_v1.py
version: 2026-06-17_P2_v8_9_adoption
EXECUTION_PLAN_COMPILER_V1:
purpose: >
order_capacity_krw를 30/30/40 LIMIT_SPLIT 슬라이스로 컴파일하고, 슬라이스 실행 직전마다
cash_floor·capacity·spread를 재검증해 cancel_remaining_if 조건 충족 시 잔여 슬라이스를 취소한다.
(governance/todo/v8_9_p2_adoption_plan.yaml P2-D)
inputs:
- field: order_capacity_krw
unit: KRW
- field: revalidation_snapshot
unit: json
- field: baseline_snapshot
unit: json
cancel_remaining_if:
- spread_widens_beyond_limit: "revalidation_snapshot.spread_bps > baseline_snapshot.spread_bps * 1.5"
- cash_floor_after_fill_breached: "revalidation_snapshot.cash_floor_pct < required_cash_pct"
- orderbook_capacity_collapses: "revalidation_snapshot.order_capacity_krw < baseline_snapshot.order_capacity_krw * 0.5"
output:
field: compiled_slices
unit: 'list_of_{slice_index, slice_amount_krw, status}'
missing_policy: order_capacity_krw 또는 baseline_snapshot 결측 시 EXECUTION_PLAN_BLOCKED.
canonical_ref: spec/formulas/domains/execution.yaml:EXECUTION_CAPACITY_LADDER_V1
implementation: tools/build_execution_plan_compiler_v1.py
version: 2026-06-17_P2_v8_9_adoption
STATE_VECTOR_CONSTRUCTOR_V1:
purpose: >
holdings, cash, tax_lots, sector_graph, factor_exposures, macro_regime_probabilities를
단일 state_vector로 통합한다. 결측 component는 null로 유지하고 추정 보완 금지.
(governance/todo/v8_9_p3_adoption_plan.yaml P3-A)
inputs:
- field: cash_ladder
unit: json
- field: positions
unit: list_of_object
- field: sector_exposure_graph
unit: list_of_object
- field: factor_exposures
unit: list_of_object
- field: tax_lots
unit: list_of_object
- field: risk_bucket_weights
unit: object
- field: macro_regime_probabilities
unit: object
- field: goal_progress_pct
unit: percent
output:
field: state_vector
unit: object
missing_policy: 결측 component는 null + missing_components 기록. 추정 보완 금지.
canonical_ref: spec/formulas/domains/portfolio.yaml:PORTFOLIO_TRANSITION_UTILITY_V1
implementation: tools/build_state_vector_constructor_v1.py
version: 2026-06-17_P3_v8_9_adoption
REBALANCE_CADENCE_GATE_V1:
purpose: >
주간/1·11·21일 점검을 의무 실행하되, transition_utility_after_tax_cost가 양수이거나
hard_risk_block이 active일 때만 실제 리밸런싱 실행을 허용한다.
(governance/todo/v8_9_p3_adoption_plan.yaml P3-D)
mandatory_schedule:
weekly_days: [SATURDAY, SUNDAY]
monthly_mid_check_days: [1, 11, 21]
inputs:
- field: today_date
unit: date
- field: transition_utility_after_tax_cost_krw
unit: number_or_null
- field: hard_risk_block_active
unit: boolean
output:
field: rebalance_execution_allowed
unit: boolean
missing_policy: 양쪽 입력 모두 결측 시 rebalance_execution_allowed=false + DATA_MISSING.
canonical_ref: spec/risk/aggregate_risk.yaml
implementation: tools/build_rebalance_cadence_gate_v1.py
version: 2026-06-17_P3_v8_9_adoption
WALK_FORWARD_BOOTSTRAP_V1:
purpose: >
historical_returns에서 walk-forward(비복원, in/out-of-sample 분리) 및 regime-matched
(동일 레짐 필터 + 복원추출) 리샘플링으로 net_profit_distribution을 생성한다.
(governance/todo/v8_9_p3_adoption_plan.yaml P3-B)
inputs:
- field: historical_returns
unit: list_of_object
- field: current_regime_state
unit: string
- field: bootstrap_method
unit: enum
output:
field: net_profit_distribution_after_tax_fee_slippage
unit: list_of_KRW_or_null
missing_policy: historical_returns 결측 또는 표본 1건 이하면 null + DATA_MISSING.
canonical_ref: spec/29_backtest_harness_contract.yaml:current_metrics.walk_forward
implementation: tools/build_walk_forward_bootstrap_v1.py
version: 2026-06-17_P3_v8_9_adoption
WEEKLY_LEGACY_TRANSFER_PLAN_V1:
purpose: >
주간 레거시→CMA 이전 계획을 입금 확인 전까지 deployable_cash_krw에 합산하지 않는다.
(governance/todo/v8_9_p3_adoption_plan.yaml P3-E)
inputs:
- field: weekly_legacy_to_cma_transfer_plan_krw
unit: KRW
default: 4000000
- field: transfer_confirmed
unit: boolean
- field: transfer_confirmed_amount_krw
unit: KRW_or_null
output:
field: deployable_cash_contribution_krw
unit: KRW
missing_policy: transfer_confirmed null이면 false로 간주.
canonical_ref: spec/risk/portfolio_exposure.yaml:cash_floor
implementation: tools/build_weekly_legacy_transfer_plan_v1.py
version: 2026-06-17_P3_v8_9_adoption
SELL_EXECUTION_TIMING_V1:
purpose: '장중 가격 움직임에 따라 매도 주문 유형과 타이밍을 결정론적으로 판정. 장초반 패닉 매도, 반등 직전 저점 투매 방지.
@@ -4530,6 +4952,44 @@ formula_registry:
implementation: tools/build_predictive_alpha_dialectic_engine_v2.py:NF1
calibration_ref: spec/calibration_registry.yaml:NF1 (EXPERT_PRIOR)
version: 2026-06-04_NF1
PORTFOLIO_TRANSITION_UTILITY_V1:
purpose: >
개별 매수·매도 추천이 아니라 포트폴리오 전체의 사후 상태(전환 후 cash floor, 집중도, CVaR,
세후비용, 회전율)를 비교해 단일 최선 전환 또는 NO_TRADE를 결정론적으로 선택한다.
(governance/todo/v8_9_p0_adoption_plan.yaml P0-1.2,
source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:portfolio_transition_optimizer_v8_9)
default_action: NO_TRADE
inputs:
- field: ce70_net_profit_krw
source: Temp/forecast_simulation_engine_v1.json
unit: KRW
missing_policy: DATA_MISSING — candidate excluded, not assumed zero
- field: tax_fee_slippage_krw
source: Temp/sell_waterfall_engine_v4.json
unit: KRW
- field: cash_repair_benefit_krw
source: Temp/smart_cash_recovery_v9.json
unit: KRW
- field: concentration_reduction_benefit_krw
unit: KRW
- field: turnover_penalty_krw
unit: KRW
expression: >
transition_utility_krw = ce70_net_profit_krw - tax_fee_slippage_krw - cvar_penalty_krw
- drawdown_penalty_krw + cash_repair_benefit_krw + concentration_reduction_benefit_krw
- turnover_penalty_krw
output:
field: transition_utility_krw
unit: KRW
deterministic_fallbacks:
missing_optimizer_inputs: NO_TRADE_AND_QUARANTINE
solver_failure: NO_TRADE_AND_LOG_SOLVER_FAILURE
rank_tie: choose_lower_turnover_lower_tax_lower_marginal_risk_contribution
conflicting_runtime_packets: BLOCK_AND_REQUIRE_MANIFEST_REPAIR
missing_policy: hard_constraint_input_missing 시 NO_TRADE_AND_QUARANTINE
implementation: tools/build_portfolio_transition_optimizer_v1.py
canonical_ref: spec/formulas/domains/portfolio.yaml:PORTFOLIO_TRANSITION_UTILITY_V1
version: 2026-06-17_P0_v8_9_adoption
REBOUND_CAPTURE_THESIS_FACTOR_V1:
purpose: 과매도 반등 진입을 thesis 팩터로 명시 — 영구 약세편향 해소 (Direction SFP1)
agents_md_ref: 'Direction SFP1: SINGLE_FACTOR_DOMINANCE_CAP_V1 — REBOUND_CAPTURE