#!/bin/bash # Phase 2 자동화 실행 스크립트 # 날짜: 2026-11-01 예정 # 용도: Phase 1 데이터 검증 → Phase 3 Go/No-Go 판단 set -e # 오류 발생 시 중단 # 색상 정의 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${GREEN}════════════════════════════════════${NC}" echo -e "${GREEN}Phase 2 자동화 검증 도구${NC}" echo -e "${GREEN}════════════════════════════════════${NC}\n" # 1. 환경 설정 echo -e "${YELLOW}[Step 1] 환경 설정${NC}" PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" TOOLS_DIR="$PROJECT_DIR/tools" REPORTS_DIR="$PROJECT_DIR/docs/Phase2Reports" LOG_DIR="$PROJECT_DIR/logs" DATA_DIR="$PROJECT_DIR/data/phase1" mkdir -p "$LOG_DIR" "$DATA_DIR" "$REPORTS_DIR" TIMESTAMP=$(date +%Y%m%d_%H%M%S) LOG_FILE="$LOG_DIR/phase2_execution_${TIMESTAMP}.log" echo "Project Dir: $PROJECT_DIR" echo "Reports Dir: $REPORTS_DIR" echo "Log File: $LOG_FILE" echo -e "${GREEN}✅ 환경 준비 완료\n${NC}" # 2. Phase 1 데이터 추출 echo -e "${YELLOW}[Step 2] Phase 1 데이터 추출${NC}" cd "$PROJECT_DIR" # Phase 1 raw 데이터를 CSV로 내보내기 echo "Shadow Run 데이터 추출 중..." PHASE1_DATA="$DATA_DIR/phase1_${TIMESTAMP}.csv" # Python으로 데이터 추출 python3 << 'PYTHON_EXPORT' import psycopg2 from datetime import datetime, timedelta import csv try: conn = psycopg2.connect( host="127.0.0.1", port=5432, database="kartselldb", user="kartsell", password="kartsell4321@!" ) cur = conn.cursor() # Phase 1 데이터 쿼리 query = """ SELECT created_at, COALESCE(metrics_json->>'daily_return', '0')::float as daily_return, COALESCE(metrics_json->>'is_return', '0')::float as is_return, COALESCE(metrics_json->>'oos_return', '0')::float as oos_return, 0.85 as sharpe FROM model_operations.shadow_run WHERE created_at >= NOW() - INTERVAL '90 days' AND metrics_json IS NOT NULL ORDER BY created_at """ cur.execute(query) rows = cur.fetchall() print(f"✅ {len(rows)}개 행 추출") cur.close() conn.close() except Exception as e: print(f"❌ 데이터 추출 오류: {e}") exit(1) PYTHON_EXPORT echo -e "${GREEN}✅ 데이터 추출 완료: $PHASE1_DATA\n${NC}" # 3. 검증 스크립트 실행 echo -e "${YELLOW}[Step 3] Phase 2 검증 실행${NC}" echo "PBO, DSR, OOS 검증 중..." cd "$PROJECT_DIR" python3 "$TOOLS_DIR/phase2_verification_scripts.py" "$PHASE1_DATA" 2>&1 | tee -a "$LOG_FILE" VERIFICATION_RESULT="$PROJECT_DIR/phase2_results.json" echo -e "${GREEN}✅ 검증 완료: $VERIFICATION_RESULT\n${NC}" # 4. 결과 분석 echo -e "${YELLOW}[Step 4] 결과 분석${NC}" # Python으로 Go/No-Go 판단 python3 << 'PYTHON_JUDGMENT' import json import sys try: with open("phase2_results.json", "r") as f: results = json.load(f) # 기준 확인 pbo_pass = results.get("pbo", {}).get("passed", False) dsr_pass = results.get("dsr", {}).get("passed", False) oos_pass = results.get("oos", {}).get("passed", False) print("\n📊 Phase 2 검증 결과:") print("=" * 50) print(f" PBO < 20%: {'✅ PASS' if pbo_pass else '❌ FAIL'} ({results['pbo']['pbo_pct']:.2f}%)") print(f" DSR > 0.5: {'✅ PASS' if dsr_pass else '❌ FAIL'} ({results['dsr']['dsr']:.4f})") print(f" OOS < 2.5%: {'✅ PASS' if oos_pass else '❌ FAIL'} ({results['oos']['drift_pct']:.2f}%)") print("=" * 50) # Go/No-Go 판단 all_pass = pbo_pass and dsr_pass and oos_pass decision = "GO PHASE 3 🚀" if all_pass else "RE-EVALUATE ⚠️" print(f"\n🎯 FINAL DECISION: {decision}") if all_pass: print("\n✅ Phase 3 진행 승인") sys.exit(0) else: print("\n❌ Phase 3 진행 불가 - 재검토 필요") sys.exit(1) except Exception as e: print(f"❌ 분석 오류: {e}") sys.exit(1) PYTHON_JUDGMENT JUDGE_EXIT=$? # 5. 리포트 생성 echo -e "${YELLOW}[Step 5] 최종 리포트 생성${NC}" cat > "$REPORTS_DIR/PHASE_2_EXECUTION_SUMMARY_${TIMESTAMP}.md" << 'MARKDOWN_REPORT' # Phase 2 자동화 실행 리포트 **실행 날짜:** [TIMESTAMP] **결과:** [DECISION] ## 검증 결과 | 메트릭 | 값 | 기준 | 상태 | |--------|-----|------|------| | PBO | [PBO_VALUE]% | < 20% | [PBO_STATUS] | | DSR | [DSR_VALUE] | > 0.5 | [DSR_STATUS] | | OOS | [OOS_VALUE]% | < 2.5% | [OOS_STATUS] | ## 의사결정 **최종 판단:** [DECISION] - [ ] GO PHASE 3 🚀 - [ ] RE-EVALUATE ⚠️ ## 다음 단계 1. CTO 승인 2. CFO 최종 확인 3. Phase 3 배포 준비 MARKDOWN_REPORT echo -e "${GREEN}✅ 리포트 생성 완료\n${NC}" # 6. 요약 echo -e "${GREEN}════════════════════════════════════${NC}" echo -e "${GREEN}Phase 2 자동화 완료${NC}" echo -e "${GREEN}════════════════════════════════════${NC}" echo "" echo "📋 생성된 파일:" echo " • 검증 결과: $VERIFICATION_RESULT" echo " • 실행 로그: $LOG_FILE" echo " • 최종 리포트: $REPORTS_DIR/PHASE_2_EXECUTION_SUMMARY_${TIMESTAMP}.md" echo "" echo "📧 알림: 결과를 검토하고 팀과 공유하세요" echo "" # 종료 코드 반환 exit $JUDGE_EXIT