495 lines
10 KiB
Markdown
495 lines
10 KiB
Markdown
# BAA 전략 API curl 예제
|
|
|
|
## 서버 실행
|
|
|
|
```bash
|
|
python manage.py runserver
|
|
```
|
|
|
|
기본 URL: `http://localhost:8000/api`
|
|
|
|
---
|
|
|
|
## 1. 사용 가능한 전략 구현체 목록 조회
|
|
|
|
```bash
|
|
curl -X GET http://localhost:8000/api/strategies/implementations/ \
|
|
-H "Content-Type: application/json" | jq '.'
|
|
```
|
|
|
|
**응답 예시:**
|
|
```json
|
|
{
|
|
"available_implementations": {
|
|
"BoldAssetAllocation": {
|
|
"name": "BoldAssetAllocation",
|
|
"description": "상대 모멘텀과 절대 모멘텀을 결합한 공격적 전술적 자산배분 전략. 카나리아 유니버스 기반 크래시 보호",
|
|
"versions": [
|
|
{
|
|
"version": "1.0.0",
|
|
"default_parameters": {
|
|
"initial_capital": 100000,
|
|
"variant": "BAA-G12",
|
|
"offensive_top": 6,
|
|
"defensive_top": 3,
|
|
"breadth_param": 1,
|
|
"transaction_cost": 0.001,
|
|
"as_of_date": null,
|
|
"use_real_data": false
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 2. BAA-G12 시뮬레이션 모드 (백테스트 결과)
|
|
|
|
### 전략 실행 요청
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"version": "1.0.0",
|
|
"parameters": {
|
|
"initial_capital": 100000,
|
|
"variant": "BAA-G12",
|
|
"use_real_data": false
|
|
}
|
|
}' | jq '.'
|
|
```
|
|
|
|
**응답:**
|
|
```json
|
|
{
|
|
"execution_id": 1,
|
|
"status": "pending",
|
|
"message": "Strategy execution started"
|
|
}
|
|
```
|
|
|
|
### 실행 결과 조회
|
|
|
|
```bash
|
|
curl -X GET http://localhost:8000/api/executions/1/ | jq '.'
|
|
```
|
|
|
|
**응답 예시:**
|
|
```json
|
|
{
|
|
"execution_id": 1,
|
|
"strategy": "BoldAssetAllocation",
|
|
"version": "1.0.0",
|
|
"status": "completed",
|
|
"started_at": "2025-10-04T10:30:00Z",
|
|
"completed_at": "2025-10-04T10:30:02Z",
|
|
"execution_parameters": {
|
|
"initial_capital": 100000,
|
|
"variant": "BAA-G12",
|
|
"use_real_data": false
|
|
},
|
|
"result": {
|
|
"strategy": "BoldAssetAllocation",
|
|
"version": "1.0.0",
|
|
"variant": "BAA-G12",
|
|
"cagr": 14.6,
|
|
"max_drawdown": 8.7,
|
|
"sharpe_ratio": 1.19,
|
|
"upi": 4.81,
|
|
"profit_loss": 14600.0,
|
|
"final_capital": 114600.0
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 3. BAA-G4 실제 데이터 모드 (현재 날짜 기준 포트폴리오)
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"version": "1.0.0",
|
|
"parameters": {
|
|
"initial_capital": 50000,
|
|
"variant": "BAA-G4",
|
|
"use_real_data": true,
|
|
"as_of_date": null
|
|
}
|
|
}' | jq '.'
|
|
```
|
|
|
|
**응답:**
|
|
```json
|
|
{
|
|
"execution_id": 2,
|
|
"status": "pending",
|
|
"message": "Strategy execution started"
|
|
}
|
|
```
|
|
|
|
### 결과 조회 (약 10초 후)
|
|
|
|
```bash
|
|
curl -X GET http://localhost:8000/api/executions/2/ | jq '.'
|
|
```
|
|
|
|
**응답 예시:**
|
|
```json
|
|
{
|
|
"execution_id": 2,
|
|
"strategy": "BoldAssetAllocation",
|
|
"version": "1.0.0",
|
|
"status": "completed",
|
|
"result": {
|
|
"strategy": "BoldAssetAllocation",
|
|
"version": "1.0.0",
|
|
"variant": "BAA-G4",
|
|
"mode": "offensive",
|
|
"as_of_date": "2025-10-04",
|
|
"canary_status": {
|
|
"SPY": {
|
|
"momentum": 0.0854,
|
|
"is_bad": false
|
|
},
|
|
"VWO": {
|
|
"momentum": 0.1015,
|
|
"is_bad": false
|
|
},
|
|
"VEA": {
|
|
"momentum": 0.0863,
|
|
"is_bad": false
|
|
},
|
|
"BND": {
|
|
"momentum": 0.0132,
|
|
"is_bad": false
|
|
}
|
|
},
|
|
"canary_bad_count": 0,
|
|
"breadth_threshold": 1,
|
|
"portfolio": [
|
|
{
|
|
"ticker": "VEA",
|
|
"weight": 100.0,
|
|
"target_amount": 50000.0,
|
|
"current_price": 61.06,
|
|
"shares": 818,
|
|
"actual_amount": 49947.08
|
|
}
|
|
],
|
|
"total_allocated": 49947.08,
|
|
"cash_remaining": 52.92,
|
|
"initial_capital": 50000
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 4. 특정 날짜 기준 포트폴리오 (2024-01-31)
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"version": "1.0.0",
|
|
"parameters": {
|
|
"initial_capital": 100000,
|
|
"variant": "BAA-G12",
|
|
"use_real_data": true,
|
|
"as_of_date": "2024-01-31"
|
|
}
|
|
}' | jq '.'
|
|
```
|
|
|
|
**결과 조회:**
|
|
```bash
|
|
curl -X GET http://localhost:8000/api/executions/3/ | jq '.'
|
|
```
|
|
|
|
**응답 예시 (방어 모드):**
|
|
```json
|
|
{
|
|
"execution_id": 3,
|
|
"strategy": "BoldAssetAllocation",
|
|
"version": "1.0.0",
|
|
"status": "completed",
|
|
"result": {
|
|
"mode": "defensive",
|
|
"as_of_date": "2024-01-31",
|
|
"canary_status": {
|
|
"SPY": {
|
|
"momentum": 0.0815,
|
|
"is_bad": false
|
|
},
|
|
"VWO": {
|
|
"momentum": -0.0110,
|
|
"is_bad": true
|
|
},
|
|
"VEA": {
|
|
"momentum": 0.0350,
|
|
"is_bad": false
|
|
},
|
|
"BND": {
|
|
"momentum": 0.0169,
|
|
"is_bad": false
|
|
}
|
|
},
|
|
"canary_bad_count": 1,
|
|
"portfolio": [
|
|
{
|
|
"ticker": "DBC",
|
|
"weight": 33.33,
|
|
"current_price": 21.43,
|
|
"shares": 1555,
|
|
"actual_amount": 33317.63
|
|
},
|
|
{
|
|
"ticker": "TLT",
|
|
"weight": 33.33,
|
|
"current_price": 89.0,
|
|
"shares": 374,
|
|
"actual_amount": 33287.61
|
|
},
|
|
{
|
|
"ticker": "LQD",
|
|
"weight": 33.33,
|
|
"current_price": 101.69,
|
|
"shares": 327,
|
|
"actual_amount": 33253.17
|
|
}
|
|
],
|
|
"total_allocated": 99858.4,
|
|
"cash_remaining": 141.6
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 5. 모든 전략 변형 예제
|
|
|
|
### BAA-G12 (Balanced)
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"variant": "BAA-G12",
|
|
"initial_capital": 100000,
|
|
"use_real_data": true
|
|
}
|
|
}'
|
|
```
|
|
|
|
### BAA-G4 (Aggressive)
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"variant": "BAA-G4",
|
|
"initial_capital": 100000,
|
|
"use_real_data": true
|
|
}
|
|
}'
|
|
```
|
|
|
|
### BAA-G12/T3
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"variant": "BAA-G12/T3",
|
|
"initial_capital": 100000,
|
|
"use_real_data": true
|
|
}
|
|
}'
|
|
```
|
|
|
|
### BAA-G4/T2
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"variant": "BAA-G4/T2",
|
|
"initial_capital": 100000,
|
|
"use_real_data": true
|
|
}
|
|
}'
|
|
```
|
|
|
|
### BAA-SPY
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"variant": "BAA-SPY",
|
|
"initial_capital": 100000,
|
|
"use_real_data": true
|
|
}
|
|
}'
|
|
```
|
|
|
|
---
|
|
|
|
## 6. 파라미터 커스터마이징
|
|
|
|
### 예산 변경
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"initial_capital": 250000,
|
|
"variant": "BAA-G4",
|
|
"use_real_data": true
|
|
}
|
|
}'
|
|
```
|
|
|
|
### 특정 날짜 + 변형 조합
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"initial_capital": 150000,
|
|
"variant": "BAA-G12/T3",
|
|
"use_real_data": true,
|
|
"as_of_date": "2024-06-30"
|
|
}
|
|
}'
|
|
```
|
|
|
|
---
|
|
|
|
## 7. 비동기 실행 패턴
|
|
|
|
### 1단계: 실행 시작
|
|
```bash
|
|
EXEC_ID=$(curl -s -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"initial_capital": 50000,
|
|
"variant": "BAA-G4",
|
|
"use_real_data": true
|
|
}
|
|
}' | jq -r '.execution_id')
|
|
|
|
echo "Execution ID: $EXEC_ID"
|
|
```
|
|
|
|
### 2단계: 상태 폴링
|
|
```bash
|
|
while true; do
|
|
STATUS=$(curl -s http://localhost:8000/api/executions/${EXEC_ID}/ | jq -r '.status')
|
|
echo "Status: $STATUS"
|
|
|
|
if [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ]; then
|
|
break
|
|
fi
|
|
|
|
sleep 2
|
|
done
|
|
```
|
|
|
|
### 3단계: 최종 결과 조회
|
|
```bash
|
|
curl -s http://localhost:8000/api/executions/${EXEC_ID}/ | jq '.result'
|
|
```
|
|
|
|
---
|
|
|
|
## 8. 에러 처리
|
|
|
|
### 잘못된 variant
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {
|
|
"variant": "INVALID",
|
|
"use_real_data": true
|
|
}
|
|
}'
|
|
```
|
|
|
|
**응답:**
|
|
```json
|
|
{
|
|
"execution_id": 4,
|
|
"status": "failed",
|
|
"error_message": "Invalid parameters"
|
|
}
|
|
```
|
|
|
|
### 누락된 필수 파라미터
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"strategy_name": "BoldAssetAllocation",
|
|
"parameters": {}
|
|
}'
|
|
```
|
|
|
|
---
|
|
|
|
## 9. 원라인 실행 + 결과 조회
|
|
|
|
```bash
|
|
# 실행하고 10초 후 자동으로 결과 조회
|
|
EXEC_ID=$(curl -s -X POST http://localhost:8000/api/strategies/execute/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"strategy_name":"BoldAssetAllocation","parameters":{"initial_capital":50000,"variant":"BAA-G4","use_real_data":true}}' \
|
|
| jq -r '.execution_id') && \
|
|
echo "Execution ID: $EXEC_ID" && \
|
|
sleep 10 && \
|
|
curl -s http://localhost:8000/api/executions/${EXEC_ID}/ | jq '.'
|
|
```
|
|
|
|
---
|
|
|
|
## 참고사항
|
|
|
|
1. **jq 설치**: JSON 포맷팅을 위해 `jq` 설치 권장
|
|
```bash
|
|
# macOS
|
|
brew install jq
|
|
|
|
# Ubuntu/Debian
|
|
sudo apt-get install jq
|
|
```
|
|
|
|
2. **실행 시간**:
|
|
- 시뮬레이션 모드: 약 2초
|
|
- 실제 데이터 모드: 약 5-15초 (데이터 다운로드 시간 포함)
|
|
|
|
3. **날짜 형식**: `YYYY-MM-DD` (예: `2024-01-31`)
|
|
|
|
4. **초기 자본**: 달러($) 단위
|
|
|
|
5. **매수 수량**: 정수 주식만 매수, 잔액은 현금 보유
|