Files
KArtSell.Aegis/docs/Phase2Reports/OOS_VERIFICATION_REPORT.md
T
kjh2064 8f1ff34cc9 Phase 2 준비 완료: 검증 스크립트 재작성 & 자동화 도구
- Task 3: phase2_verification_scripts.py 테스트 (샘플 데이터) 
- Task 4: 5개 리포트 템플릿 작성 
- Task 5: SQL 쿼리 검증 (실제 데이터) - 메트릭 데이터 미채움 확인 
- Task 6: 자동화 도구 & Go/No-Go 기준 통합 

발견 사항:
• Phase 1: 304개 행 생성 (9일 누적)
• 문제: metrics_json 필드 모두 비어있음 (0%)
• 영향: Phase 2 검증 불가능 (데이터 필요)
• 상태: 2026-11-01 재검증 예정

AGENTS.md v16.0 준수:
 정공법: 근본 원인 분석 (메트릭 미저장)
 현장감: 실제 데이터 검증
 과유불급: 필요한 준비만 완료
 재현성: 모든 스크립트 버전 관리

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-11 20:23:05 +09:00

250 lines
5.5 KiB
Markdown
Raw 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.
# OOS 검증 리포트: Out-of-Sample Performance Drift
**Team:** Model Generalization Analysis
**Date:** [실행 날짜]
**Period:** Phase 1 Shadow Run Data (252+ trading days)
---
## 📊 Executive Summary
### Metric: Out-of-Sample Performance Drift
- **공식:** Drift = |OOS_Return - IS_Return| / IS_Return × 100
- **목표 범위:** < 2.5%
- **해석:** OOS가 IS와 얼마나 다른지 (낮을수록 모델 안정성 우수)
### Result Status
```
OOS Drift: _____% (normalized)
Expected: < 2.5%
Status: [✅ PASS] / [❌ FAIL]
Confidence: _____% (95%+)
```
---
## 📈 Methodology
### 데이터 소스
- **In-Sample (IS):** 모델 개발/검증 데이터
- **Out-of-Sample (OOS):** 미래/독립 거래 데이터
- **기간:** Phase 1 전체 (252+ trading days)
### 계산 과정
**1단계: 누적 성과 계산**
```sql
-- IS 누적 성과
IS_Cumulative = (1 + IS_return) - 1
-- OOS 누적 성과
OOS_Cumulative = (1 + OOS_return) - 1
```
**2단계: 드리프트 산출**
```
Drift = |OOS_Cumulative - IS_Cumulative| / IS_Cumulative × 100
```
**3단계: 일일 드리프트**
```
Daily_Drift[i] = (OOS_Perf[i] - IS_Perf[i]) / IS_Perf[i] × 100
```
### 검증 방법
- [x] 누적 수익 비교
- [x] 일일 드리프트 추이
- [x] 최악 드리프트 지점
- [x] 변동성 분석
---
## 📊 Results
### 핵심 지표
| 메트릭 | IS | OOS | 드리프트 | 평가 |
|--------|-----|-----|---------|------|
| 누적 수익률 | _____% | _____% | _____% | [✅]/[❌] |
| 평균 일일 | _____% | _____% | _____% | [✅]/[❌] |
| 최악 일일 | _____% | _____% | _____% | [✅]/[❌] |
| 최고 일일 | _____% | _____% | _____% | [✅]/[❌] |
### 드리프트 분석
```
기간별 드리프트
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
초기 30일 : _____ %
중간 30일 : _____ %
최근 30일 : _____ %
추세: [안정/악화/개선]
```
### 일일 드리프트 통계
| 통계량 | 값 | 평가 |
|--------|-----|------|
| 평균 드리프트 | _____% | 목표 < 2.5% |
| 최대 드리프트 | _____% | 극단값 확인 |
| 최소 드리프트 | _____% | 음수 방향 |
| 표준편차 | _____% | 안정성 |
---
## 🎯 Validation & Decision
### Go/No-Go 기준
```
Drift < 2.5% ?
YES ✅ → PASS (모델 일반화 능력 확인)
NO ❌ → FAIL (과적합 또는 데이터 문제)
```
### 추가 기준 (선택)
- [ ] 최대 드리프트 < 5%
- [ ] 연속 음수 드리프트 < 10일
- [ ] 월별 일관성 > 80%
### VERDICT
**OOS Drift Status:** [✅ PASS] / [❌ FAIL]
**근거:**
- 드리프트 값: _____% (< 2.5% 임계)
- 월별 추이: [안정/악화/개선]
- 신뢰도: _____% (높음/중간/낮음)
---
## 🔍 Performance Degradation Analysis
### 드리프트 원인 분석
**양수 드리프트 (OOS < IS):**
- [ ] 모델이 과적합됨
- [ ] IS 데이터의 이상 패턴
- [ ] 시장 체제 변화
**음수 드리프트 (OOS > IS):**
- [ ] 모델의 보수적 추정
- [ ] IS 기간 시장 약세
- [ ] OOS 기간 시장 강세
### 시장 영향 평가
| 요인 | 영향도 | 설명 |
|------|--------|------|
| 변동성 | 낮음/중간/높음 | VIX 등 시장 변동성 |
| 추세 | 낮음/중간/높음 | 상승/하락 추세 |
| 심각성 | 낮음/중간/높음 | 이상 현상 유무 |
---
## 🔍 Risk Factors & Mitigation
### 식별된 위험
| 위험 | 확률 | 영향 | 대응 |
|------|------|------|-----|
| 과적합 | 중간 | 높음 | 모델 재검토 |
| 시장 변화 | 중간 | 중간 | 재학습 필요 |
| 데이터 품질 | 낮음 | 높음 | 검증 강화 |
### 신뢰도 제약
- 표본 크기: _____ 일 (최소 252)
- 신뢰 구간: _____ ~ _____%
- 평가 기간 충분성: [✅]/[⚠️]
---
## 📋 Recommendation
### Phase 3 진행 가능 여부
**Status:** [GO] / [NO-GO] / [CONDITIONAL]
**조건** (해당 시):
- [ ] 모델 재검증 (추가 기간)
- [ ] 파라미터 조정
- [ ] 월별 모니터링 강화
### 추가 조치사항
1. **모니터링:**
- 일일 드리프트 추이
- 누적 성과 비교
- 시장 상황 연동 분석
2. **재검증:**
- 월말 드리프트 재산출
- 분기별 모델 평가
- 연간 일반화 능력 검증
3. **개선:**
- 파라미터 미세조정
- 앙상블 모델 검토
- 데이터 전처리 개선
---
## ✅ Approval
**Team Lead:** _________________
**Date:** ___________
**Signature:** _________________
**CTO Review:** [ ] Approved [ ] Conditional [ ] Rejected
**CFO Review:** [ ] Approved [ ] Conditional [ ] Rejected
---
## 📎 Appendix
### A. 상세 계산식
```
누적 수익 = ∏(1 + daily_return) - 1
(로그 반환 사용: exp(Σ ln(1 + return)) - 1)
일일 드리프트 = (OOS[i] - IS[i]) / IS[i] × 100
정규화 드리프트 = mean(daily_drift) / std(IS_return) × 100
```
### B. SQL 쿼리
```sql
-- 누적 성과 비교
SELECT
SUM(LOG(1 + is_return)) as is_cumulative_log,
SUM(LOG(1 + oos_return)) as oos_cumulative_log,
EXP(SUM(LOG(1 + oos_return))) - EXP(SUM(LOG(1 + is_return)))
/ EXP(SUM(LOG(1 + is_return))) * 100 as drift_pct
FROM phase_1_metrics
WHERE published_at <= @cutoff;
-- 일일 드리프트
SELECT
trading_date,
(oos_cumulative - is_cumulative) / is_cumulative * 100 as daily_drift
FROM phase_1_metrics
WHERE published_at <= @cutoff
ORDER BY trading_date;
```
### C. Python 검증
```python
python phase2_verification_scripts.py <data_file> --metric oos
```
---
**Report Status:** [DRAFT] / [FINAL]
**Version:** 1.0
**Last Updated:** [날짜]