docs: add decision log for ML-off and XRP-only operation
Document why ML filter was disabled (ML OFF PF 1.16 > ML ON PF 0.71), why SOL/DOGE/TRX were removed (all PF < 1.0 in walk-forward), and what conditions are needed to re-enable ML in the future. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
129
docs/decisions/2026-03-21-ml-off-xrp-only.md
Normal file
129
docs/decisions/2026-03-21-ml-off-xrp-only.md
Normal file
@@ -0,0 +1,129 @@
|
||||
# 의사결정 로그: ML 필터 비활성화 & XRP 단독 운영
|
||||
|
||||
**일자**: 2026-03-21
|
||||
**결정자**: gihyeon
|
||||
**상태**: 확정, 운영 반영 완료
|
||||
|
||||
---
|
||||
|
||||
## 1. ML 필터를 왜 껐는가
|
||||
|
||||
### 결론: ML OFF > ML ON (전 심볼)
|
||||
|
||||
Walk-Forward 검증 결과, ML 필터를 끈 상태가 모든 심볼에서 더 나은 성과를 보였다.
|
||||
|
||||
| 심볼 | ML OFF PF | ML ON PF | 차이 | ML OFF Return | ML ON Return |
|
||||
|------|-----------|----------|------|---------------|--------------|
|
||||
| **XRPUSDT** | **1.16** | 0.71 | -0.45 (61%↓) | +12.17% | -25.62% |
|
||||
| DOGEUSDT | 1.18 | 0.78 | -0.40 (34%↓) | +16.11% | -28.50% |
|
||||
| SOLUSDT | 0.09 | 0.25 | — | -321.85% | -48.83% |
|
||||
|
||||
### 원인 분석
|
||||
|
||||
**1) Ablation 실험 — 모델이 독립적 알파를 제공하지 못함**
|
||||
- 실험 A: 전체 26개 피처 (baseline AUC)
|
||||
- 실험 B: signal_strength 제거
|
||||
- 실험 C: signal_strength + side 제거
|
||||
- **A→C AUC 하락: 0.08~0.09** (판정 기준: ≤0.05 유용, 0.05~0.10 조건부, ≥0.10 재설계)
|
||||
- 해석: 모델이 기존 기술적 신호(RSI, MACD, ADX)를 단순 재확인하는 수준. 독립적 예측력 부재.
|
||||
|
||||
**2) 학습 데이터 부족**
|
||||
- Walk-Forward 각 폴드 학습 세트에 유효 신호 ~27건
|
||||
- 1:1 언더샘플링 후 양성 샘플 ~13건/폴드 → LightGBM 학습에 극히 부족
|
||||
- 과적합 → 일반화 실패
|
||||
|
||||
**3) Purged Gap 적용 후 성능 추가 하락**
|
||||
- 라벨 생성에 24캔들(6h) lookahead 사용 → 학습/검증 사이에 24캔들 embargo 추가
|
||||
- 이전에 label leakage로 부풀려진 성능이 정정됨
|
||||
|
||||
### 운영 설정
|
||||
```
|
||||
NO_ML_FILTER=true # .env
|
||||
```
|
||||
모델 파일은 유지 (향후 재검증용). `ml_filter.py`의 hot-reload 로직도 그대로 남겨둠.
|
||||
|
||||
---
|
||||
|
||||
## 2. SOL/DOGE/TRX를 왜 뺐는가
|
||||
|
||||
### 결론: XRP만 PF > 1.0 달성
|
||||
|
||||
| 심볼 | Strategy Sweep 최고 PF | Walk-Forward PF (ML OFF) | 판정 |
|
||||
|------|----------------------|--------------------------|------|
|
||||
| **XRPUSDT** | 1.68 | **1.16** | ✅ 운영 유지 |
|
||||
| DOGEUSDT | 1.80 | 1.18* | ❌ 제외 |
|
||||
| TRXUSDT | 3.87 (16건) | — | ❌ 제외 |
|
||||
| SOLUSDT | 2.83 | **0.09** | ❌ 제외 |
|
||||
|
||||
*DOGE PF 1.18은 WR 25%로 소수 대형 승리에 의존 → 안정성 부족
|
||||
|
||||
### 핵심 교훈: 과적합 탐지
|
||||
|
||||
**SOLUSDT 사례가 가장 극적:**
|
||||
- Strategy Sweep (1년 전체 백테스트): PF 2.83, Return +90.93%
|
||||
- Walk-Forward (시계열 CV): PF 0.09, Return -321.85%
|
||||
- **과적합 정도: PF 2.83 → 0.09 (97% 하락)**
|
||||
|
||||
→ 전체 기간 백테스트 결과만으로 심볼을 선택하면 안 됨. 반드시 Walk-Forward로 검증해야 함.
|
||||
|
||||
### 운영 설정
|
||||
```
|
||||
SYMBOLS=XRPUSDT # .env (이전: XRPUSDT,SOLUSDT,DOGEUSDT,TRXUSDT)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. ML을 다시 켜려면 어떤 조건이 필요한가
|
||||
|
||||
### 필수 조건 (AND)
|
||||
|
||||
1. **데이터 양**: Walk-Forward 폴드당 유효 신호 100건 이상
|
||||
- 현재 ~27건 → 약 4배 필요
|
||||
- 방법: (a) 더 긴 수집 기간 (1년→3년), (b) 15m→5m 타임프레임 (데이터 3배), (c) 새 피처로 유효 신호 비율 증가
|
||||
|
||||
2. **독립적 알파**: Ablation A→C AUC 하락 ≤ 0.05
|
||||
- signal_strength와 side를 제거해도 모델이 독립적으로 예측할 수 있어야 함
|
||||
- 현재 0.08~0.09 → 새 피처(L/S ratio, OI 파생 등)가 이 갭을 메워야 함
|
||||
|
||||
3. **Walk-Forward 검증**: ML ON PF > ML OFF PF (최소 0.1 이상 차이)
|
||||
- 단순히 PF > 1.0이 아니라, ML OFF 대비 개선이 있어야 함
|
||||
- 검증 거래 수 50건 이상
|
||||
|
||||
4. **과적합 지표**: Strategy Sweep PF vs Walk-Forward PF 비율 < 2.0
|
||||
- SOL처럼 Sweep 2.83 / WF 0.09 = 31배 차이 → 극심한 과적합
|
||||
- 비율 2.0 이하면 합리적 범위
|
||||
|
||||
### 유망한 다음 시도
|
||||
|
||||
| 개선 방향 | 기대 효과 | 현재 상태 |
|
||||
|-----------|-----------|-----------|
|
||||
| **L/S Ratio 피처 추가** | 독립적 알파 (상관 0.12~0.14) | 수집 시작 (2026-03-22), 1개월 뒤 검증 가능 |
|
||||
| **학습 데이터 3년 확보** | 폴드당 샘플 3배 증가 | 미착수 |
|
||||
| **Cross-symbol 피처** | BTC/ETH 탑 트레이더 동향 → XRP 예측 | L/S ratio 수집 후 가능 |
|
||||
| **다른 모델 (XGBoost, CatBoost)** | 소규모 데이터에 더 적합할 수 있음 | 미착수 |
|
||||
|
||||
### 재검증 타임라인
|
||||
|
||||
```
|
||||
2026-03-22: L/S ratio 수집 시작 (top_acct + global, 3심볼)
|
||||
2026-04-22: 1개월 데이터 축적 (~17,000건)
|
||||
→ 상관분석 재실행 (5일 → 30일 데이터로 신뢰도 확인)
|
||||
→ L/S ratio 피처를 ML에 추가하여 Ablation 재실험
|
||||
→ Walk-Forward ML ON vs OFF 재비교
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 관련 문서 & 코드
|
||||
|
||||
| 참조 | 위치 |
|
||||
|------|------|
|
||||
| ML 비활성화 커밋 | `dacefaa` (docs: update for XRP-only operation) |
|
||||
| ML 비교 결과 (XRP) | `results/xrpusdt/ml_comparison_20260321_200332.json` |
|
||||
| ML 비교 결과 (DOGE) | `results/dogeusdt/ml_comparison_20260321_200334.json` |
|
||||
| Strategy Sweep 결과 | `results/{symbol}/strategy_sweep_*.json` |
|
||||
| Purged Gap 계획 | `docs/plans/2026-03-21-purged-gap-and-ablation.md` |
|
||||
| ML 검증 파이프라인 | `docs/plans/2026-03-21-ml-validation-pipeline.md` |
|
||||
| ML 검증 결과 | `docs/plans/2026-03-21-ml-validation-result.md` |
|
||||
| L/S Ratio 수집 스크립트 | `scripts/collect_ls_ratio.py` |
|
||||
| 운영 설정 | `.env` → `NO_ML_FILTER=true`, `SYMBOLS=XRPUSDT` |
|
||||
Reference in New Issue
Block a user