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:
106
STRATEGY.md
106
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) 필터
|
### Walk-Forward (WF) 필터
|
||||||
@@ -157,6 +190,9 @@ SIGNAL_POLL_INTERVAL=15 # 신호 종목 빠른 감시 (초)
|
|||||||
WF_WINDOW=4
|
WF_WINDOW=4
|
||||||
WF_MIN_WIN_RATE=0.01
|
WF_MIN_WIN_RATE=0.01
|
||||||
WF_SHADOW_WINS=2
|
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% |
|
| 2.5% | 50.8% | +256% | -5.3% | 1.77% |
|
||||||
| 4.0% | 45.9% | -52% | -29.1% | 3.11% |
|
| 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종목
|
> 기간: 2026-01-19 ~ 2026-03-02 / 10분봉 캐시 / 20종목
|
||||||
|
|
||||||
| 설정 | 속도진입 | 승률 | 수익률 | 최대낙폭 |
|
| 설정 | 속도진입 | 승률 | 수익률 | 최대낙폭 |
|
||||||
@@ -232,46 +279,65 @@ WF_SHADOW_WINS=2
|
|||||||
|
|
||||||
## 주요 파일
|
## 주요 파일
|
||||||
|
|
||||||
|
**프로덕션 코어**
|
||||||
|
|
||||||
| 파일 | 역할 |
|
| 파일 | 역할 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| `core/strategy.py` | 진입 신호 로직 (40분봉 vol-lead + 속도 기반 조기 진입) |
|
| `core/strategy.py` | 진입 신호 로직 (40분봉 vol-lead + 속도 기반 조기 진입) |
|
||||||
|
| `core/fng.py` | F&G 필터 (alternative.me API, 24h 캐시) |
|
||||||
| `core/monitor.py` | ATR 트레일링 스탑 + 타임스탑 (40분봉 ATR) |
|
| `core/monitor.py` | ATR 트레일링 스탑 + 타임스탑 (40분봉 ATR) |
|
||||||
| `core/trader.py` | 주문 실행 + 복리 예산 관리 |
|
| `core/trader.py` | 주문 실행 + 복리 예산 관리 |
|
||||||
| `core/market_regime.py` | 시장 레짐 감지 (BTC/ETH/SOL/XRP 가중 2h 추세) |
|
| `core/market_regime.py` | 시장 레짐 감지 (BTC/ETH/SOL/XRP 가중 2h 추세) |
|
||||||
| `core/price_db.py` | 가격 DB + WF 상태 영속화 |
|
| `core/price_db.py` | 가격 DB + WF 상태 영속화 |
|
||||||
|
| `core/notify.py` | 텔레그램 알림 (매수/매도/신호/상태) |
|
||||||
| `daemon/runner.py` | 전체 스캔 루프 + 신호 종목 fast-poll 스레드 |
|
| `daemon/runner.py` | 전체 스캔 루프 + 신호 종목 fast-poll 스레드 |
|
||||||
| `ohlcv_db.py` | OHLCV 시계열 DB 캐시 관리 |
|
| `main.py` | 진입점 (스레드 시작 + pm2) |
|
||||||
| `sim_365.py` | 365일 복리 시뮬레이션 (1h봉, DB) |
|
| `ecosystem.config.js` | pm2 설정 (로그 경로 `logs/`) |
|
||||||
| `sim_45m40.py` | 45일 복리 시뮬레이션 (40분봉, 캐시) |
|
|
||||||
| `velocity_backtest.py` | 속도 진입 효과 비교 백테스트 (A vs B vs C) |
|
**백테스트 / 분석 (`tests/`)**
|
||||||
| `atr_sweep.py` | ATR_MAX_STOP 파라미터 스윕 |
|
|
||||||
| `interval_sweep.py` | 봉 단위별 성과 비교 (10/20/30/40/50/60분) |
|
| 파일 | 역할 |
|
||||||
|
|------|------|
|
||||||
|
| `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
|
```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분봉 (현재 전략 기준)
|
# 45일 복리 시뮬 — 40분봉 (현재 전략 기준)
|
||||||
python sim_45m40.py
|
python tests/sim_45m40.py
|
||||||
|
|
||||||
# 365일 복리 시뮬 — 1h봉 (DB에서 로드)
|
# 365일 복리 시뮬 — 1h봉 (DB에서 로드)
|
||||||
python sim_365.py
|
python tests/sim_365.py
|
||||||
|
|
||||||
# 속도 진입 효과 비교
|
# 속도 진입 효과 비교
|
||||||
python velocity_backtest.py
|
python tests/velocity_backtest.py
|
||||||
|
|
||||||
# 봉 단위별 비교 (10m 캐시 필요)
|
# 봉 단위별 비교 (10m 캐시 필요)
|
||||||
python interval_sweep.py
|
python tests/interval_sweep.py
|
||||||
|
|
||||||
# ATR_MAX_STOP 스윕 (DB에서 로드)
|
# ATR_MAX_STOP 스윕 (DB에서 로드)
|
||||||
python atr_sweep.py
|
python tests/atr_sweep.py
|
||||||
|
|
||||||
# OHLCV DB 상태 확인
|
# OHLCV DB 상태 확인 / 업데이트
|
||||||
python ohlcv_db.py status
|
python tests/ohlcv_db.py status
|
||||||
|
python tests/ohlcv_db.py update
|
||||||
# 신규 봉 증분 업데이트
|
|
||||||
python 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 | BEAR_THRESHOLD -1.0% → **-0.5%** 강화 (완만한 하락장 오판 수정) |
|
||||||
| 2026-03-03 | 속도 기반 조기 진입 추가 (`VELOCITY_THRESHOLD=0.10%/분`) |
|
| 2026-03-03 | 속도 기반 조기 진입 추가 (`VELOCITY_THRESHOLD=0.10%/분`) |
|
||||||
| 2026-03-03 | 신호 종목 fast-poll 스레드 추가 (`SIGNAL_POLL_INTERVAL=15s`) |
|
| 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%) |
|
| 2026-03-03 | vol_ratio 강도별 진입 임계값 티어 추가 (5x→1%, 3.5x→2%, 2.5x→3%) |
|
||||||
|
|||||||
Reference in New Issue
Block a user