#!/usr/bin/env python3 """P6_01: 가치보존형 현금확보 — 5,913만원 부족액 최소 훼손으로 조성""" from __future__ import annotations import json, sys from pathlib import Path from datetime import datetime ROOT = Path(__file__).resolve().parent.parent OUTPUT = ROOT / "Temp" / "p6_01_cash_optimizer_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_spec() -> dict: return { "schema_version": "cash_recovery_optimizer_v1", "generated_at": datetime.now().isoformat(), "problem": { "current_cash_pct": 3.86, "target_cash_pct": 15.0, "shortfall_krw": 41342219, "cash_floor_status": "BELOW_FLOOR", "market_regime": "BREAKDOWN" }, "objective": "현금 부족액 충족 AND 주식가치 훼손 최소 (raw <= 10%)", "approach": "K2 50/50 분할: immediate_qty + rebound_wait_qty", "key_rules": { "rule_1": "K2 즉시 50% / 반등 대기 50% (rebound_trigger_price 전 실행 금지)", "rule_2": "매도 순서: K3 regime_adjusted_sell_priority 사용 (코어 주도주 마지막)", "rule_3": "value_damage_raw_pct <= 10% 상한 (cap_pass=false 허용 안함)", "rule_4": "emergency_full_sell=true 조건: half_expected*2 < shortfall_min 일 때만" }, "formulas": { "rebound_trigger_price": "prevClose + 0.5*ATR20 (tick 정규화)", "value_damage_raw": "sum(target_sell_krw) / current_portfolio_value * 100" }, "implementation": [ "spec/exit/cash_recovery.yaml", "gas_data_feed.gs: calcCashRecoveryOptimizerV1_()", "tools/validate_value_preservation_v1.py (raw <= 10% 검증)" ], "sample_case": { "current_asset": 394191813, "shortfall": 41342219, "target_damage": "10% max", "expected_recovery": 37108765 } } def main() -> int: print("=" * 70) print(" P6_01: 가치보존형 현금확보") print("=" * 70) spec = build_spec() OUTPUT.write_text(json.dumps(spec, ensure_ascii=False, indent=2), encoding="utf-8") print(f"\n✓ 현금 최적화 스펙 저장: {OUTPUT.name}") print(f" 문제: 현금 3.86% → 목표 15% (부족액: 4,134만원)") print(f" 해결: K2 50/50 분할매도 + value_damage <= 10% 유지") print(f" 순서: K3 우선순위 적용 (코어 주도주 마지막)") return 0 if __name__ == "__main__": sys.exit(main())