docs: update STRATEGY.md with F&G filter and project structure changes

- Add F&G filter section: FNG_MIN_ENTRY=41, 1-year backtest proof
  (no filter: +95K KRW → F&G>=41: +1.72M KRW over 1 year)
- Add F&G backtest result (section D) with adaptive param findings
- Update section E: rename velocity backtest (was D)
- Split file table into production core vs tests/ scripts
- Update simulation commands to use tests/ path prefix
- Update env config: add FNG_MIN_ENTRY=41
- Add changelog entries for F&G filter, project structure, ecosystem.config.js

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
joungmin
2026-03-03 16:14:50 +09:00
parent 6b2c962ed8
commit 6580cda017

View File

@@ -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%) |