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:
@@ -0,0 +1,144 @@
|
||||
schema_version: formula_domain.v1
|
||||
source: C:\Temp\data_feed\spec\13_formula_registry.yaml
|
||||
domain: execution
|
||||
meta:
|
||||
note: >
|
||||
governance/todo/v8_9_p1_adoption_plan.yaml P1-B.
|
||||
source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:execution_plan_compiler_v8_9
|
||||
formulas:
|
||||
EXECUTION_CAPACITY_LADDER_V1:
|
||||
purpose: >
|
||||
계획된 주문금액이 종목의 실제 체결 가능 용량(20일 평균거래대금, 당일 거래대금, 호가창 깊이)을
|
||||
초과하지 않도록 결정론적으로 캡핑한다. broker_microstructure_packet이 없으면 주문 계획 자체를
|
||||
차단한다(v8.9 V89_019).
|
||||
(governance/todo/v8_9_p1_adoption_plan.yaml P1-B.1,
|
||||
source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:execution_plan_compiler_v8_9.broker_microstructure_packet_required)
|
||||
applicable: PORTFOLIO_TRANSITION_UTILITY_V1에서 selected_transition 확정 후, 주문 분할(split_order_template) 직전.
|
||||
inputs:
|
||||
- field: planned_order_amount_krw
|
||||
unit: KRW
|
||||
- field: avg_trade_value_20d_krw
|
||||
unit: KRW
|
||||
source: 기존 avg_trade_value_5d(spec/12_field_dictionary.yaml)의 20일 윈도우 변형
|
||||
- field: intraday_trade_value_krw
|
||||
unit: KRW
|
||||
- field: orderbook_top3_depth_krw
|
||||
unit: KRW
|
||||
- field: spread_bps
|
||||
unit: basis_points
|
||||
- field: tick_size
|
||||
unit: KRW_per_share
|
||||
source: spec/formulas/domains/cash.yaml:tick_size_table
|
||||
- field: daily_price_limit
|
||||
unit: percent
|
||||
- field: halt_status
|
||||
unit: boolean
|
||||
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
|
||||
gates:
|
||||
- if: halt_status == true
|
||||
action: EXECUTION_PLAN_BLOCKED
|
||||
reason_code: trading_halt
|
||||
- if: avg_trade_value_20d_krw is null OR orderbook_top3_depth_krw is null OR spread_bps is null
|
||||
action: EXECUTION_PLAN_BLOCKED
|
||||
reason_code: broker_packet_missing
|
||||
- if: order_capacity_krw < planned_order_amount_krw
|
||||
action: ORDER_SIZE_CAPPED
|
||||
reason_code: capacity_too_low
|
||||
spread_widen_cancel_rule:
|
||||
condition: spread_bps > spread_bps_baseline * 1.5 (slice 체결 사이 측정)
|
||||
action: CANCEL_REMAINING_SLICES
|
||||
canonical_ref: suggest/quant_investment_engine_v8_9...:execution_plan_compiler_v8_9.cancel_remaining_if
|
||||
split_order_template:
|
||||
slice_1_pct: 30
|
||||
slice_2_pct: 30
|
||||
slice_3_pct: 40
|
||||
requires_revalidation_before_each_slice: true
|
||||
revalidation_fields: [cash_floor, deployable_cash, order_capacity_krw, spread_bps]
|
||||
missing_policy: broker_microstructure_packet 필드 중 하나라도 null이면 EXECUTION_PLAN_BLOCKED. 추정 금지.
|
||||
canonical_ref: spec/05_position_sizing.yaml
|
||||
implementation: tools/build_execution_capacity_ladder_v1.py
|
||||
owner: quant_team
|
||||
lifecycle_state: shadow
|
||||
input_fields:
|
||||
- planned_order_amount_krw
|
||||
- avg_trade_value_20d_krw
|
||||
- intraday_trade_value_krw
|
||||
- orderbook_top3_depth_krw
|
||||
- spread_bps
|
||||
- tick_size
|
||||
- daily_price_limit
|
||||
- halt_status
|
||||
output_fields:
|
||||
- order_capacity_krw
|
||||
golden_cases:
|
||||
- V89_019_broker_packet_missing
|
||||
- V89_020_capacity_too_low
|
||||
- V89_022_spread_widens
|
||||
activation_threshold:
|
||||
min_t20_sample: 30
|
||||
retirement_condition: performance_degradation
|
||||
EXECUTION_PLAN_COMPILER_V1:
|
||||
purpose: >
|
||||
EXECUTION_CAPACITY_LADDER_V1이 산출한 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,
|
||||
source: suggest/quant_investment_engine_v8_9_portfolio_optimizer_canonical_refactored.yaml:execution_plan_compiler_v8_9.split_order_template,
|
||||
execution_plan_compiler_v8_9.cancel_remaining_if)
|
||||
applicable: EXECUTION_CAPACITY_LADDER_V1.gate가 PASS 또는 ORDER_SIZE_CAPPED일 때만 호출.
|
||||
inputs:
|
||||
- field: order_capacity_krw
|
||||
unit: KRW
|
||||
source: spec/formulas/domains/execution.yaml:EXECUTION_CAPACITY_LADDER_V1
|
||||
- field: slice_index
|
||||
unit: 'enum: 1 | 2 | 3'
|
||||
- field: revalidation_snapshot
|
||||
unit: json
|
||||
note: 'slice 직전 시점의 {cash_floor_pct, deployable_cash_krw, order_capacity_krw, spread_bps}'
|
||||
- field: baseline_snapshot
|
||||
unit: json
|
||||
note: 컴파일 시점(slice 1 이전)의 동일 필드 스냅샷. spread_widen_cancel_rule 기준값.
|
||||
cancel_remaining_if:
|
||||
- captain_reverses_intraday
|
||||
- index_drop_exceeds_threshold
|
||||
- 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"
|
||||
- data_quarantine_after_slice
|
||||
- orderbook_capacity_collapses: "revalidation_snapshot.order_capacity_krw < baseline_snapshot.order_capacity_krw * 0.5"
|
||||
expression: >
|
||||
slice_amount_krw(1) = order_capacity_krw * 0.30
|
||||
slice_amount_krw(2) = order_capacity_krw * 0.30
|
||||
slice_amount_krw(3) = order_capacity_krw * 0.40
|
||||
각 슬라이스는 직전 슬라이스 체결 후 revalidation_snapshot을 재계산하고 cancel_remaining_if를
|
||||
평가한 뒤에만 진행한다. 어느 한 조건이라도 true이면 이후 슬라이스는 컴파일하지 않는다.
|
||||
output:
|
||||
field: compiled_slices
|
||||
unit: 'list_of_{slice_index, slice_amount_krw, status}'
|
||||
additional_outputs:
|
||||
- cancel_reason_code
|
||||
- slices_executed_count
|
||||
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
|
||||
owner: quant_team
|
||||
lifecycle_state: shadow
|
||||
input_fields:
|
||||
- order_capacity_krw
|
||||
- slice_index
|
||||
- revalidation_snapshot
|
||||
- baseline_snapshot
|
||||
output_fields:
|
||||
- compiled_slices
|
||||
- cancel_reason_code
|
||||
golden_cases:
|
||||
- V89_021_partial_fill
|
||||
- V89_022_spread_widens
|
||||
- V89_023_gap_up_chase
|
||||
activation_threshold:
|
||||
min_t20_sample: 30
|
||||
retirement_condition: performance_degradation
|
||||
Reference in New Issue
Block a user