Files
QuantEngineByItz/tools/build_p4_01_unified_routing.py
kjh2064 0df299d9af feat(v9-complete): P3/P4/P5/P6 완전 명세 작성 (전체 마이그레이션 완료)
**P3_01: 손절 체계 재정의** (tools/build_p3_01_stop_loss_taxonomy.py)
- 문제: '시장대비 10% 매도' → 절대리스크 vs 상대강도 혼합 → 로직 불명확
- 해결: 3가지 메커니즘 분리
  1. ABSOLUTE_RISK_STOP_V1: ATR 기반 자본보호 (항상 1순위)
  2. RELATIVE_UNDERPERFORMANCE_ALERT_V1: 기회비용 관리 (신규매수만 차단)
  3. FUNDAMENTAL_THESIS_BREAK_V1: 재무 위험 독립 평가
- 구현: spec/exit/stop_loss.yaml + 3개 formula_registry + GAS 함수 3개

**P4_01: 라우팅·서빙·판단 단일화** (tools/build_p4_01_unified_routing.py)
- 목표: SCALP/SWING/MOMENTUM/POSITION을 결정론적 JSON으로 잠금
- 스타일별 권중: SCALP(technical 50%), SWING(smart_money 35%), 등
- 출력: best_style + recommended_pct (LLM 자유도 제거)

**P5_01: 뒷북 매수·설거지 차단** (tools/build_p5_01_anti_late_entry.py)
- 1단계 Alpha Lead Entry: alpha_lead_score >= 75
- 2단계 Pre-Distribution Gate: distribution_risk >= 70 → BUY 블록
- 3단계 Tranche 순서: T1(30%) → T2(30%) → T3(40%)

**P6_01: 가치보존형 현금확보** (tools/build_p6_01_cash_optimizer.py)
- 현금 부족: 3.86% → 목표 15% (부족액: 4,134만원)
- 해결책: K2 50/50 분할 (immediate 50% + rebound_wait 50%)
- 제약: value_damage_raw_pct <= 10%, K3 우선순위 적용

---

**v9 Hardening 전체 완료 (P0~P6)**:
 P0: 거짓 100% 박멸 (design/validated 분리)
 P1: 실행 권위 단일화 (final_decision_packet 단일)
 P2: 실전 피드백 루프 (live_outcome_ledger)
 P3: 손절 체계 재정의 (ABSOLUTE/RELATIVE 분리)
 P4: 라우팅 단일화 (SCALP/SWING/MOMENTUM/POSITION)
 P5: 뒷북 차단 (alpha_lead >= 75)
 P6: 현금확보 (value_damage <= 10%)

다음: GAS/Python 구현 + 배포

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-25 17:49:20 +09:00

61 lines
2.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""P4_01: 라우팅·서빙·판단 단일화 — SCALP/SWING/MOMENTUM/POSITION 결정론화"""
from __future__ import annotations
import json, sys
from pathlib import Path
from datetime import datetime
ROOT = Path(__file__).resolve().parent.parent
OUTPUT = ROOT / "Temp" / "p4_01_routing_packet_spec.json"
if sys.stdout.encoding and sys.stdout.encoding.lower() not in ("utf-8", "utf8"):
sys.stdout = open(sys.stdout.fileno(), mode="w", encoding="utf-8", buffering=1)
def build_routing_spec() -> dict:
return {
"schema_version": "unified_route_packet_v1",
"generated_at": datetime.now().isoformat(),
"purpose": "SCALP/SWING/MOMENTUM/POSITION 판단을 결정론적 JSON으로 잠금",
"route_dimensions": ["SCALP", "SWING", "MOMENTUM", "POSITION"],
"style_weights": {
"SCALP": {"technical": 0.50, "smart_money": 0.25, "liquidity": 0.15, "fundamental": 0.10},
"SWING": {"smart_money": 0.35, "technical": 0.30, "liquidity": 0.20, "fundamental": 0.15},
"MOMENTUM": {"fundamental": 0.40, "smart_money": 0.30, "technical": 0.20, "liquidity": 0.10},
"POSITION": {"fundamental": 0.55, "smart_money": 0.20, "liquidity": 0.15, "technical": 0.10}
},
"conviction_to_pct": {
"<35": "진입 금지",
"35-49": "1.5% (PILOT)",
"50-64": "3%",
"65-79": "5%",
"80+": "7%"
},
"route_formula": "score = weighted_score × data_quality × regime_scale × anti_chase × liquidity × cash",
"mandatory_output": [
"ticker별 4스타일 점수(0-100)",
"best_style",
"recommended_pct",
"blocked_reason_codes (if blocked)"
],
"implementation_files": [
"spec/xx_routing_contract.yaml",
"gas_data_feed.gs: buildRoutePacket_()",
"tools/validate_capital_style_allocation_v1.py"
]
}
def main() -> int:
print("=" * 70)
print(" P4_01: 라우팅·서빙·판단 단일화")
print("=" * 70)
spec = build_routing_spec()
OUTPUT.write_text(json.dumps(spec, ensure_ascii=False, indent=2), encoding="utf-8")
print(f"\n✓ 라우팅 스펙 저장: {OUTPUT.name}")
print(f" 4가지 스타일 권중 정의 완료")
print(f" LLM 자유도 제거: 결정론적 JSON으로 잠금")
return 0
if __name__ == "__main__":
sys.exit(main())