228 lines
6.0 KiB
Markdown
228 lines
6.0 KiB
Markdown
# 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
|
||
|
||
## 라이선스
|
||
|
||
이 구현은 교육 및 연구 목적으로만 사용되어야 합니다.
|