본문으로 건너뛰기

멀티 자산 포트폴리오 (BTC + AAPL + 005930)

세 자산군에 동시에 페이퍼 자금을 배분하고, 통합 대시보드에서 자산군별/통화별 PnL을 추적합니다.

학습 목표

  • BotRegistry가 user별로 격리된 BotManager를 라우팅하는 방식
  • asset_class=all 필터로 자산군별 PnL을 한 화면에 통합
  • KRW/USD/USDT 통화 혼재 시 환산 정책 이해
  • RiskManager v2가 자산군 합산 기준 일일 -5%를 계산하는 방식

사전 준비

  • 세 자산군 페이퍼 키 모두 등록 (Binance / Alpaca / KIS)
  • 모든 feature flag 활성화: FEATURE_EQUITY_ANALYSIS, FEATURE_EQUITY_PAPER
  • 페이퍼 자금 배분 (예: 각 $5,000 USD 상당)

1단계: 자산군별 봇 시작

각 자산군에 대해 봇을 띄웁니다.

# Crypto
curl -X POST http://localhost:8000/api/bot/start \
-H "Authorization: Bearer $JWT" \
-d '{"strategy":"momentum_v1","symbol":"BTC/USDT","mode":"paper"}'

# US Equity (StrategyAgent가 보고서를 만들고, 사용자가 주문 결정)
curl -X POST http://localhost:8000/api/equity/analyze \
-H "Authorization: Bearer $JWT" \
-d '{"symbol":"AAPL","mode":"standard"}'

# KR Equity
curl -X POST http://localhost:8000/api/equity/analyze \
-H "Authorization: Bearer $JWT" \
-d '{"symbol":"KS:005930","mode":"standard"}'

2단계: 통합 대시보드 확인

curl -H "Authorization: Bearer $JWT" \
"http://localhost:8000/api/dashboard/summary?asset_class=all"

응답:

{
"total_equity_usd": 14820.55,
"daily_pnl_usd": 124.30,
"daily_pnl_pct": 0.0084,
"by_asset_class": {
"crypto": {
"equity": 5024.10,
"currency": "USDT",
"daily_pnl": 12.4
},
"us_equity": {
"equity": 4950.20,
"currency": "USD",
"daily_pnl": 32.1
},
"kr_equity": {
"equity": 6800000.0,
"currency": "KRW",
"daily_pnl": 95000.0
}
},
"fx_rates": {
"USD_KRW": 1391.5,
"USDT_USD": 1.0
}
}

3단계: 자산군 필터 토글

웹 대시보드 상단의 자산군 필터를 crypto / us_equity / kr_equity / all로 차례로 전환하면서 다음을 확인합니다.

  • Positions 페이지가 선택된 자산군의 포지션만 표시
  • Trades 페이지의 currency 컬럼이 USDT/USD/KRW로 분리
  • Backtest 결과에 asset_class 메타가 부여

4단계: 자산군 통합 RiskManager 동작

RiskManager v2는 모든 자산군 PnL을 USD로 환산해 일일 -5%를 계산합니다. 임의로 페이퍼 손실을 발생시키면 (예: 큰 시그널 강제 진입) 자산군 합산 -5%에 도달하는 순간 자동 일시 중단이 트리거됩니다.

자세한 흐름은 운영 인시던트 대응을 참고하세요.

5단계: 멀티유저 격리 검증

이 사용자의 모든 데이터는 WHERE user_id = $current_user에 의해 격리됩니다. 다른 사용자 토큰으로 동일 보고서 ID에 접근하면 404를 받습니다.

# user-A의 보고서 ID로 user-B 토큰으로 접근
curl -H "Authorization: Bearer $JWT_USER_B" \
"http://localhost:8000/api/equity/reports/0c3a5b..."
# → 404 Report not found

검증

  • total_equity_usd가 세 자산군 환산값의 합과 ±0.1% 이내
  • 자산군 필터가 모든 페이지에서 일관 적용
  • 자산군 합산 일일 PnL이 -5% 도달 시 봇 자동 중단
  • 다른 user 토큰으로 보고서/주문 접근 시 404

다음 단계