- core/strategy.py: replace trend strategy with volume-lead accumulation (vol spike + 2h quiet → signal, +4.8% rise → entry) - core/trader.py: compound budget adjusts on both profit and loss (floor 30%) - core/notify.py: add accumulation signal telegram notification - ohlcv_db.py: Oracle ADB OHLCV cache (insert, load, incremental update) - sim_365.py: 365-day compounding simulation loading from DB - krw_sim.py: KRW-based simulation with MAX_POSITIONS constraint - ticker_sim.py: ticker count expansion comparison - STRATEGY.md: full strategy documentation - .gitignore: exclude *.pkl cache files Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
159 lines
4.5 KiB
Markdown
159 lines
4.5 KiB
Markdown
# Volume Lead 전략 가이드
|
||
|
||
## 전략 개요
|
||
|
||
**거래량 선행(Volume Lead) 매집 전략** — 가격이 횡보하는 중 거래량 급증이 발생하면
|
||
매집 신호로 기록하고, 이후 일정 수준 이상 상승 시 진입하는 선진입 전략.
|
||
|
||
> 핵심 아이디어: 대형 매수자는 가격을 올리지 않고 조용히 매집한다.
|
||
> 거래량이 먼저 급증하고, 가격 상승은 그 뒤에 따라온다.
|
||
|
||
---
|
||
|
||
## 진입 조건 (2단계)
|
||
|
||
### 1단계: 매집 신호 감지
|
||
다음 두 조건 동시 충족 시 `signal_price` 기록:
|
||
|
||
| 조건 | 파라미터 | 기본값 |
|
||
|------|----------|--------|
|
||
| 2h 가격 변동 < N% (횡보) | `PRICE_QUIET_PCT` | 2.0% |
|
||
| 직전 1h 거래량 ≥ 로컬 5h 평균 × M배 | `VOLUME_MULTIPLIER` | 2.0x |
|
||
|
||
- 신호 발생 시 텔레그램 알림 발송
|
||
- `SIGNAL_TIMEOUT_H` 내 진입 조건 미달 시 신호 초기화 (기본: 8h)
|
||
- 신호가 이하 하락 시 즉시 초기화 (매집 실패 판단)
|
||
|
||
### 2단계: 추세 확인 후 진입
|
||
`signal_price` 대비 +`TREND_AFTER_VOL`% 이상 상승 확인 시 매수:
|
||
|
||
| 파라미터 | 기본값 | 설명 |
|
||
|----------|--------|------|
|
||
| `TREND_AFTER_VOL` | 4.8% | 신호가 대비 진입 임계값 |
|
||
|
||
---
|
||
|
||
## 청산 조건
|
||
|
||
### 트레일링 스탑 (ATR 기반)
|
||
- ATR 5봉 × 1.5 계수 → 동적 손절폭 산출
|
||
- 최소 1.0% / 최대 4.0% 범위 내 자동 조정
|
||
- 최고가 대비 손절폭 이하 하락 시 즉시 청산
|
||
|
||
### 타임 스탑
|
||
- 보유 `TIME_STOP_HOURS`h 경과 후 수익률 < `TIME_STOP_MIN_GAIN_PCT`% 이면 청산
|
||
- 기본값: 8시간 경과 / 수익률 3% 미만
|
||
|
||
---
|
||
|
||
## 리스크 관리
|
||
|
||
### Walk-Forward (WF) 필터
|
||
| 파라미터 | 기본값 | 설명 |
|
||
|----------|--------|------|
|
||
| `WF_WINDOW` | 2 | 이력 윈도우 (직전 N건) |
|
||
| `WF_MIN_WIN_RATE` | 0.01 | 최소 승률 임계값 (1%) |
|
||
| `WF_SHADOW_WINS` | 2 | 차단 해제 조건 (가상 N연승) |
|
||
|
||
- 직전 2건 모두 손실 → 해당 종목 진입 차단
|
||
- 차단 후 가상 추적으로 2연승 달성 시 자동 복귀
|
||
|
||
### 예산 관리 (복리)
|
||
- 수익 발생 시: `운용예산 = 초기예산 + 누적수익` (복리 증가)
|
||
- 손실 발생 시: `운용예산 = 초기예산 + 누적수익` (차감)
|
||
- 하한선: 초기예산의 30% (기본: 4,500,000원)
|
||
- 포지션당 크기: `운용예산 / MAX_POSITIONS`
|
||
|
||
---
|
||
|
||
## 시장 레짐 적응
|
||
|
||
| 레짐 | BTC 1h 변동 | 거래량 기준 |
|
||
|------|------------|------------|
|
||
| BULL | +5% 이상 | 1.5x |
|
||
| NEUTRAL | ±5% 이내 | 2.0x |
|
||
| BEAR | -5% 이하 | 진입 차단 |
|
||
|
||
- BEAR 레짐 감지 시 신규 진입 전면 차단
|
||
- 레짐별 `vol_mult` 조정으로 민감도 제어
|
||
|
||
---
|
||
|
||
## 운용 설정 (.env)
|
||
|
||
```env
|
||
# 핵심 전략
|
||
PRICE_QUIET_PCT=2.0 # 2h 횡보 기준 (%)
|
||
TREND_AFTER_VOL=4.8 # 진입 임계값 (신호가 대비 %)
|
||
SIGNAL_TIMEOUT_H=8.0 # 신호 유효 시간 (h)
|
||
VOLUME_MULTIPLIER=2.0 # 거래량 배수 기준
|
||
|
||
# 청산
|
||
STOP_LOSS_PCT=1.5 # ATR 트레일링 기본값 (동적 조정됨)
|
||
TIME_STOP_HOURS=8 # 타임스탑 보유 시간
|
||
TIME_STOP_MIN_GAIN_PCT=3 # 타임스탑 최소 수익률
|
||
|
||
# 포트폴리오
|
||
MAX_BUDGET=15000000 # 초기 운용 예산
|
||
MAX_POSITIONS=3 # 최대 동시 보유 종목
|
||
|
||
# WF 필터
|
||
WF_WINDOW=2
|
||
WF_MIN_WIN_RATE=0.01
|
||
WF_SHADOW_WINS=2
|
||
```
|
||
|
||
---
|
||
|
||
## 백테스트 결과 요약
|
||
|
||
### 365일 (2025-03-02 ~ 2026-03-02) — WF 적용
|
||
|
||
| 항목 | 값 |
|
||
|------|-----|
|
||
| 초기 예산 | 15,000,000원 |
|
||
| 최종 자산 | 29,996,109원 |
|
||
| 수익률 | **+100%** |
|
||
| 최대 낙폭 | -3.81% (-57만원) |
|
||
| 거래수 | 190건 (WF 183건 차단) |
|
||
| 승률 | 46% |
|
||
| 월평균 수익 | 약 115만원 |
|
||
|
||
### 45일 Walk-Forward 검증 (2026-01-15 ~ 2026-03-02)
|
||
|
||
| 기간 | 거래수 | 승률 | 수익률 |
|
||
|------|--------|------|--------|
|
||
| Train (77일) | 66건 | 42% | +22.5% |
|
||
| Test (45일) | 67건 | 61% | +49.9% |
|
||
|
||
Train/Test 모두 수익 → 오버피팅 아님.
|
||
|
||
---
|
||
|
||
## 주요 파일
|
||
|
||
| 파일 | 역할 |
|
||
|------|------|
|
||
| `core/strategy.py` | 진입 신호 로직 |
|
||
| `core/monitor.py` | ATR 트레일링 스탑 + 타임스탑 |
|
||
| `core/trader.py` | 주문 실행 + 복리 예산 관리 |
|
||
| `core/market_regime.py` | 시장 레짐 감지 |
|
||
| `ohlcv_db.py` | OHLCV 시계열 DB 캐시 관리 |
|
||
| `sim_365.py` | 365일 복리 시뮬레이션 |
|
||
| `vol_lead_sim.py` | 전략 파라미터 스윕 도구 |
|
||
|
||
---
|
||
|
||
## 시뮬레이션 실행
|
||
|
||
```bash
|
||
# 365일 복리 시뮬 (DB에서 로드)
|
||
python sim_365.py
|
||
|
||
# OHLCV DB 상태 확인
|
||
python ohlcv_db.py status
|
||
|
||
# 신규 봉 증분 업데이트
|
||
python ohlcv_db.py update
|
||
```
|