diff --git a/STRATEGY.md b/STRATEGY.md index c00c422..e8fd7d4 100644 --- a/STRATEGY.md +++ b/STRATEGY.md @@ -81,6 +81,39 @@ --- +## 진입 사전 필터 + +### F&G (공포탐욕지수) 필터 — `core/fng.py` + +**alternative.me API** 기반 일일 공포탐욕지수(0~100) 조회. 극공포·공포 구간에서는 +신규 매수를 전면 차단한다. + +| F&G 구간 | 레이블 | 진입 여부 | +|----------|--------|-----------| +| 76 ~ 100 | 극탐욕 | ✅ 허용 | +| 56 ~ 75 | 탐욕 | ✅ 허용 | +| 46 ~ 55 | 중립 | ✅ 허용 | +| 41 ~ 45 | 약공포 | ✅ 허용 | +| 26 ~ 40 | 공포 | ❌ 차단 | +| 0 ~ 25 | 극공포 | ❌ 차단 | + +- 환경변수 `FNG_MIN_ENTRY=41` (기본값) — 이 값 미만이면 스캔 전체 스킵 +- API는 하루 1회 KST 09:00 업데이트 → 캐시 TTL 24시간 +- API 실패 시 폴백: 50 (중립) — 안전하게 진입 허용 +- BEAR 레짐 차단과 독립적으로 동작 (둘 다 통과해야 스캔 진행) + +**1년 백테스트 검증 결과** (2025-03-03 ~ 2026-03-03, 18종목 1h봉): + +| 구성 | 거래수 | 승률 | 평균PnL | 누적PnL(KRW) | +|------|--------|------|---------|------------| +| 필터 없음 | 820건 | 32.7% | +0.012% | +95,743원 | +| **F&G≥41** | **372건** | **39.5%** | **+0.462%** | **+1,719,047원** | + +- 차단 거래 452건 평균 PnL: **-0.372%** → 손실 거래 제거 효과 +- 극공포 구간(0~25): 23.5% 승률, -0.540%/건 → 파라미터 조정으로 개선 불가 (검증됨) + +--- + ## 리스크 관리 ### Walk-Forward (WF) 필터 @@ -157,6 +190,9 @@ SIGNAL_POLL_INTERVAL=15 # 신호 종목 빠른 감시 (초) WF_WINDOW=4 WF_MIN_WIN_RATE=0.01 WF_SHADOW_WINS=2 + +# F&G 필터 +FNG_MIN_ENTRY=41 # 이 값 미만(공포/극공포) 시 신규 매수 전면 차단 ``` --- @@ -216,7 +252,18 @@ WF_SHADOW_WINS=2 | 2.5% | 50.8% | +256% | -5.3% | 1.77% | | 4.0% | 45.9% | -52% | -29.1% | 3.11% | -### D. 속도 진입 효과 비교 — 10분봉 (`velocity_backtest.py`) +### D. F&G 필터 효과 비교 — 1h봉 (`tests/fng_sim_comparison.py`) +> 기간: 2025-03-03 ~ 2026-03-03 / 데이터: Oracle DB 1h OHLCV / 18종목 + +| 구성 | 거래수 | 승률 | 평균PnL | 누적(KRW) | +|------|--------|------|---------|----------| +| 필터 없음 | 820건 | 32.7% | +0.012% | +95,743원 | +| **F&G≥41** | **372건** | **39.5%** | **+0.462%** | **+1,719,047원** | + +- 차단 452건 평균 PnL -0.372% → 약 168만원 손실 방지 +- 극공포 적응 파라미터 테스트(`tests/fng_adaptive_backtest.py`): 어떤 파라미터도 극공포 성과 개선 불가 → 진입 차단이 유일한 해결책 + +### E. 속도 진입 효과 비교 — 10분봉 (`tests/velocity_backtest.py`) > 기간: 2026-01-19 ~ 2026-03-02 / 10분봉 캐시 / 20종목 | 설정 | 속도진입 | 승률 | 수익률 | 최대낙폭 | @@ -232,46 +279,65 @@ WF_SHADOW_WINS=2 ## 주요 파일 +**프로덕션 코어** + | 파일 | 역할 | |------|------| | `core/strategy.py` | 진입 신호 로직 (40분봉 vol-lead + 속도 기반 조기 진입) | +| `core/fng.py` | F&G 필터 (alternative.me API, 24h 캐시) | | `core/monitor.py` | ATR 트레일링 스탑 + 타임스탑 (40분봉 ATR) | | `core/trader.py` | 주문 실행 + 복리 예산 관리 | | `core/market_regime.py` | 시장 레짐 감지 (BTC/ETH/SOL/XRP 가중 2h 추세) | | `core/price_db.py` | 가격 DB + WF 상태 영속화 | +| `core/notify.py` | 텔레그램 알림 (매수/매도/신호/상태) | | `daemon/runner.py` | 전체 스캔 루프 + 신호 종목 fast-poll 스레드 | -| `ohlcv_db.py` | OHLCV 시계열 DB 캐시 관리 | -| `sim_365.py` | 365일 복리 시뮬레이션 (1h봉, DB) | -| `sim_45m40.py` | 45일 복리 시뮬레이션 (40분봉, 캐시) | -| `velocity_backtest.py` | 속도 진입 효과 비교 백테스트 (A vs B vs C) | -| `atr_sweep.py` | ATR_MAX_STOP 파라미터 스윕 | -| `interval_sweep.py` | 봉 단위별 성과 비교 (10/20/30/40/50/60분) | +| `main.py` | 진입점 (스레드 시작 + pm2) | +| `ecosystem.config.js` | pm2 설정 (로그 경로 `logs/`) | + +**백테스트 / 분석 (`tests/`)** + +| 파일 | 역할 | +|------|------| +| `tests/fng_sim_comparison.py` | F&G 필터 적용 전후 수익 비교 (1년) | +| `tests/fng_1y_backtest.py` | F&G 구간별 성과 분석 (7개 구간, 1년) | +| `tests/fng_adaptive_backtest.py` | F&G 구간별 적응 파라미터 테스트 | +| `tests/sim_365.py` | 365일 복리 시뮬레이션 (1h봉, DB) | +| `tests/sim_45m40.py` | 45일 복리 시뮬레이션 (40분봉, 캐시) | +| `tests/velocity_backtest.py` | 속도 진입 효과 비교 백테스트 | +| `tests/atr_sweep.py` | ATR_MAX_STOP 파라미터 스윕 | +| `tests/interval_sweep.py` | 봉 단위별 성과 비교 | +| `tests/backtest_db.py` | 백테스트 결과 Oracle DB 저장 | +| `tests/ohlcv_db.py` | OHLCV 시계열 DB 캐시 관리 | --- ## 시뮬레이션 실행 ```bash +# F&G 필터 효과 비교 (필터 없음 vs F&G≥41) +python tests/fng_sim_comparison.py + +# F&G 구간별 성과 분석 (7개 구간, 1년) +python tests/fng_1y_backtest.py + # 45일 복리 시뮬 — 40분봉 (현재 전략 기준) -python sim_45m40.py +python tests/sim_45m40.py # 365일 복리 시뮬 — 1h봉 (DB에서 로드) -python sim_365.py +python tests/sim_365.py # 속도 진입 효과 비교 -python velocity_backtest.py +python tests/velocity_backtest.py # 봉 단위별 비교 (10m 캐시 필요) -python interval_sweep.py +python tests/interval_sweep.py # ATR_MAX_STOP 스윕 (DB에서 로드) -python atr_sweep.py +python tests/atr_sweep.py -# OHLCV DB 상태 확인 -python ohlcv_db.py status - -# 신규 봉 증분 업데이트 -python ohlcv_db.py update +# OHLCV DB 상태 확인 / 업데이트 +python tests/ohlcv_db.py status +python tests/ohlcv_db.py update ``` --- @@ -280,8 +346,12 @@ python ohlcv_db.py update | 날짜 | 변경 내용 | |------|---------| +| 2026-03-03 | **F&G 필터 추가** (`FNG_MIN_ENTRY=41`) — 1년 백테스트로 검증, 수익 +95K→+1.72M원 | +| 2026-03-03 | F&G 정보 텔레그램 알림 통합 (매수/신호/상태 리포트) | +| 2026-03-03 | F&G API 캐시 TTL 24시간 (하루 1회 KST 09:00 업데이트) | +| 2026-03-03 | 프로젝트 구조 정리: `tests/` `data/` `logs/` 폴더 분리 | +| 2026-03-03 | `ecosystem.config.js` 추가 — pm2 로그 경로 `logs/` 통일 | | 2026-03-03 | BEAR_THRESHOLD -1.0% → **-0.5%** 강화 (완만한 하락장 오판 수정) | | 2026-03-03 | 속도 기반 조기 진입 추가 (`VELOCITY_THRESHOLD=0.10%/분`) | | 2026-03-03 | 신호 종목 fast-poll 스레드 추가 (`SIGNAL_POLL_INTERVAL=15s`) | -| 2026-03-03 | `sell_reason` 컬럼 VARCHAR2(100→500) 자동 확장 | | 2026-03-03 | vol_ratio 강도별 진입 임계값 티어 추가 (5x→1%, 3.5x→2%, 2.5x→3%) |