Files
QuantEngineByItz/tools/setup_wbs81_monitoring.py
kjh2064 05d9f8ed41 코드 참조 경로 업데이트 & WBS-8.1 모니터링 준비
경로 정규화 (outputs/ → src/quant_engine/):
✓ kis_api_client_v1.py: KIS 데이터 수집 경로
✓ kis_data_collection_v1.py: 기본 DB 인자
✓ snapshot_admin_server_v1.py: KIS_COLLECTION_DB
✓ snapshot_admin_store_v1.py: DEFAULT_DB + collector_db
✓ run_snapshot_admin_server_v1.py: --db 기본값

모니터링 도구 추가:
✓ verify_admin_db.py: 어드민 서버 & DB 검증
✓ setup_wbs81_monitoring.py: WBS-8.1 목표 추적 시스템
✓ update_db_paths.py: 자동화된 경로 업데이트

효과:
- 단일 소스 (src/quant_engine/)
- 배포 스크립트 단순화
- WBS-8.1: T+20 30건 모니터링 준비 완료
- 22일 남음 (목표: 2026-07-15)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-23 00:33:32 +09:00

251 lines
8.7 KiB
Python

#!/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건 목표 달성을 위한 모니터링 시스템 준비됨")