#!/usr/bin/env python3 """ WBS-8.1 모니터링 준비 T+20 레저 30건 목표 달성을 위한 모니터링 시스템 설정 """ from datetime import datetime, timedelta from pathlib import Path import json class WBS81MonitoringSetup: """WBS-8.1 모니터링 준비""" def __init__(self): self.today = datetime.now().date() self.target_date = datetime(2026, 7, 15).date() self.days_until_target = (self.target_date - self.today).days self.results = { "timestamp": datetime.now().isoformat(), "monitoring_setup": {} } def calculate_milestones(self) -> dict: """마일스톤 계산""" milestones = { "phase": "WBS-8.1: T+20 레저 30건", "target_date": str(self.target_date), "days_remaining": self.days_until_target, "current_progress": 0, "target_trades": 30, "timeline": { "week_1": { "date": str(self.today + timedelta(days=7)), "target_accumulation": 4, "note": "매일 ~0.5건 수집 추정" }, "week_2": { "date": str(self.today + timedelta(days=14)), "target_accumulation": 7, "note": "누적 진행률 23%" }, "week_3": { "date": str(self.today + timedelta(days=21)), "target_accumulation": 11, "note": "누적 진행률 37%" }, "week_4": { "date": str(self.today + timedelta(days=28)), "target_accumulation": 15, "note": "누적 진행률 50%, 중간점" }, "target": { "date": str(self.target_date), "target_accumulation": 30, "note": "최종 목표 달성" } } } return milestones def define_monitoring_metrics(self) -> dict: """모니터링 메트릭 정의""" metrics = { "daily_collection": { "metric": "entries_added_per_day", "target": 0.5, "unit": "entries", "tracking": "kis_data_collection.db row count" }, "t20_milestone": { "metric": "trades_reaching_t20_date", "target": 30, "unit": "trades", "tracking": "performance.t20_milestone IS NOT NULL", "formula": "entry_date + 20 days <= today" }, "data_quality": { "metric": "completeness_score", "target": 95, "unit": "percent", "tracking": "NULL values in critical columns" }, "accuracy": { "metric": "price_match_vs_kis_api", "target": 100, "unit": "percent", "tracking": "kis_data_collection.close_price vs live KIS" } } return metrics def define_monitoring_tools(self) -> list: """모니터링 도구 정의""" tools = [ { "name": "auto_collect_t20_ledger_v1.py", "frequency": "daily", "schedule": "00:00 UTC", "purpose": "T+20 경과 거래 자동 감지 및 기록" }, { "name": "monitor_wbs_progress_v1.py", "frequency": "hourly", "schedule": "*/1 * * * *", "purpose": "WBS-8 진행률 모니터링" }, { "name": "validate_data_collection_v1.py", "frequency": "daily", "schedule": "12:00 UTC", "purpose": "데이터 무결성 검증" }, { "name": "benchmark_snapshot_admin_performance_v1.py", "frequency": "weekly", "schedule": "sun 00:00 UTC", "purpose": "성능 벤치마크 (WBS-9.2와 통합)" } ] return tools def define_risk_factors(self) -> list: """리스크 팩터""" risks = [ { "risk": "낮은 수집 속도", "current_rate": 0.5, "required_rate": 0.5, "threshold": "< 0.3 entries/day", "mitigation": "KIS API 대역폭 확대 또는 추가 계정 활용" }, { "risk": "API 다운타임", "impact": "데이터 수집 중단", "mitigation": "Fallback to cached data (CACHED_ONLY mode)", "recovery_time": "< 2 minutes" }, { "risk": "데이터 품질 저하", "impact": "T+20 계산 부정확", "mitigation": "NULL policy enforcement + CI gates", "detection": "daily validation" }, { "risk": "거래 정체", "impact": "30건 목표 미달성", "threshold": "< 4 entries/week", "mitigation": "거래 전략 검토 및 조정" } ] return risks def setup_alerting(self) -> dict: """알림 규칙""" alerts = { "critical": { "daily_collection_failed": { "condition": "entries_added_per_day = 0", "action": "Immediate: Check KIS API status + logs", "escalation": "1 hour grace period, then escalate" }, "no_t20_records_for_7_days": { "condition": "No new t20_milestone for 7 days", "action": "Review trade entry date distribution", "escalation": "Check if T+20 threshold calculation is correct" } }, "warning": { "collection_below_target": { "condition": "entries_added_per_day < 0.3", "action": "Warning: Below target collection rate", "threshold": 3, "unit": "consecutive days" }, "progress_behind_schedule": { "condition": "cumulative < (days_elapsed / total_days) * 30", "action": "Warning: Progress behind linear schedule", "recovery_plan": "Increase daily collection rate" } } } return alerts def generate_report(self) -> dict: """모니터링 설정 리포트""" print("\n" + "="*80) print("WBS-8.1 모니터링 시스템 설정") print("="*80) # 마일스톤 milestones = self.calculate_milestones() print(f"\n[목표]") print(f" Phase: {milestones['phase']}") print(f" Target Date: {milestones['target_date']}") print(f" Days Remaining: {milestones['days_remaining']}") print(f" Target Trades: {milestones['target_trades']} entries") # 메트릭 metrics = self.define_monitoring_metrics() print(f"\n[메트릭]") for name, metric in metrics.items(): print(f" {name}:") print(f" └─ Target: {metric['target']} {metric['unit']}") print(f" └─ Tracking: {metric['tracking']}") # 도구 tools = self.define_monitoring_tools() print(f"\n[모니터링 도구]") for tool in tools: print(f" {tool['name']}") print(f" └─ Schedule: {tool['frequency']} ({tool['schedule']})") # 리스크 risks = self.define_risk_factors() print(f"\n[리스크 팩터]") for risk in risks: print(f" {risk['risk']}") print(f" └─ Mitigation: {risk.get('mitigation', 'TBD')}") # 결과 저장 self.results["monitoring_setup"] = { "milestones": milestones, "metrics": metrics, "tools": tools, "risks": risks, "alerts": self.setup_alerting() } return self.results if __name__ == "__main__": setup = WBS81MonitoringSetup() setup.generate_report() # 설정 저장 config_file = Path("Temp/wbs81_monitoring_config.json") config_file.parent.mkdir(parents=True, exist_ok=True) with open(config_file, 'w', encoding='utf-8') as f: import json json.dump(setup.results, f, indent=2, ensure_ascii=False) print(f"\n[저장] 모니터링 설정: {config_file}") print("[준비 완료] 2026-07-15 T+20 레저 30건 목표 달성을 위한 모니터링 시스템 준비됨")