본문으로 건너뛰기

한국 주식 AI 분석 (삼성전자 005930)

KIS 페이퍼 계정 + LLM 멀티 에이전트로 005930을 분석하고, KRX 개장 시간 안에서만 페이퍼 주문이 통과하는 동작을 검증합니다.

학습 목표

  • KS:005930 형식의 심볼 파싱과 자산군 자동 추론
  • KRX 캘린더(XKRX, 09:00–15:30 KST) 안팎에서의 라우터 동작
  • KRW 가격을 USD/JPY 등 글로벌 PnL과 통합하는 환산 룰
  • KIS 토큰 만료 시 재발급 흐름 (Trouble shooting)

사전 준비

  • KIS 모의투자 키 등록 (SettingsExchange Keyskr_equity)
    • account_no, account_product_code 필수
  • FEATURE_EQUITY_ANALYSIS=true, FEATURE_EQUITY_PAPER=true
  • 시간대: 머신 또는 컨테이너 TZ가 Asia/Seoul이거나 KST 환산이 가능해야 합니다

1단계: 분석 요청

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

서버는 KS: 프리픽스로부터 asset_class=kr_equity를 자동 추론하고 KIS 데이터 패처를 사용합니다.

2단계: 보고서 검증

decision_output.currencyKRW로 채워지고, 가격 필드(ideal_buy, stop_loss, take_profit)는 모두 KRW 기준입니다.

{
"report_id": "8b1c...",
"asset_class": "kr_equity",
"symbol": "KS:005930",
"decision": "buy",
"decision_output": {
"signal": "buy",
"ideal_buy": 78400,
"stop_loss": 76200,
"take_profit": 84500,
"currency": "KRW"
}
}

3단계: 시장 시간 검증

KRX는 09:00–15:30 KST에만 거래 가능합니다. 마감 시간 외에 페이퍼 주문을 시도하면 422 MARKET_CLOSED가 반환됩니다.

curl -X POST http://localhost:8000/api/equity/orders \
-H "Authorization: Bearer $JWT" \
-d '{
"asset_class": "kr_equity",
"symbol": "KS:005930",
"side": "buy",
"qty": 10,
"order_type": "market"
}'

마감 외 응답:

{
"detail": {
"error_code": "MARKET_CLOSED",
"message": "Korean stock market is closed.",
"details": {"asset_class": "kr_equity"}
}
}

4단계: KRW → USD 환산

대시보드 자산군 필터를 all로 두면 by_asset_class.kr_equity.equity는 KRW 원화로, 상단 합산 카드는 자동 USD 환산으로 표시됩니다. 환율은 data/fx.py에서 1시간 단위 캐시로 관리됩니다.

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

응답에서 total_equity_usdby_asset_class.kr_equity.equity_krw가 함께 포함됩니다.

5단계: 보고서 분석 → 주문 → 체결

KRX 정규 시간 중에 다음 명령으로 페이퍼 주문을 제출합니다.

curl -X POST http://localhost:8000/api/equity/orders \
-H "Authorization: Bearer $JWT" \
-d '{
"asset_class": "kr_equity",
"symbol": "KS:005930",
"side": "buy",
"qty": 10,
"order_type": "limit",
"limit_price": 78400,
"time_in_force": "day",
"bracket": {"take_profit": 84500, "stop_loss": 76200},
"report_uuid": "8b1c..."
}'

검증

  • 보고서 currency=KRW
  • 마감 외 시간 주문 시 MARKET_CLOSED 422
  • 정규 시간 주문이 accepted 상태로 응답
  • 대시보드 합산이 KRW→USD 환산 일관성 유지

다음 단계