9.9 KiB
9.9 KiB
전략 모듈 구조
📁 디렉토리 구조
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
사용 예시:
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
사용 예시:
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
사용 예시:
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
- 실제 데이터 기반 포트폴리오 제안 기능
사용 예시:
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"
})
🔧 모듈 사용 방법
통합 임포트 (권장)
# 모든 전략을 한 번에 임포트
from strategies import implementations
# 또는 특정 전략만
from strategies.implementations import (
MovingAverageCrossover,
BoldAssetAllocation
)
개별 모듈 임포트
# 특정 카테고리의 전략만 필요한 경우
from strategies.impls.trend_following import MovingAverageCrossover
from strategies.impls.asset_allocation import BoldAssetAllocation
레지스트리 사용
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. 전략 클래스 작성
# 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에 추가:
from .your_category import YourStrategy
__all__ = [
# ... 기존 전략들
'YourStrategy',
]
strategies/implementations.py에 추가:
from .impls.your_category import YourStrategy
__all__ = [
# ... 기존 전략들
'YourStrategy',
]
4. 자동 등록 확인
@strategy 데코레이터를 사용하면 자동으로 레지스트리에 등록됩니다.
# 확인
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
# 좋은 예
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 (기존):
from strategies.implementations import BoldAssetAllocation
After (현재):
# 방법 1: 기존과 동일하게 사용 (권장)
from strategies.implementations import BoldAssetAllocation
# 방법 2: 직접 모듈에서 임포트
from strategies.impls.asset_allocation import BoldAssetAllocation
👍 호환성: 기존 코드 수정 불필요!
🧪 테스트
개별 모듈 테스트
# test_trend_following.py
from strategies.impls.trend_following import MovingAverageCrossover
def test_moving_average():
strategy = MovingAverageCrossover()
result = strategy.execute()
assert result["strategy"] == "MovingAverageCrossover"
통합 테스트
# 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:
strategies/impls/new_category.py생성strategies/impls/__init__.py에 임포트 추가strategies/implementations.py에 임포트 추가
Q: 전략을 다른 카테고리로 옮기려면?
A:
- 전략 클래스를 새 파일로 복사
- 두
__init__.py파일의 임포트 경로 수정 - 기존 파일에서 전략 삭제
Q: 한 전략이 여러 카테고리에 속한다면?
A: 가장 주요한 특성에 맞는 카테고리에 배치하세요. 또는 hybrid.py 같은 새 카테고리를 만드세요.