Files
executor/STRATEGY_MODULES_README.md

413 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 전략 모듈 구조
## 📁 디렉토리 구조
```
strategies/
├── __init__.py
├── base.py # 기본 클래스 및 레지스트리
├── implementations.py # 통합 임포트 모듈
├── models.py # Django 모델
├── views.py # Django 뷰
├── urls.py # URL 라우팅
└── impls/ # 전략 구현체 모듈
├── __init__.py # 모듈 통합
├── trend_following.py # 추세 추종 전략
├── mean_reversion.py # 평균 회귀 전략
├── volatility_breakout.py # 변동성 돌파 전략
└── asset_allocation.py # 자산 배분 전략
```
---
## 📊 전략 분류
### 1. 추세 추종(Trend Following) 전략
**파일**: `strategies/impls/trend_following.py`
이동평균선, 모멘텀 등 추세를 따라가는 전략들
#### 포함된 전략:
- **MovingAverageCrossover** (v1.0.0)
- 단기/장기 이동평균선 교차 전략
- 골든크로스/데드크로스 기반
- 파라미터: `short_window`, `long_window`
**사용 예시:**
```python
from strategies.impls.trend_following import MovingAverageCrossover
strategy = MovingAverageCrossover()
result = strategy.execute({
"short_window": 20,
"long_window": 50,
"initial_capital": 100000
})
```
---
### 2. 평균 회귀(Mean Reversion) 전략
**파일**: `strategies/impls/mean_reversion.py`
RSI, 볼린저밴드 등 과매수/과매도 구간에서 반대 방향으로 거래
#### 포함된 전략:
- **RSIMeanReversion** (v1.0.0)
- RSI 지표 기반 평균회귀
- 과매수(70)/과매도(30) 구간 역방향 거래
- 파라미터: `rsi_period`, `oversold_threshold`, `overbought_threshold`
**사용 예시:**
```python
from strategies.impls.mean_reversion import RSIMeanReversion
strategy = RSIMeanReversion()
result = strategy.execute({
"rsi_period": 14,
"oversold_threshold": 30,
"overbought_threshold": 70,
"initial_capital": 100000
})
```
---
### 3. 변동성 돌파(Volatility Breakout) 전략
**파일**: `strategies/impls/volatility_breakout.py`
볼린저 밴드, ATR 등 변동성 기반 돌파 전략들
#### 포함된 전략:
- **BollingerBandBreakout** (v2.0.0)
- 볼린저 밴드 상한/하한 돌파 전략
- 변동성 확장 구간 포착
- 파라미터: `period`, `std_dev`, `stop_loss`
**사용 예시:**
```python
from strategies.impls.volatility_breakout import BollingerBandBreakout
strategy = BollingerBandBreakout()
result = strategy.execute({
"period": 20,
"std_dev": 2.0,
"initial_capital": 100000
})
```
---
### 4. 자산 배분(Asset Allocation) 전략
**파일**: `strategies/impls/asset_allocation.py`
전술적 자산배분, 리스크 패리티 등 다양한 자산에 배분하는 전략들
#### 포함된 전략:
- **BoldAssetAllocation** (v1.0.0)
- 상대/절대 모멘텀 결합 전략
- 카나리아 유니버스 기반 크래시 보호
- 5가지 변형: BAA-G12, BAA-G4, BAA-G12/T3, BAA-G4/T2, BAA-SPY
- 실제 데이터 기반 포트폴리오 제안 기능
**사용 예시:**
```python
from strategies.impls.asset_allocation import BoldAssetAllocation
# 시뮬레이션 모드
strategy = BoldAssetAllocation()
result = strategy.execute({
"variant": "BAA-G12",
"initial_capital": 100000,
"use_real_data": False
})
# 실제 데이터 모드
result = strategy.execute({
"variant": "BAA-G4",
"initial_capital": 50000,
"use_real_data": True,
"as_of_date": "2024-01-31"
})
```
---
## 🔧 모듈 사용 방법
### 통합 임포트 (권장)
```python
# 모든 전략을 한 번에 임포트
from strategies import implementations
# 또는 특정 전략만
from strategies.implementations import (
MovingAverageCrossover,
BoldAssetAllocation
)
```
### 개별 모듈 임포트
```python
# 특정 카테고리의 전략만 필요한 경우
from strategies.impls.trend_following import MovingAverageCrossover
from strategies.impls.asset_allocation import BoldAssetAllocation
```
### 레지스트리 사용
```python
from strategies.base import StrategyRegistry
# 등록된 전략 조회
available = StrategyRegistry.list_strategies()
# 전략 인스턴스 생성
strategy = StrategyRegistry.get_strategy(
name="BoldAssetAllocation",
version="1.0.0"
)
```
---
## 새 전략 추가하기
### 1. 적절한 카테고리 선택
전략 유형에 따라 해당 파일 선택:
- 추세 추종 → `trend_following.py`
- 평균 회귀 → `mean_reversion.py`
- 변동성 돌파 → `volatility_breakout.py`
- 자산 배분 → `asset_allocation.py`
새 카테고리가 필요하면 새 파일 생성 (예: `arbitrage.py`)
### 2. 전략 클래스 작성
```python
# strategies/impls/your_category.py
from typing import Dict, Any
from ..base import BaseQuantStrategy, strategy
@strategy
class YourStrategy(BaseQuantStrategy):
"""전략 설명"""
@property
def name(self) -> str:
return "YourStrategy"
@property
def description(self) -> str:
return "전략에 대한 상세 설명"
@property
def version(self) -> str:
return "1.0.0"
@property
def default_parameters(self) -> Dict[str, Any]:
return {
"param1": "value1",
"param2": "value2"
}
def validate_parameters(self, parameters: Dict[str, Any]) -> bool:
# 파라미터 검증 로직
return True
def execute(self, parameters: Dict[str, Any] = None) -> Dict[str, Any]:
# 전략 실행 로직
return {
"strategy": self.name,
"result": "..."
}
```
### 3. 임포트 경로 추가
#### `strategies/impls/__init__.py`에 추가:
```python
from .your_category import YourStrategy
__all__ = [
# ... 기존 전략들
'YourStrategy',
]
```
#### `strategies/implementations.py`에 추가:
```python
from .impls.your_category import YourStrategy
__all__ = [
# ... 기존 전략들
'YourStrategy',
]
```
### 4. 자동 등록 확인
`@strategy` 데코레이터를 사용하면 자동으로 레지스트리에 등록됩니다.
```python
# 확인
python manage.py shell
>>> from strategies.base import StrategyRegistry
>>> StrategyRegistry.list_strategies()
# YourStrategy가 포함되어 있는지 확인
```
---
## 📝 모범 사례
### 1. 파일 조직
- 한 파일에 너무 많은 전략을 넣지 마세요 (최대 5개 권장)
- 유사한 특성의 전략끼리 그룹화
### 2. 명명 규칙
- 클래스명: PascalCase (예: `MovingAverageCrossover`)
- 파일명: snake_case (예: `trend_following.py`)
- 전략 이름(name): 클래스명과 동일
### 3. 문서화
- 각 파일 상단에 독스트링으로 카테고리 설명
- 각 전략 클래스에 독스트링으로 전략 설명
- 파라미터 의미를 주석으로 명시
### 4. 의존성 관리
- 공통 의존성: 파일 상단에 import
- 선택적 의존성: 함수/메서드 내부에서 import
```python
# 좋은 예
import time
import random
from typing import Dict, Any
from ..base import BaseQuantStrategy, strategy
@strategy
class MyStrategy(BaseQuantStrategy):
def execute(self, parameters):
# 여기서만 필요한 라이브러리
import some_optional_lib
...
```
---
## 🔄 마이그레이션 가이드
### 기존 `implementations.py`에서 분리된 코드 사용하기
#### Before (기존):
```python
from strategies.implementations import BoldAssetAllocation
```
#### After (현재):
```python
# 방법 1: 기존과 동일하게 사용 (권장)
from strategies.implementations import BoldAssetAllocation
# 방법 2: 직접 모듈에서 임포트
from strategies.impls.asset_allocation import BoldAssetAllocation
```
**👍 호환성**: 기존 코드 수정 불필요!
---
## 🧪 테스트
### 개별 모듈 테스트
```python
# test_trend_following.py
from strategies.impls.trend_following import MovingAverageCrossover
def test_moving_average():
strategy = MovingAverageCrossover()
result = strategy.execute()
assert result["strategy"] == "MovingAverageCrossover"
```
### 통합 테스트
```python
# test_all_strategies.py
from strategies.implementations import (
MovingAverageCrossover,
RSIMeanReversion,
BollingerBandBreakout,
BoldAssetAllocation
)
strategies = [
MovingAverageCrossover(),
RSIMeanReversion(),
BollingerBandBreakout(),
BoldAssetAllocation()
]
for strategy in strategies:
result = strategy.execute()
assert "strategy" in result
```
---
## 🎯 장점
### 1. 코드 구조화
- 관련 전략끼리 그룹화
- 파일 크기 감소 (가독성 향상)
- 명확한 책임 분리
### 2. 유지보수성
- 특정 카테고리만 수정 가능
- 머지 충돌 감소
- 버그 추적 용이
### 3. 확장성
- 새 카테고리 쉽게 추가
- 독립적인 개발 가능
- 팀 협업 용이
### 4. 성능
- 필요한 모듈만 로드
- 메모리 사용 최적화
- 빠른 개발 서버 재시작
---
## 📚 참고
- **기본 클래스**: `strategies/base.py`
- **레지스트리**: `strategies/base.py - StrategyRegistry`
- **API 가이드**: `API_USAGE_GUIDE.md`
- **BAA 전략**: `BAA_STRATEGY_README.md`
---
## ❓ FAQ
### Q: 기존 코드가 작동하지 않나요?
**A:** 아니요! `implementations.py`가 자동으로 모든 모듈을 임포트하므로 기존 코드는 그대로 작동합니다.
### Q: 새 카테고리를 추가하려면?
**A:**
1. `strategies/impls/new_category.py` 생성
2. `strategies/impls/__init__.py`에 임포트 추가
3. `strategies/implementations.py`에 임포트 추가
### Q: 전략을 다른 카테고리로 옮기려면?
**A:**
1. 전략 클래스를 새 파일로 복사
2.`__init__.py` 파일의 임포트 경로 수정
3. 기존 파일에서 전략 삭제
### Q: 한 전략이 여러 카테고리에 속한다면?
**A:** 가장 주요한 특성에 맞는 카테고리에 배치하세요. 또는 `hybrid.py` 같은 새 카테고리를 만드세요.