263 lines
7.6 KiB
Markdown
263 lines
7.6 KiB
Markdown
# 현재 매수 전략 분석
|
|
|
|
**날짜**: 2025-12-09
|
|
**파일**: `src/signals.py`
|
|
**함수**: `_evaluate_buy_conditions()`
|
|
|
|
---
|
|
|
|
## 📊 현재 구현된 매수 전략
|
|
|
|
### 전략 개요
|
|
현재 시스템은 **단일 지표가 아닌 복합 조건**을 사용하여 신뢰도 높은 매수 신호를 생성합니다.
|
|
|
|
```
|
|
매수 신호 = (MACD + SMA + ADX) 복합 조건
|
|
(3가지 조건 중 1개 이상 충족 시)
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 3가지 매수 조건
|
|
|
|
### 매수조건 1: MACD 상향 돌파 + 추세 확인
|
|
```python
|
|
if macd_cross_ok and sma_condition and adx_ok:
|
|
matches.append("매수조건1")
|
|
```
|
|
|
|
**세부 조건**:
|
|
1. **MACD 골든 크로스**:
|
|
- `MACD > Signal` 돌파 OR
|
|
- `MACD > 0` 돌파 (0선 상향 돌파)
|
|
2. **SMA 정배열**: `SMA5 > SMA200` (상승 추세)
|
|
3. **ADX 강세**: `ADX > 25` (강한 추세)
|
|
|
|
**트레이딩 의미**:
|
|
- MACD 골든 크로스 = 단기 모멘텀 전환
|
|
- SMA 정배열 = 중장기 상승 추세
|
|
- ADX 강세 = 추세가 강함 (약한 반등 필터링)
|
|
|
|
**강점**: 추세 전환 초기 포착
|
|
|
|
---
|
|
|
|
### 매수조건 2: SMA 골든 크로스 + 모멘텀 확인
|
|
```python
|
|
if cross_sma and macd_above_signal and adx_ok:
|
|
matches.append("매수조건2")
|
|
```
|
|
|
|
**세부 조건**:
|
|
1. **SMA 골든 크로스**: `SMA5`가 `SMA200`을 상향 돌파
|
|
2. **MACD 강세**: `MACD > Signal` (상승 모멘텀 유지)
|
|
3. **ADX 강세**: `ADX > 25`
|
|
|
|
**트레이딩 의미**:
|
|
- SMA 골든 크로스 = 장기 추세 전환 시그널
|
|
- MACD 강세 = 모멘텀 뒷받침
|
|
- ADX 강세 = 추세 지속 가능성
|
|
|
|
**강점**: 중장기 추세 전환 포착
|
|
|
|
---
|
|
|
|
### 매수조건 3: ADX 돌파 + 추세/모멘텀 확인
|
|
```python
|
|
if cross_adx and sma_condition and macd_above_signal:
|
|
matches.append("매수조건3")
|
|
```
|
|
|
|
**세부 조건**:
|
|
1. **ADX 상향 돌파**: `ADX`가 25를 상향 돌파 (추세 강화)
|
|
2. **SMA 정배열**: `SMA5 > SMA200`
|
|
3. **MACD 강세**: `MACD > Signal`
|
|
|
|
**트레이딩 의미**:
|
|
- ADX 돌파 = 약세 → 강세 전환
|
|
- SMA 정배열 + MACD 강세 = 상승 추세 확정
|
|
|
|
**강점**: 추세 강화 시점 포착
|
|
|
|
---
|
|
|
|
## ✅ 현재 전략의 강점
|
|
|
|
### 1. **높은 신뢰도**
|
|
- 3가지 지표를 복합 사용 → 가짜 신호(False Signal) 감소
|
|
- 단일 지표의 한계 보완 (MACD만, RSI만 사용 시 오작동 위험)
|
|
|
|
### 2. **추세 확인**
|
|
- SMA200 사용 → 장기 추세 확인
|
|
- ADX 사용 → 약한 반등/횡보장 필터링
|
|
- **약세장 함정 회피**: 단순 과매도 신호와 달리 추세 확인 필수
|
|
|
|
### 3. **다양한 진입 시점**
|
|
- 조건1: MACD 전환 (빠른 진입)
|
|
- 조건2: SMA 전환 (중기 진입)
|
|
- 조건3: ADX 전환 (추세 강화 진입)
|
|
|
|
### 4. **코드 품질**
|
|
- 명확한 조건 분리
|
|
- 테스트 용이
|
|
- 유지보수 편리
|
|
|
|
---
|
|
|
|
## ⚠️ 현재 전략의 한계
|
|
|
|
### 1. **과매도 구간 저가 매수 불가**
|
|
- **문제**: RSI < 30 같은 과매도 신호 미사용
|
|
- **영향**: 급락 후 반등 초기 진입 기회 놓칠 수 있음
|
|
- **예시**:
|
|
```
|
|
비트코인이 60,000 → 40,000으로 급락 (RSI 20)
|
|
→ 현재 전략: MACD/SMA 조건 충족 시까지 대기
|
|
→ 놓친 기회: 40,000 → 45,000 반등 (12.5% 수익)
|
|
```
|
|
|
|
### 2. **MACD 히스토그램 미확인**
|
|
- **문제**: `MACD > Signal` 조건만 확인, 히스토그램 증가 확인 안 함
|
|
- **영향**: 모멘텀 약화 구간에서 매수 가능
|
|
- **예시**:
|
|
```
|
|
MACD: 10 → 8 → 6 (하락 중)
|
|
Signal: 5 (변동 없음)
|
|
→ MACD > Signal 충족하지만 모멘텀 약화 중 → 매수 신호 발생 ❌
|
|
```
|
|
|
|
### 3. **지연 신호 (Lagging Indicator)**
|
|
- **문제**: MACD, SMA200 모두 후행 지표
|
|
- **영향**: 추세 전환 초기가 아닌 중후반에 진입 가능
|
|
- **해결책**: 선행 지표(RSI, Stochastic) 추가 검토
|
|
|
|
---
|
|
|
|
## 💡 개선 제안 (선택사항)
|
|
|
|
### 제안 1: MACD 히스토그램 확인 추가
|
|
```python
|
|
# 현재
|
|
macd_cross_ok = (cross_macd_signal or cross_macd_zero)
|
|
|
|
# 개선안
|
|
macd_hist = macd[f"MACDh_{fast}_{slow}_{signal}"]
|
|
curr_hist = macd_hist.iloc[-1]
|
|
prev_hist = macd_hist.iloc[-2]
|
|
|
|
# 히스토그램이 증가 중일 때만 매수 (모멘텀 강화)
|
|
macd_cross_ok = (cross_macd_signal or cross_macd_zero) and (curr_hist > prev_hist)
|
|
```
|
|
|
|
**효과**: 모멘텀 약화 구간 매수 방지
|
|
|
|
---
|
|
|
|
### 제안 2: RSI 과매도 조건 추가 (선택)
|
|
```python
|
|
# 매수조건4: RSI 과매도 + 반등 (급락 후 저가 매수)
|
|
def check_rsi_oversold_bounce(df, period=14, threshold=30):
|
|
rsi = df.ta.rsi(length=period, append=False)
|
|
if len(rsi) < 3:
|
|
return False
|
|
|
|
curr_rsi = rsi.iloc[-1]
|
|
prev_rsi = rsi.iloc[-2]
|
|
|
|
# RSI 30 이하에서 반등 시작
|
|
return (curr_rsi < threshold) and (curr_rsi > prev_rsi)
|
|
|
|
# _evaluate_buy_conditions()에 추가
|
|
if check_rsi_oversold_bounce(df):
|
|
# 추가 확인: ADX나 SMA 정배열로 신뢰도 보강
|
|
if adx_ok or sma_condition:
|
|
matches.append("매수조건4")
|
|
```
|
|
|
|
**효과**:
|
|
- ✅ 급락 후 저가 매수 기회 포착
|
|
- ✅ ADX/SMA 조건으로 가짜 신호 필터링
|
|
- ⚠️ 주의: 약세장에서는 추가 하락 위험 (백테스팅 필수)
|
|
|
|
---
|
|
|
|
### 제안 3: 볼린저 밴드 추가 (선택)
|
|
```python
|
|
# 매수조건5: 볼린저 밴드 하단 반등
|
|
def check_bollinger_bounce(df, period=20, std=2):
|
|
bb = df.ta.bbands(length=period, std=std, append=False)
|
|
if len(df) < 3:
|
|
return False
|
|
|
|
curr_close = df["close"].iloc[-1]
|
|
prev_close = df["close"].iloc[-2]
|
|
lower_band = bb[f"BBL_{period}_{std}.0"].iloc[-1]
|
|
|
|
# 하단 밴드 터치 후 반등
|
|
touched = (prev_close <= lower_band)
|
|
bouncing = (curr_close > prev_close)
|
|
|
|
return touched and bouncing
|
|
|
|
# _evaluate_buy_conditions()에 추가
|
|
if check_bollinger_bounce(df):
|
|
if macd_above_signal: # MACD 강세 확인으로 신뢰도 보강
|
|
matches.append("매수조건5")
|
|
```
|
|
|
|
**효과**:
|
|
- ✅ 변동성 확대 구간 저가 매수
|
|
- ✅ MACD 조건으로 추세 확인
|
|
- ⚠️ 주의: 하락 추세에서는 하단 밴드도 계속 하락 (백테스팅 필수)
|
|
|
|
---
|
|
|
|
## 📈 백테스팅 권장 사항
|
|
|
|
개선안을 적용하기 전 반드시 **과거 데이터로 백테스팅** 수행:
|
|
|
|
### 테스트 기간
|
|
- 최소 1년 (불장, 횡보장, 약세장 포함)
|
|
- 권장 3년 (다양한 시장 상황)
|
|
|
|
### 측정 지표
|
|
1. **수익률**: 누적 수익률, 연평균 수익률
|
|
2. **승률**: 수익 거래 / 전체 거래
|
|
3. **손익비**: 평균 수익 / 평균 손실
|
|
4. **MDD**: 최대 낙폭 (Maximum Drawdown)
|
|
5. **샤프 비율**: 위험 대비 수익
|
|
|
|
### 비교 대상
|
|
- 현재 전략 (MACD + SMA + ADX)
|
|
- 개선안 1 (히스토그램 추가)
|
|
- 개선안 2 (RSI 추가)
|
|
- 개선안 3 (볼린저 밴드 추가)
|
|
- Buy & Hold (벤치마크)
|
|
|
|
---
|
|
|
|
## 🎯 결론
|
|
|
|
### 현재 전략 평가
|
|
| 항목 | 평가 | 설명 |
|
|
|------|------|------|
|
|
| 신뢰도 | ⭐⭐⭐⭐⭐ | 복합 조건으로 가짜 신호 최소화 |
|
|
| 수익률 | ⭐⭐⭐⭐ | 추세 추종으로 안정적 수익 |
|
|
| 진입 타이밍 | ⭐⭐⭐ | 후행 지표로 다소 늦은 진입 |
|
|
| 위험 관리 | ⭐⭐⭐⭐⭐ | ADX로 약세장 필터링 우수 |
|
|
| 코드 품질 | ⭐⭐⭐⭐⭐ | 명확하고 유지보수 용이 |
|
|
|
|
### 권장 사항
|
|
1. **현재 전략 유지**: 안정성과 신뢰도가 우수
|
|
2. **백테스팅 수행**: 현재 전략의 실제 성과 측정
|
|
3. **선택적 개선**: 백테스팅 결과에 따라 히스토그램 확인 추가 검토
|
|
4. **RSI/볼린저 밴드**: 급락 매수 전략이 필요하면 추가 고려 (리스크 높음)
|
|
|
|
---
|
|
|
|
**작성자**: GitHub Copilot (Claude Sonnet 4.5)
|
|
**작성일**: 2025-12-09
|
|
**참고**:
|
|
- `src/signals.py:370-470` (_evaluate_buy_conditions)
|
|
- `docs/code_review_report_v1.md` (CRITICAL-004, HIGH-004 분석)
|