키움 REST API 자동매매 완전 가이드 — OpenAPI+와 차이부터 전환까지
먼저 짚고 갑니다 (정확성): 이 글은 키움 REST API의 구조와 설계 원리를 설명하는 데 초점을 둡니다. 정확한 도메인·엔드포인트 경로·api-id(TR 코드)·토큰 만료 시간·요청 제한 수치·응답 필드명은 버전에 따라 달라질 수 있으므로, 실제 구현 전 반드시 키움증권 공식 개발자 문서를 기준으로 확인하세요. 아래 코드는 동작 구조를 보여주는 개념 예시입니다.
"키움으로 자동매매를 하려는데, 검색하면 죄다 32bit Python에 PyQt5에 영웅문 로그인 이야기뿐이다" — 오랫동안 키움 자동매매의 표준이었던 OpenAPI+(OCX) 이야기입니다. 그런데 키움증권이 REST API + WebSocket 방식의 차세대 인터페이스를 내놓으면서, 그동안 키움을 피하게 만들던 32bit·Windows 종속·이벤트 콜백 지옥이 상당 부분 사라졌습니다.
이 글은 키움 REST API로 자동매매를 시작하려는 분을 기준으로, OpenAPI+와 무엇이 다른지부터 인증·주문·실시간·요청 제한·마이그레이션까지 순서대로 정리한 hub입니다. 자동매매 자체가 처음이라면 먼저 주식 자동매매 완전 입문 가이드를, 키움과 한투 중 무엇을 고를지 고민이라면 키움 vs KIS 비교를 함께 보세요(단, 그 글은 키움을 레거시 OpenAPI+ 기준으로 비교합니다 — 이번 글이 그 빈칸을 채웁니다).
이 글에서 다루는 10가지
- 키움 REST API란 — 무엇이 새로워졌나
- 키움 OpenAPI+ (구) vs 키움 REST API (신) 비교
- 키움 REST API vs 한투 KIS API — 이제 비슷해졌다
- 누가 REST로 가야 하나 (의사결정)
- 시작 준비 — 계좌·앱키·시크릿·모의투자
- 인증 — 접근토큰 발급과 캐싱 (코드)
- 주문·조회 — api-id(TR) 구조 (코드)
- 실시간 데이터 — WebSocket
- TR limit(요청 제한) 다루기
- OpenAPI+ → REST 마이그레이션 + 함정 + 비용
1키움 REST API란 — 무엇이 새로워졌나
키움 REST API는 표준 HTTP 요청-응답(REST)으로 주문·조회를 하고, WebSocket으로 실시간 시세·체결을 받는 방식입니다. 핵심 변화는 OCX(COM) 의존이 사라졌다는 것입니다. 이 한 가지가 다음을 전부 바꿉니다.
- OS 독립 — Windows뿐 아니라 macOS·Linux에서 그대로 동작
- 64bit — 32bit 강제가 사라져 판다스·머신러닝 라이브러리와 충돌 없음
- 영웅문·KOA Studio 불필요 — HTS 자동 로그인 대신 토큰 인증
- 동기 요청-응답 — 이벤트 콜백/시그널 대기 구조에서 벗어남
- 서버 배포 용이 — VPS·클라우드에 그대로 올림
요약하면, "KIS API에서 좋았던 점들을 키움에서도 쓸 수 있게 된 것"에 가깝습니다.
2키움 OpenAPI+ (구) vs 키움 REST API (신)
| 항목 | 키움 OpenAPI+ (레거시) | 키움 REST API (차세대) |
|---|---|---|
| 방식 | OCX / COM | REST + WebSocket |
| 운영체제 | Windows 전용 | Win / Mac / Linux |
| Python 비트 | 32bit 필수 | 64bit |
| 필수 도구 | 영웅문·KOA Studio·PyQt5 | requests/httpx (HTTP 클라이언트) |
| 인증 | 영웅문 자동 로그인(HTS) | 앱키·시크릿 → 접근토큰 |
| 호출 모델 | 이벤트 콜백(비동기 시그널) | 동기 요청-응답 |
| 실시간 | 화면번호 기반 실시간 등록 | WebSocket 구독 |
| 서버/클라우드 배포 | 까다로움(HTS 상주) | 쉬움 |
| 학습 자료 | 매우 풍부(10년+ 축적) | 늘어나는 중 |
💡 핵심: OpenAPI+의 가장 큰 장벽이던 "32bit + Windows + PyQt5 이벤트 루프"가 REST에서는 전부 사라집니다. 대신 자료·예제가 OpenAPI+만큼 많지는 않아, 공식 문서를 직접 읽는 능력이 더 중요해집니다.
3키움 REST API vs 한투 KIS API
그동안 "REST·OS독립·64bit·다봇 운영"은 한국투자증권 KIS API의 장점이었습니다. 키움 REST API가 나오면서 이 격차가 상당히 좁혀졌습니다. 둘 다 앱키·시크릿 → 접근토큰 방식이라 인증 흐름이 매우 비슷합니다.
국내 주식·선물옵션 중심, 키움 계좌·생태계를 이미 쓰는 경우, 국내 종목 데이터·체결 친숙도.
미국·일본 등 해외주식 폭넓은 커버리지가 필요할 때. 해외는 KIS가 더 넓습니다. → KIS API 발급 30분 가이드
인증 토큰 방식이 닮아서, KIS 토큰 발급 가이드를 이해했다면 키움 REST 토큰도 금방 적응합니다. 국내는 키움 REST, 해외는 KIS로 병행하는 구성도 합리적입니다. 증권사 전체 비교는 → 키움·KIS·LS·대신 자동매매 API 비교를 참고하세요.
4누가 REST로 가야 하나
이미 잘 도는 OpenAPI+ 봇을 굳이 갈아엎을 필요는 없습니다. 다음에 해당하면 REST의 이점이 큽니다.
- macOS·Linux에서 개발/운영하고 싶다
- 64bit 라이브러리(판다스·사이킷런 등)를 봇과 같은 환경에서 쓰고 싶다
- VPS·클라우드에 무인 배포하고 싶다
- 한 계정으로 봇을 여러 개 돌리고 싶다(토큰 기반)
- 32bit·OCX·PyQt5 이벤트 함정에 자주 막힌다
- 새 프로젝트라 처음부터 깔끔하게 시작하고 싶다
✅ 권장: 신규 프로젝트는 REST로 시작. 기존 OpenAPI+ 자산은 무리해서 옮기기보다, 다음 큰 개편 때 전환을 검토하는 것이 비용 대비 합리적입니다.
5시작 준비 — 계좌·앱키·시크릿
- 키움증권 계좌 — 본인 명의 (비대면 개설 가능)
- REST API 사용 신청 — 키움 공식 개발자 페이지에서 신청·동의
- 앱키(App Key) · 시크릿(Secret Key) 발급 — 실전/모의 별도 (화면 그대로 따라하려면 → 키움 REST API 인증키 발급 가이드)
- 모의투자 환경 — 실거래 전 가상 자금으로 검증
- 키는 .env로 분리 — 소스에 하드코딩 금지, .gitignore 등록
⚠️ 보안 1순위: 앱키·시크릿이 깃허브·블로그에 노출되면 타인이 내 계좌로 주문을 낼 수 있습니다. .env 분리 + .gitignore 등록을 발급 직후 바로 확인하세요. 인증 키 관리 원칙은 거래소·증권사가 달라도 동일합니다 → 키 발급·보안 가이드(KIS 기준, 원칙 공통)
6인증 — 접근토큰 발급과 캐싱
키움 REST API는 앱키·시크릿으로 접근토큰을 발급받아, 이후 모든 요청 헤더에 그 토큰을 실어 보냅니다(KIS와 동일한 패턴). 토큰은 만료 시간이 있으므로 캐싱하고 만료 전에만 재발급해야 합니다. 개념 예시는 다음과 같습니다.
import os, requests
# 실전: https://api.kiwoom.com / 모의: 별도 도메인 (공식 문서 확인)
BASE = "https://api.kiwoom.com"
APP_KEY = os.environ["KIWOOM_APPKEY"]
APP_SECRET = os.environ["KIWOOM_SECRETKEY"]
def issue_token():
res = requests.post(
f"{BASE}/oauth2/token",
headers={"Content-Type": "application/json;charset=UTF-8"},
json={
"grant_type": "client_credentials",
"appkey": APP_KEY,
"secretkey": APP_SECRET,
},
timeout=10,
)
data = res.json()
# 응답 필드명(token / expires_dt 등)은 공식 문서 기준 확인
return data["token"], data.get("expires_dt")
실제 운영에서는 토큰을 파일/메모리에 캐싱하고, 만료 시각 이전에 자동 재발급하는 래퍼를 둡니다.
import time
_cache = {"token": None, "exp": 0}
def get_token():
# 만료 60초 전이면 재발급
if not _cache["token"] or time.time() > _cache["exp"] - 60:
token, _ = issue_token()
_cache["token"] = token
_cache["exp"] = time.time() + 23 * 3600 # 보수적으로(실제 만료는 문서 확인)
return _cache["token"]
⚠️ 가장 흔한 사고: 매 요청마다 토큰을 새로 발급 → 요청 제한에 걸려 차단. 토큰은 반드시 한 번 받아 캐싱하세요. 토큰 발급 자체에도 호출 빈도 제한이 있습니다.
7주문·조회 — api-id(TR) 구조
키움 REST API는 기능(주문, 잔고조회, 시세조회 등)을 api-id(TR 코드)로 구분합니다. 같은 엔드포인트라도 헤더의 api-id 값에 따라 다른 거래(TR)가 실행되는 구조입니다(레거시의 TR명 개념이 헤더로 옮겨온 형태). 개념 예시:
def post_tr(path, api_id, body):
res = requests.post(
f"{BASE}{path}",
headers={
"authorization": f"Bearer {get_token()}",
"api-id": api_id, # 정확한 코드는 공식 문서 참조
"Content-Type": "application/json;charset=UTF-8",
},
json=body,
timeout=10,
)
return res.json()
# 예: 국내주식 매수 주문 (경로·api-id·필드명은 공식 문서 기준 확인)
def buy(stock_code, qty, price=0):
return post_tr(
"/api/dostk/ordr", # 주문 엔드포인트 (예시)
api_id="<주문 TR api-id>", # 예시 — 실제 코드는 문서에서
body={
"dmst_stex_tp": "KRX", # 거래소 구분
"stk_cd": stock_code, # 종목코드 (예: 005930)
"ord_qty": str(qty), # 주문수량
"ord_uv": str(price), # 주문단가 (시장가는 0/구분값)
"trde_tp": "3", # 매매구분 (지정가/시장가 등)
},
)
💡 설계 포인트: 레거시 OpenAPI+의 SetInputValue → CommRqData 시퀀스(입력 슬롯 공유로 인한 "TR busy" 함정)가 REST에서는 사라집니다. 각 요청이 독립적인 HTTP 호출이라, 응답 코드와 JSON만 확인하면 됩니다. 다만 요청 제한(rate limit)은 여전히 존재하므로 동시 호출을 직렬화/큐잉해야 합니다(다음 절).
8실시간 데이터 — WebSocket
실시간 시세·체결·잔고 변동은 WebSocket으로 받습니다. 접속 후 토큰으로 로그인(인증) 메시지를 보내고, 원하는 실시간 항목(종목·타입)을 등록(구독)하면 이벤트가 푸시됩니다. 레거시의 "화면번호 + 실시간 등록" 개념이 WebSocket 구독으로 바뀐 것입니다.
import json, websocket # websocket-client
# WebSocket 주소·로그인/등록 메시지 포맷은 공식 문서 기준 확인
WS_URL = "wss://api.kiwoom.com:10000/api/dostk/websocket" # 예시
def on_open(ws):
ws.send(json.dumps({"trnm": "LOGIN", "token": get_token()})) # 인증
# 인증 응답 후 실시간 등록 메시지 전송 (종목/타입 구독)
def on_message(ws, msg):
data = json.loads(msg)
# PING 수신 시 PONG 응답 (연결 유지)
# 실시간 체결/호가 데이터 처리
ws = websocket.WebSocketApp(WS_URL, on_open=on_open, on_message=on_message)
ws.run_forever()
⚠️ 함정: WebSocket은 일정 시간/네트워크 상황에 따라 끊깁니다. 재연결 + 재로그인 + 실시간 재등록 로직이 없으면, 봇은 "시세 받는 중"인 줄 알고 매매를 멈춥니다. ping/pong 하트비트도 반드시 처리하세요.
9TR limit(요청 제한) 다루기
"키움 rest api tr limit"은 많이 검색되는 주제입니다. REST로 바뀌어도 초당 요청 수 제한은 존재합니다. 무한정 빠르게 호출하면 차단되므로, 다음 원칙으로 설계합니다.
- 토큰 캐싱 — 토큰 발급은 가장 아껴야 할 호출. 한 번 받아 재사용.
- 요청 직렬화/큐잉 — 동시에 쏟아붓지 말고 큐에 넣어 일정 간격으로 처리.
- 레이트 리미터 — 초당 허용 횟수에 맞춘 토큰버킷/슬립 적용.
- 조회 통합 — 잔고 응답에 포함된 정보로 별도 조회를 줄임.
- 실시간은 WebSocket으로 — 시세를 폴링하지 말고 구독으로 전환(REST 호출 수 급감).
import time, threading
class RateLimiter:
def __init__(self, per_sec):
self.interval = 1.0 / per_sec
self.lock = threading.Lock()
self.last = 0.0
def wait(self):
with self.lock:
now = time.time()
gap = self.interval - (now - self.last)
if gap > 0: time.sleep(gap)
self.last = time.time()
limiter = RateLimiter(per_sec=4) # 허용치는 공식 문서 기준으로 설정
# 매 REST 호출 전에 limiter.wait()
참고로 레거시 OpenAPI+는 보통 초당 약 5회 수준을 권장했습니다. REST의 정확한 허용치는 엔드포인트별로 다를 수 있으니 공식 문서 값을 기준으로 잡으세요.
10OpenAPI+ → REST 마이그레이션 + 함정 + 비용
마이그레이션 체크리스트
- 이벤트 콜백 → 동기 요청-응답으로 호출 구조 재설계
- 32bit PyQt5 환경 → 64bit HTTP 클라이언트 환경으로 전환
- 영웅문 자동 로그인 → 토큰 발급·캐싱 로직으로 교체
- 화면번호 실시간 등록 → WebSocket 구독으로 변경
- 레거시 TR명 → REST api-id 매핑표 작성
- 요청 제한 대응(레이트 리미터·큐) 추가
함정 5가지
- 토큰 매 요청 재발급 → 제한 차단. 캐싱 필수.
- 실전/모의 도메인 혼동 → 모의로 짠 코드를 실전에 그대로. base URL을 환경변수 토글로.
- api-id 헤더 누락·오타 → 엉뚱한 TR 실행 또는 에러.
- WebSocket 재연결·재등록 누락 → 끊긴 줄 모르고 매매 정지.
- 요청 제한 초과 → 일시 차단. 직렬화·레이트 리미터로 방지.
레거시 설치·환경 함정(32bit·OCX 등록 등)은 → 키움 OpenAPI+ 설치·오류 해결 가이드에서 다룹니다. REST는 이 종류의 설치 함정 자체가 거의 없습니다.
비용 — 직접 vs 외주
| 경로 | 비용 | 비고 |
|---|---|---|
| 직접 개발 | 학습 1~3개월 + VPS 월 5천~3만원 | REST라 OpenAPI+보다 난도 낮음 |
| 외주 — 단일 전략 단순 봇 | 80~150만원 | 단일 종목·기본 주문 |
| 외주 — 다종목 + 리스크 관리 | 150~300만원 | 손절·포지션 한도·알림 |
| 외주 — 실시간 WebSocket + 무중단 | 300~500만원 | VPS·모니터링·자동복구 |
외주 전 요구사항을 정리하면 견적·기간이 정확해집니다 → 자동매매 명세서 작성 가이드. 키움 자동매매 서비스 페이지는 → 키움 자동매매 봇 제작.
OpenAPI+(OCX) 코드를 REST로 이관하는 작업은 TR 구조·실시간 WebSocket·요청 제한까지 한꺼번에 바뀌어서 함정이 많습니다. 이관만 통째로 맡기시는 분이 많아요.
이 부분만 대신 만들어 드립니다 — 무료 상담 →보태기 — 국내주식만이 아니다 (2026-07-30 추가)
위 내용은 국내주식을 기준으로 썼지만, 키움 REST API 공식 가이드의 API 목록에는 국내주식과 나란히 미국주식 카테고리가 있습니다. 미국주식 쪽에도 주문·계좌·차트·시세·실시간시세·조건검색·종목정보가 있고, 국내에는 없는 환전이 별도 항목으로 붙어 있습니다. 반대로 공매도·신용주문·대차거래·ELW 같은 국내 시장 특유의 기능은 미국주식 쪽에 없습니다(2026-07-30 확인).
주의할 점은 "해외"라는 단어가 세 갈래로 갈린다는 것입니다. ① 미국주식은 위와 같이 REST API, ② 해외선물·옵션은 OpenAPI-W라는 별도 모듈, ③ 미국 외 시장(일본·중국·홍콩 등)은 REST 카테고리 목록에 나타나지 않으므로 공식 명세서·고객센터 확인이 선행돼야 합니다. 이 구분과 확인 절차는 별도 글로 정리했습니다 → 키움증권으로 해외주식 자동매매가 되나 — REST API 지원 범위 확인법.
또한 9번(TR limit)에서 다룬 요청 제한은 미국 장시간에 실시간 시세를 받으면서 주문까지 낼 때 더 빡빡해집니다. 여러 거래소·증권사의 한도 체계를 한 표로 비교하고 공유 리미터로 설계하는 방법은 → API 호출 제한 설계 — 바이낸스·업비트·KIS·키움 한도.
자주 묻는 질문
Q. 키움 REST API로 미국주식도 되나요?
공식 가이드 카테고리에 미국주식이 있고 주문·실시간시세·조건검색·환전 등이 포함됩니다(2026-07-30 확인). 미국 외 시장은 목록에 없어 공식 명세서 확인이 필요하고, 해외선물·옵션은 OpenAPI-W라는 별도 모듈입니다.
Q. 키움 REST API와 OpenAPI+의 가장 큰 차이는?
OpenAPI+는 OCX/COM(Windows·32bit·PyQt5·이벤트 콜백), REST는 HTTP+WebSocket(OS 독립·64bit·토큰 인증·동기 응답). OCX의 32bit·Windows 종속이 사라집니다.
Q. Mac/Linux에서도 되나요?
네. REST는 표준 HTTP라 OS·비트 무관. Mac 개발 + Linux VPS 운영이 그대로 됩니다. 영웅문·OCX 설치 불필요.
Q. 토큰은 매번 발급하나요? (TR limit)
아니요. 만료 시간이 있으니 캐싱 후 만료 전 재발급. 매 요청 재발급하면 요청 제한에 걸립니다. 주문·조회도 초당 제한이 있어 직렬화·큐잉 필요.
Q. 기존 OpenAPI+ 봇을 꼭 옮겨야 하나요?
필수는 아닙니다. 잘 도는 봇은 유지, 신규는 REST 권장. Mac·64bit·서버배포·다봇이 필요하면 전환 이점이 큼.
Q. 키움 해외주식 API도 REST로 되나요?
키움 REST API는 국내 주식·선물옵션 중심입니다. 미국·일본 등 해외주식을 폭넓게 자동매매하려면 한국투자증권 KIS API의 커버리지가 앞섭니다. 실무에서는 국내는 키움 REST + 해외는 KIS로 병행하는 구성이 가장 흔하고, 두 API 모두 앱키·시크릿 기반이라 인증 구조가 비슷해 한 프로그램에서 함께 다루기도 쉽습니다. 증권사별 강약점은 증권사 자동매매 API 비교에서 표로 정리했습니다.
Q. 제작 비용은?
직접은 학습 1~3개월 + VPS 월 5천~3만원. 외주는 단순 봇 80~150만원, 다종목+리스크 150~300만원, 실시간+무중단 300~500만원 선.
다음 단계
- 자동매매가 처음이면 → 주식 자동매매 완전 입문 가이드
- Python 기초가 필요하면 → 파이썬 자동매매 입문 가이드
- 키움 vs 한투 고민이면 → 키움 vs KIS 비교 + 증권사 API 전체 비교
- 24시간 운영이 필요하면 → VPS 24시간 봇 운영 가이드
- 외주를 고려하면 → 명세서 작성 가이드 후 알고랩 무료 상담
키움 REST API 봇, 마이그레이션까지 맞춤 제작
매매 규칙은 있는데 토큰 캐싱·api-id 매핑·WebSocket 재연결·요청 제한·무중단 운영까지 직접 하기 부담스럽다면, 알고랩이 명세서 기반으로 1~3주 안에 키움 REST 봇을 제작·전환해드립니다.
24시간 빠른 답변 가능합니다.