Files
kis_bot/docs/증권사_토큰_시세.md
Your Name 5e44b86f8b fix(시세): LS spill-only·토큰 파일캐시·호가 snap_time 3초컷
- _feed_fallback 미러 OFF, LS cap/grace/hold RAM을 KIS·키움 spill과 정합
- LS 접근토큰 .ls_token_cache_*.json (재시작 재사용, revoke 루프 없음)
- 호가 RAM을 틱과 동일 LIVE_FEED_FALLBACK(snap_time)로 컷, 필터 max_age=0은 유지
- 익절 지정가 로그에 실제 호가 벤더(kis/kiwoom/ls 1·2·3차) 표기

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-27 15:21:21 +09:00

11 KiB

증권사별 토큰 · 키 · 시세/구독 정리

운영 기준 메모 (코드·공식 스펙·실측). 추측 재발급 금지.
관련: kis_token_manager.py, kis_approval_manager.py, kis_trader/network/ls_token.py, kis_trader/ws/*, docs/계정.md

최종 갱신: 2026-08-19


0. 한 줄 지도

증권사 매매 REST 시세/조회 REST WS 인증 WS 구독 한도(실측/코드) 국내↔해외
한투(KIS) access_token (모의/실전 분리) 시세는 실키 권장 approval_key (REST 토큰과 별개) 국내 41/세션 approval 1키=1세션 → hold 시간분할
키움 access token (au10001) 동일 토큰 WS LOGIN = 같은 토큰 그룹당 100 (KIWOOM_WS_MAX_SUBSCRIPTIONS) 국내 WS 중심 (해외 모멘텀은 한투)
LS access_token (/oauth2/token) 동일 토큰 WS header token = 같은 토큰 문서상 유연 · 코드는 폭주 가드 토큰 1개로 국내+해외 TR

공통 사고 유형: 유효 토큰/키를 또 발급 → 상대 경로(국내↔해외·REST↔WS) 무효화.


1. 한투 (KIS)

1.1 키 종류 (역할 분리)

이름 발급 용도 무효화 주의
접근토큰 access_token POST /oauth2/tokenP 주문·잔고·시세 REST 잦은 재발급 → 제한(EGW00133 등). 1일 1회 원칙 · 유효 ~24h
approval_key POST /oauth2/Approval WebSocket만 6h 이내 재발급 금지(운영 가드). 새 키 = 기존 WS 세션 무효
AppKey/Secret 콘솔 위 둘의 자격 실전/모의 도메인·키 쌍 분리

코드:

  • 매매 클라이언트: KIS_MOCK 따름 (kis_trader.main self.client)
  • 시세/조회: 항상 실키 (market_client) — 모의 도메인 시세 미지원/500 다수
  • 토큰 파일 캐시: kis_token_manager (실전+모의 세션 미커버/만료만 발급). 앱키는 TradeDB.get_auth_env() (env_auth_config)
  • approval 파일 캐시: kis_approval_manager
    • main (국내·해외 같은 앱키 공유): .kis_approval_cache_real.json
    • ob (호가 전용 2번째 앱키, 별도 파일): .kis_approval_cache_ob_real.json — 메인 JSON을 덮지 않음
    • 호가키는 tokenP(접근토큰) 불필요. WS Approval만 슬롯 분리

1.2 REST 도메인

REST WS
실전 https://openapi.koreainvestment.com:9443 ws://ops.koreainvestment.com:21000
모의 https://openapivts.koreainvestment.com:29443 ws://ops.koreainvestment.com:31000

1.3 WebSocket 시세

TR 시장 내용 한도
H0STCNT0 국내 실시간 체결 세션당 최대 41종 (kis_ws.MAX_SUBSCRIPTIONS)

누가 41에 들어가나 (WSManager) — LIVE_TICK_PROVIDER 와 무관:

스위치 하는 일 안 하는 일
MINIMAL 한투 소켓에 누구를 넣을지. true=보유만, 후보는 키움 매매 현재가 벤더를 바꾸지 않음
LIVE_TICK get_price()어느 RAM을 먼저 볼지 한투/키움 구독 명단을 바꾸지 않음
  • 기본 (WS_SUBSCRIBE_KIS_MINIMAL=false): 후보·보유를 키움과 같이 구독. 41 넘으면 그다음 실패/spill.
  • MINIMAL=true: 한투=보유만, 후보=키움. 메인을 한투(LIVE_TICK=kis)로 바꿔도 후보 틱은 한투에 없음.
  • 영구구독 KR은 LS. 한투 41은 영구 전용 슬롯이 아님. | HDFSCNT0 | 해외 | 실시간(지연) 체결 | 별도 소켓 · 같은 approval 공유 | | (호가 등) | 국내 | 주로 REST/다른 TR · 실매 호가필터는 키움 0D / LS UH1 경로도 사용 | — |

국내↔해외 자동전환: kis_ws_session_windows

  • 국내 hold 기본 07:00~20:00 / 해외 21:00~06:00
  • 갭에서는 소켓 close만 (approval 재발급 없음)
  • 동시에 두 소켓을 열면 뒤쪽(대개 해외)이 끊김 → 시간분할 필수

1.4 히스토리 · 기타

용도 경로
분봉 REST inquire-time-itemchartprice 등 (시세=실키)
틱 적재 WS → ws_ticks / CandleAggregator → ws_candles
해외 봉 ws_candles.market=US (HDFSCNT0 롤업)
주문 REST (모의/실전 = 매매 키)

env 스위치:

  • STRATEGY_US_MOMENTUM_ENABLED — 전략 루프 (config_us_momentum)
  • OVERSEAS_WS_ENABLED — HDFSCNT0 소켓 기동 시 (env_config)
  • US_MOMENTUM_DRY_RUN — paper vs 실주문

2. 키움

2.1 토큰

항목 내용
API POST /oauth2/token (au10001)
응답 token, token_type, expires_dt (일시 문자열)
사용처 REST + WS LOGIN (approval 분리 없음)
위험 중복 발급 시 이전 토큰 무효 → 시세 WS·조건검색 동시 사망 (과거 사고)

코드: 공유 캐시 + 서버 거부(805004 등) 시에만 invalidate 후 재발급.
재연결 연타 쿨다운: KIWOOM_WS_MAX_RECONNECT_*.

2.2 WebSocket

실전 모의
URL wss://api.kiwoom.com:10000/api/dostk/websocket wss://mockapi.kiwoom.com:10000/...
type 이름 용도
0B 주식체결 틱·현재가·분봉 롤업
0D 주식호가잔량 호가필터 / OR 히스토리. 필터 RAM 나이 WS_ORDERBOOK_FILTER_MAX_AGE_SEC(기본 0=마지막 장). 저장 TTL WS_ORDERBOOK_TICK_MAX_AGE_SEC(기본 30)과 분리. 사진 한 장도 없으면 WS_ORDERBOOK_FILTER_REJECT_IF_EMPTY(기본 true)로 안 삼. 만료로 None 만들어 통과시키지 말 것
0w 종목프로그램매매 프로그램 필터
(조건) 조건검색 실시간 kiwoom_condition 유니버스

구독 한도: 그룹당 100종 (KIWOOM_WS_MAX_SUBSCRIPTIONS, 기본 100).
실매: 후보 상한 합 + 보유 + grace ≤ 100. 영구구독 KR은 LS (키움 100에 안 넣음).

2.3 히스토리

용도 경로
분봉 갭 REST ka10080 등 (키움 차트)
틱/호가/프로그램 WS → RAM + DB (ws_ticks, orderbook/program 스냅샷)

시세 실키 vs 매매 모의는 한투 쪽 정책과 혼동하지 말 것. 키움은 주로 시세/조건 담당.


3. LS증권

3.1 토큰

항목 내용
API POST https://openapi.ls-sec.co.kr:8080/oauth2/token
grant client_credentials + appkey/appsecretkey
응답 access_token, expires_in/~86400초(24h)
오류 IGW00121 / IGW00123 (무효·기간만료) → 그때만 재발급
캐시 kis_trader/network/ls_token.py — 만료 전 재사용 · LS_TOKEN_MIN_REISSUE_SEC · force 남용 금지

국내·해외·조건검색(AFR)·WS 가 토큰 1개 공유.
세션 전환·워치독 재연결에서 force 재발급하면 전 경로 무효화 (키움 중복발급과 동형).

/oauth2/revoke = 정상 폐기용. 루프에서 쓰지 않음.

3.2 WebSocket

실전 모의
URL wss://openapi.ls-sec.co.kr:9443/websocket …:29443/websocket
TR 시장 내용
US3 (기본) / S3_·K3_ 국내 체결 틱 (호가 DB MODE=tick 트리거 = 한투 CNT0·키움 0B 와 동일 역할)
UH1 / H1_·HA_ 국내 호가 → RAM (also_hoga). UH3 없음
UVI 국내 VI
JIF 국내 장운영정보 (워치독 보조)
GSC 해외 해외 체결 (82{symbol} 키)

호가 수집 (LS = 한투·키움과 같은 두 갈래)

갈래 TR 역할
실시간 호가 UH1 RAM 갱신 (실매 필터)
틱동기 DB US3 체결 때 LS_WS_ORDERBOOK_SAVE_MODE=tick 이면 RAM 호가 1장 → ls_ws_orderbook

MODE=interval 이면 UH1 경로에서 DB 저장. 세 증권사 공통 개념.
상세·8/25 Bye/sends≈1 사고: docs/호가.md §0-0b.

소켓 hold (벽시계): ls_ws_session_windows

  • 국내 07:00~20:00 / 해외 21:00~06:00(해외 구독 있을 때)
  • 갭·장외: 소켓 close + 대기, 토큰 캐시 유지
  • 틱 silence 워치독: 정규장 벽시계 우선 (sticky JIF 21로 장외 연장 금지)

3.3 히스토리 · 조건

용도 경로
분봉 갭 REST t8412ls_ws_candles
틱/호가 WS → ls_ws_ticks / ls_ws_orderbook
조건식 AFR t1860 등 (ls_condition) — JIF/벽시계 AFR 세션

4. 이 봇에서의 역할 분담 (현행)

기능 주 소스 비고
국내 주문 한투 REST 모의/실전 = KIS_MOCK
국내 틱(운영) 키움 WS (또는 한투 H0STCNT0) WS_PROVIDER / 유니버스 소스에 따름
국내 호가·프로그램 키움 0D / 0w 모멘텀 등
돌파 등 LS 유니버스 LS 조건 + LS 틱/호가 BREAKOUT_UNIVERSE_SOURCE=ls_condition
해외 모멘텀 시세 한투 HDFSCNT0 permanent_subscriptions US
해외 모멘텀 주문 한투 해외주문 US_MOMENTUM_DRY_RUN

4.1 전략 ON/OFF vs 소켓

스위치 테이블 효과 구독 해제?
STRATEGY_*_ENABLED config_{strategy} 다음 루프부터 신규매수 중단 (보유 청산은 유지) 안 함
STRATEGY_US_MOMENTUM_ENABLED config_us_momentum 위와 동일 안 함
OVERSEAS_WS_ENABLED env_config 기동 시 해외 WS 기동 여부 기동 전제 · 변경 시 재시작
permanent_subscriptions DB 테이블 영구구독 종목 목록 UI에서 종목 on/off

기동 시 OFF였던 전략을 켜려면 봇 재시작(쓰레드 미등록).


5. 재발급 체크리스트 (위반 시 작업 중지)

  1. 만료·서버 거부 코드 확인 전에는 force 발급 금지
  2. KIS approval: 6h 가드 · 국내/해외 공유 캐시만 · 세션 전환은 close/open
  3. LS: expires_in 캐시 · 세션 hold 전환 시 oauth 호출 금지
  4. 키움: LOGIN 거부 시에만 invalidate · 재연결 단계 대기 (WS_RECONNECT_DELAY_SECS, 기본 1,3,5,7,10초)
  5. 진단 스크립트도 실매와 동일 한도

6. 코드 앵커

주제 파일
KIS 접근토큰 kis_token_manager.py
KIS approval kis_approval_manager.py
KIS 국내 WS kis_trader/ws/kis_ws.py
KIS 해외 WS kis_trader/ws/kis_ws_overseas.py
KIS hold 창 kis_trader/utils/kis_ws_session_windows.py
키움 WS kis_trader/ws/kiwoom_ws.py
LS 토큰 kis_trader/network/ls_token.py
LS WS kis_trader/ws/ls_ws.py
LS hold 창 kis_trader/utils/ls_ws_session_windows.py
운영 ON/OFF UI kis_trader/web/live_config_schema.py (strategy_switch)