feat: 프로젝트 기본 구조 구축

This commit is contained in:
2025-10-04 22:11:32 +09:00
parent 01403c7df4
commit ab99abad8a
36 changed files with 32356 additions and 199 deletions

227
BAA_STRATEGY_README.md Normal file
View File

@@ -0,0 +1,227 @@
# Bold Asset Allocation (BAA) 전략 구현
## 개요
Bold Asset Allocation (BAA)는 상대 모멘텀과 절대 모멘텀을 결합한 공격적 전술적 자산배분 전략입니다. Wouter J. Keller의 논문 "Relative and Absolute Momentum in Times of Rising/Low Yields" (2022)를 기반으로 구현되었습니다.
## 주요 특징
### 1. 이중 모멘텀 시스템
- **상대 모멘텀 (SMA12)**: 느린 모멘텀 필터로 공격/방어 유니버스에서 자산 선택
- **절대 모멘텀 (13612W)**: 빠른 모멘텀 필터로 카나리아 유니버스의 크래시 보호
### 2. 카나리아 유니버스 기반 크래시 보호
- 카나리아 유니버스: SPY, VWO, VEA, BND
- Breadth Parameter (B=1): 카나리아 자산 중 **하나라도** 음수 모멘텀이면 방어 모드로 전환
- 결과: 약 60%의 시간을 방어 모드에서 운용
### 3. 다양한 전략 변형
#### BAA-G12 (Balanced)
- **공격 유니버스**: 12개 글로벌 자산 (주식 7 + 대체자산 3 + 채권 2)
- **선택**: Top 6 자산
- **성과** (Dec 1970 - Jun 2022):
- CAGR: 14.6%
- Max DD: 8.7%
- Sharpe Ratio: 1.19
- Defensive Fraction: 57.2%
#### BAA-G4 (Aggressive)
- **공격 유니버스**: 4개 글로벌 자산 (QQQ, VWO, VEA, BND)
- **선택**: Top 1 자산
- **성과** (Dec 1970 - Jun 2022):
- CAGR: 21.0%
- Max DD: 14.6%
- Sharpe Ratio: 1.21
- Defensive Fraction: 57.2%
#### BAA-G12/T3
- BAA-G12와 동일하나 Top 3 선택
#### BAA-G4/T2
- BAA-G4와 동일하나 Top 2 선택
#### BAA-SPY
- 공격 유니버스: SPY만 사용
- 방어/카나리아는 동일
### 4. 방어 유니버스
- **자산**: TIP, DBC, BIL, IEF, TLT, LQD, BND
- **특징**: 인플레이션 보호 채권(TIP) + 원자재(DBC) 포함
- **선택**: Top 3 자산 (SMA12 모멘텀 기준)
- **보호**: BIL보다 모멘텀이 낮은 자산은 BIL로 교체
## 사용 방법
### 1. 시뮬레이션 모드 (백테스트 결과)
```python
from strategies.implementations import BoldAssetAllocation
strategy = BoldAssetAllocation()
result = strategy.execute({
"initial_capital": 100000,
"variant": "BAA-G12", # 또는 "BAA-G4", "BAA-SPY" 등
"use_real_data": False
})
print(result)
```
### 2. 실제 데이터 모드 (포트폴리오 제안)
```python
strategy = BoldAssetAllocation()
# 현재 날짜 기준
result = strategy.execute({
"initial_capital": 50000, # $50,000
"variant": "BAA-G4",
"use_real_data": True,
"as_of_date": None, # 현재 날짜
})
# 결과 예시:
# {
# "mode": "offensive", # 또는 "defensive"
# "canary_status": {
# "SPY": {"momentum": 0.085, "is_bad": false},
# ...
# },
# "portfolio": [
# {
# "ticker": "VEA",
# "weight": 100.0,
# "current_price": 61.06,
# "shares": 818,
# "actual_amount": 49947.08
# }
# ],
# "cash_remaining": 52.92
# }
```
### 3. 특정 날짜 기준 포트폴리오
```python
result = strategy.execute({
"initial_capital": 100000,
"variant": "BAA-G12",
"use_real_data": True,
"as_of_date": "2024-01-31", # YYYY-MM-DD 형식
})
```
## 파라미터 설명
| 파라미터 | 기본값 | 설명 |
|---------|--------|------|
| `initial_capital` | 100000 | 초기 자본 (달러) |
| `variant` | "BAA-G12" | 전략 변형 선택 |
| `offensive_top` | 6 | 공격 유니버스에서 선택할 자산 수 |
| `defensive_top` | 3 | 방어 유니버스에서 선택할 자산 수 |
| `breadth_param` | 1 | 카나리아 자산 중 몇 개가 bad일 때 방어 전환 |
| `transaction_cost` | 0.001 | 거래 비용 (0.1%) |
| `use_real_data` | False | 실제 데이터 사용 여부 |
| `as_of_date` | None | 기준일 (None이면 현재, "YYYY-MM-DD" 형식) |
## 모멘텀 계산 방식
### SMA(12) 상대 모멘텀
```
momentum = (현재가 / SMA(13)) - 1
```
- SMA(13): 최근 13개월 종가의 단순이동평균 (현재 포함)
- 자산 순위 매기기에 사용
### 13612W 절대 모멘텀
```
momentum = (12×RET(1m) + 4×RET(3m) + 2×RET(6m) + 1×RET(12m)) / 19
```
- 1개월 수익률에 가장 높은 가중치 (40%)
- 음수/양수 여부로 크래시 보호 신호 판단
## 월간 리밸런싱 프로세스
1. **카나리아 체크**: 13612W 모멘텀으로 카나리아 유니버스 평가
2. **모드 결정**: B=1이므로 카나리아 자산 중 1개라도 bad면 방어 모드
3. **자산 선택**:
- **공격 모드**: SMA(12) 상위 자산 선택
- **방어 모드**: SMA(12) 상위 자산 선택 + BIL 보호
4. **동일 가중**: 선택된 자산에 동일 비중 배분
5. **매수 수량 계산**: 정수 주식만 매수, 잔액은 현금 보유
## 실행 결과 예시
### 공격 모드 (2025-10-04)
```json
{
"mode": "offensive",
"canary_bad_count": 0,
"portfolio": [
{
"ticker": "VEA",
"weight": 100.0,
"shares": 818,
"actual_amount": 49947.08
}
]
}
```
### 방어 모드 (2024-01-31)
```json
{
"mode": "defensive",
"canary_bad_count": 1,
"canary_status": {
"VWO": {
"momentum": -0.011,
"is_bad": true
}
},
"portfolio": [
{"ticker": "DBC", "weight": 33.33, "shares": 1555},
{"ticker": "TLT", "weight": 33.33, "shares": 374},
{"ticker": "LQD", "weight": 33.33, "shares": 327}
]
}
```
## 성과 지표
### Keller Ratio (K)
```
K = R × (1 - 2D) / (1 - 2D) when D < 25%
```
- R: CAGR
- D: Maximum Drawdown
- 작은 낙폭에는 적게, 큰 낙폭에는 많이 패널티
### 기타 지표
- **UPI** (Ulcer Performance Index): Sharpe Ratio의 변형, 낙폭 기반
- **Sharpe Ratio**: 전통적 위험 조정 수익률
- **Defensive Fraction**: 방어 모드 비율
## 60/40 벤치마크 대비 성과
| 지표 | BAA-G12 | BAA-G4 | 60/40 |
|------|---------|--------|-------|
| CAGR | 14.6% | 21.0% | 9.5% |
| Max DD | 8.7% | 14.6% | 29.5% |
| Sharpe | 1.19 | 1.21 | - |
| Volatility | 8.5% | 13.6% | - |
## 테스트
```bash
python test_baa.py
```
## 참고 문헌
Keller, W. J. (2022). "Relative and Absolute Momentum in Times of Rising/Low Yields: Bold Asset Allocation (BAA)", SSRN 4166845
## 라이선스
이 구현은 교육 및 연구 목적으로만 사용되어야 합니다.