AlgoLab Blog · 키움 REST API · 애프터마켓 · 2026

키움 시간외단일가 TR 삭제 — ka10087·62가 사라졌다

키움 · 제도변경 대응 2026-09-19 · 약 8분 읽기 · 알고랩 AlgoLab
한 줄 요약 2026년 9월 14일 KRX 시간외단일가 시장이 폐지되고 애프터마켓(16:00~20:00)이 열렸습니다. 키움증권 오픈API 공지에 따르면 API 쪽 변경은 그보다 이른 9월 12일(토) 21시에 적용됐고, 삭제된 것은 ka10087·ka10098 두 TR, 매매구분 trde_tp62(시간외단일가), 실시간 주문체결(00)의 FID 10010(시간외단일가_현재가)입니다. 반대로 NXT 프리마켓 한정 GTP 주문유형 40·46·47이 추가됐고, VI 발동/해제(1h)의 90684(VI 연장)가 붙었습니다.

16시가 지나서도 돌아가던 봇이라면 이번 주에 뭔가 조용히 달라졌을 가능성이 큽니다. KRX 시간외단일가 시장이 사라졌기 때문입니다. 그런데 이런 제도 변경은 "주문이 안 나간다"는 식으로 요란하게 터지지 않고, 응답 코드만 바뀌거나 필드가 조용히 비어 오는 형태로 나타납니다. 실시간 시세를 FID 번호로 파싱하는 코드라면 더더욱 그렇습니다 — 없어진 번호는 예외를 던지지 않고 None으로 들어옵니다.

아래는 키움증권 오픈API 공지 두 건(2026-09-09 제도 안내, 2026-09-10 오픈API 이용안내)의 원문 표와, 같은 날 공식 GitHub 저장소에서 내려받은 명세 파일을 2026년 9월 19일 기준으로 직접 대조한 결과입니다.

이 글에서 확인할 것

  1. 삭제·추가된 항목 전부 (공지 원문 표)
  2. 날짜가 두 개다 — API 09-12 21시 / 제도 09-14
  3. 공식 명세 파일은 아직 옛날 값이다 (직접 검산)
  4. 새 장 운영시간과 애프터마켓 규칙
  5. 봇이 고쳐야 하는 네 곳
  6. 내 코드 점검 — 문자열 여섯 개

1. 무엇이 삭제되고 무엇이 추가됐나

키움증권 오픈API 게시판의 「KRX 애프터마켓 신설 및 NXT 제도 변경에 따른 오픈API 서비스 이용안내」(2026-09-10)가 변경 항목을 표 하나로 정리해 두었습니다. 그대로 옮기면 이렇습니다.

구분내용
시간외단일가
관련 TR 삭제
시간외단일가등락율순위요청 (REST API : ka10098, OPEN API+ : opt10098) TR 삭제
시간외단일가요청 (REST API : ka10087, OPEN API+ : opt10087) TR 삭제
시간외단일가
주문유형 삭제
매수/매도 주문 시간외단일가주문유형(62) 삭제
시간외단일가
실시간 FID 삭제
실시간시세 > 주문체결(00) > 시간외단일가_현재가(10010) 삭제
주문유형 (GTP)
추가
NXT 프리마켓 한정 주문유형 제공
보통(GTP) : 40, 최유리(GTP) : 46, 최우선(GTP) : 47
VI 관련
실시간 FID 수정
실시간시세 > VI 발동/해제(1h) > VI발동구분(9068) VI 연장(4) 추가
1: 정적 VI, 2: 동적 VI, 3: 동적+정적 VI, 4: VI 연장

다섯 줄이지만 성격이 셋으로 갈립니다. ①②③은 삭제라 쓰던 코드가 깨지고, ④는 추가라 안 써도 되며, ⑤는 기존 값 집합의 확장이라 분기문에 else가 없으면 조용히 떨어집니다. 위험 순서로는 ⑤가 가장 사악합니다.

2. 날짜가 두 개다 — 09-12 21시와 09-14

오픈API 변경사항 적용일: 2026.09.12.(토) 21시
제도 변경사항 적용일: 2026.09.14.(월)

두 공지가 각각 명시한 날짜입니다. API 쪽이 주말에 먼저 바뀌고, 시장 제도는 그다음 영업일부터 적용됐습니다.

이 이틀의 틈이 실제로 문제가 됩니다. 토요일 21시 이후에 배포·재기동한 봇은 월요일 장이 열리기 전에 이미 ka10087이 없는 서버와 이야기하고 있었습니다. 주말에 모의 환경에서 점검을 돌리는 습관이 있다면 그때 이미 신호가 나왔을 텐데, 시세 조회 실패는 대개 재시도 로그로만 남고 알림까지 올라오지 않습니다.

반대로 주문 쪽 실패는 월요일 16시에 처음 드러납니다. trde_tp62를 넣어 두었다면 그 시각까지는 아무 일도 없다가 장 마감 뒤 첫 주문에서만 실패합니다. 하루에 한 번 열리는 창구라 알림을 놓치면 며칠씩 조용히 안 나갈 수 있는 구조입니다.

3. 공식 명세 파일은 아직 옛날 값을 담고 있다

키움은 REST API 명세를 공식 GitHub 저장소에도 올려 둡니다 (공식 예제·CLI 구조는 여기서 정리했습니다). 그런데 이번 변경은 공지에는 있고 저장소에는 아직 없습니다. 아래는 2026년 9월 19일main 브랜치의 명세 JSON을 받아 직접 확인한 것입니다.

# kiwoom/_data/kiwoom_api_spec.json (main, 2026-09-19 기준)
import json
spec = json.load(open("kiwoom_api_spec.json", encoding="utf-8"))
apis = spec["apis"]                     # 337개

for t in ("ka10087", "ka10098", "ka10009"):
    print(t, any(t in k for k in apis))

# ka10087 True   <- 삭제 공지된 TR이 그대로 있다
# ka10098 True   <- 삭제 공지된 TR이 그대로 있다
# ka10009 False  <- 2026-05 삭제 공지분은 이미 빠져 있다

같은 파일에서 주식 매수주문 kt10000trde_tp 설명 문자열을 꺼내면 이렇게 나옵니다.

0:보통 , 3:시장가 , 5:조건부지정가 , 81:장마감후시간외 , 61:장시작전시간외,
62:시간외단일가 , 6:최유리지정가 , 7:최우선지정가 , 10:보통(IOC) , 13:시장가(IOC) ,
16:최유리(IOC) , 20:보통(FOK) , 23:시장가(FOK) , 26:최유리(FOK) , 28:스톱지정가,
29:중간가,30:중간가(IOC),31:중간가(FOK)

62:시간외단일가가 남아 있고, 새로 추가된 40·46·47(GTP)은 없습니다. 실시간 주문체결(00)의 응답 필드 목록에도 10010 시간외단일가_현재가가 그대로 들어 있고, 저장소의 examples/ 폴더에는 ka10087·ka10098을 호출하는 파이썬 예제 파일이 아직 그대로 남아 있습니다.

중요한 건 이 저장소가 삭제를 반영하지 않는 정책인 것은 아니라는 점입니다. 2026년 5월에 삭제 공지가 났던 ka10009는 이미 빠져 있습니다. 즉 구조적으로 안 지우는 게 아니라 이번엔 반영이 늦은 것이고, 그 말은 제도 변경 직후 며칠 동안은 저장소·명세 파일보다 공지 게시판이 앞선다는 뜻입니다. 명세를 MCP나 코드 어시스턴트에 물려 쓰고 있다면 더 조심해야 합니다 — 도구는 옛날 값을 확신에 차서 알려 줍니다.

4. 새 장 운영시간 — 애프터마켓이 들어온 자리

KRX 2026-09-14 이후 정규장 ~15:30 장종료후 종가 15:40~16:00 애프터마켓 16:00~20:00 (접속매매) 2026-09-12 이전 정규장 ~15:30 장종료후 종가 15:40~16:00 시간외단일가 16:00~18:00 trde_tp 62 · ka10087 — 폐지 주문유형 변화 61 장시작전시간외 · 81 장마감후시간외 → 유지 62 시간외단일가 → 삭제 / NXT 프리마켓 40·46·47(GTP) → 추가
16:00~18:00 단일가 구간이 16:00~20:00 접속매매로 대체됐다 (키움 공지 표 기준)

키움이 함께 배포한 KRX·NXT 장 운영시간 표에서 봇 스케줄러가 알아야 할 것만 뽑으면 이렇습니다.

구간시간비고
KRX 주문접수 시작08:20가격제한폭 기준가 대비 ±30% · 코스피/코스닥 1주 단위
KRX 장전 시간외 종가08:30~08:40전일종가(기준가) 거래 · 주문유형 장전시간외
KRX 시가단일가08:30~09:00
KRX 접속매매09:00~15:20
KRX 종가단일가15:20~15:30
KRX 장종료후 시간외 종가15:40~16:00주문접수 15:30부터 · 당일종가 거래 · 주문유형 장후시간외
KRX 애프터마켓16:00~20:00신설 · 접속매매
NXT 프리마켓08:00~08:50GTP 주문유형은 이 구간 전용
NXT 메인마켓09:00:30~15:20
NXT 애프터마켓15:40~20:00시가단일가 15:30~15:40

애프터마켓 자체의 규칙은 공지가 이렇게 명시합니다 — 거래종목은 시장관리 종목을 제외한 유가증권시장·코스닥시장 종목이고 ETF·ETN은 거래 불가(향후 가능해지면 별도 공지), 가격제한폭은 당일 기준가 대비 ±30%, VI는 적용되지만 CB(서킷브레이커)와 사이드카는 미적용입니다. VI 대응 로직을 정규장에만 걸어 둔 봇이라면 16시 이후에도 VI가 오는 구간이 생겼다는 뜻입니다.

5. 봇이 고쳐야 하는 네 곳

① 주문 — trde_tp에서 62를 걷어낸다

62만 삭제이고 61(장시작전시간외)·81(장마감후시간외)은 공지의 삭제 목록에 없습니다. 시간외 종가 매매 구간이 시간표에 그대로 남아 있는 것과 앞뒤가 맞습니다. 즉 "시간외 주문이 전부 막혔다"가 아니라 단일가 매매만 사라진 것입니다.

// 예전 — 16시 이후 주문을 시간외단일가로 냈다면
POST https://api.kiwoom.com/api/dostk/ordr
api-id: kt10000
{
  "dmst_stex_tp": "KRX",
  "stk_cd": "005930",
  "ord_qty": "10",
  "ord_uv": "71000",
  "trde_tp": "62"          <- 삭제된 주문유형
}

// 지금 — 애프터마켓은 접속매매라 지정가/시장가 계열을 쓴다
{
  "dmst_stex_tp": "KRX",
  "stk_cd": "005930",
  "ord_qty": "10",
  "ord_uv": "71000",
  "trde_tp": "0"           // 0:보통(지정가)
}

어떤 값으로 바꿀지는 공식 가이드의 현재 표기로 확인하십시오. 공지가 밝힌 것은 "62 삭제"까지이고, 애프터마켓 구간에서 어떤 주문유형이 어떻게 허용되는지는 주문유형별 운영 시간대 규정에 따라 달라집니다. 이 글은 값을 단정하지 않습니다 — 주문유형별 성격 차이는 따로 정리해 뒀고, 실제 코드에 넣을 값은 kt10000 가이드 화면의 trde_tp 목록을 직접 보고 고르는 것이 맞습니다.

② 시세 — ka10087·ka10098을 부르는 코드

ka10087(시간외단일가요청, /api/dostk/mrkcond)은 ovt_sigpric_로 시작하는 46개 필드를 돌려주던 TR이었습니다 — ovt_sigpric_cur_prc(시간외단일가_현재가), ovt_sigpric_flu_rt(시간외단일가_등락률), 매도·매수 5호가와 수량이 ovt_sigpric_sel_bid_1~_5 식으로 붙습니다. ka10098(시간외단일가등락율순위요청, /api/dostk/rkinfo)은 순위조회 계열에 속해 있던 TR로, ovt_sigpric_flu_rt_rank 배열을 돌려줬습니다.

둘 다 대체 TR이 공지에 제시되지 않았습니다. 애프터마켓은 단일가가 아니라 접속매매이므로, 구조적으로는 일반 호가·현재가 TR이 그 시간대를 덮는 형태가 됩니다. 다만 어느 TR이 16시 이후 값을 실제로 채워 주는지는 운영 시간대별로 직접 확인해야 하는 영역이고, 공지가 명시하지 않았으므로 이 글은 단정하지 않습니다.

③ 실시간 — 주문체결(00)의 FID 10010

주문체결 실시간 항목에서 시간외단일가_현재가(10010)가 빠졌습니다. 주문체결·잔고 실시간을 파싱하는 코드가 FID 번호를 키로 딕셔너리에서 꺼내고 있다면, 이 번호는 이제 예외가 아니라 빈 값으로 나타납니다.

# 이런 형태가 가장 위험하다 — 없어진 FID가 0으로 흘러든다
ovt_price = float(values.get("10010", 0) or 0)
if ovt_price > 0:
    ...                     # 영영 실행되지 않는 분기가 된다

# 참고: 주식시간외호가(0E)는 공지의 삭제 목록에 없다.
#       131/132/135/136 (시간외 매도·매수 호가 총잔량) 계열.
#       다만 폐지된 구간의 값이 어떻게 채워지는지는 별도 확인이 필요하다.

④ VI — 90684가 추가됐다

이번 변경에서 가장 조용히 사고를 낼 수 있는 항목입니다. VI 발동/해제(1h)의 VI발동구분(9068)은 기존에 1(정적 VI)·2(동적 VI)·3(동적+정적 VI) 세 값이었는데 4(VI 연장)가 추가됐습니다.

# 세 값만 분기하던 코드
if gubun == "1":   handle_static_vi()
elif gubun == "2": handle_dynamic_vi()
elif gubun == "3": handle_both_vi()
# gubun == "4" 는 아무 데도 걸리지 않는다 → VI 연장을 놓친다

# 최소한 이렇게
else:
    logger.warning("알 수 없는 VI발동구분: %s", gubun)
    pause_trading(symbol)       # 모르면 멈추는 쪽이 안전하다

같은 1h 항목에는 1221(VI발동가격)·1223(매매체결처리시각)·1224(VI해제시각)· 1225(VI적용구분)·1490(VI발동횟수)가 함께 오므로, 분기를 값으로 하지 말고 "알려진 값이 아니면 보수적으로 멈춘다"는 기본형으로 바꿔 두는 편이 낫습니다.

6. NXT 쪽 변화 — GTP와 정적 VI

같은 날 NXT(넥스트레이드)도 바뀌었습니다. 봇에 직접 닿는 것은 둘입니다.

여기에 SOR 쪽도 제공시간이 20시까지로 확대됐습니다. KRX·NXT·SOR 중 어디로 주문을 보낼지dmst_stex_tp로 고르는 봇이라면, 저녁 시간대에 라우팅 대상이 하나 더 생긴 셈입니다.

⚠ 정규장 미체결 주문은 애프터마켓으로 자동 이전되지 않습니다. 공지가 따로 한 줄을 뺀 항목입니다 — 애프터마켓을 이용하려면 기존 주문을 취소한 뒤 신규 주문해야 합니다. 미체결 조회(ka10075)로 잔량을 확인하고 취소(kt10003) 후 재주문하는 흐름이 필요합니다. HTS·MTS에는 KRX 정규장 주문만 일괄 취소하는 버튼이 새로 생겼지만, 봇은 그 버튼을 누를 수 없으므로 코드로 같은 일을 해야 합니다.

7. 내 코드 점검 — 문자열 여섯 개

가장 빠른 점검은 코드 전체에서 문자열을 찾는 것입니다. ka10087·ka10098·opt10087·opt10098· 매매구분 값 62·FID 10010 여섯 개입니다.

$ grep -rn "ka10087\|ka10098\|opt10087\|opt10098" .
$ grep -rn "'trde_tp'\|\"trde_tp\"" . | grep "62"
$ grep -rn "10010" . | grep -v "\.min\."

# 그다음 VI 분기
$ grep -rn "9068" .

62는 다른 숫자와 섞이기 쉬우니 trde_tp가 같은 줄에 있는 것만 보는 게 좋습니다. 설정 파일(.env·config.yaml)이나 공식 예제를 복사해 만든 모듈에 들어가 있는 경우가 많아 소스만 보면 놓칩니다.

정리하면주문 쪽 62는 반드시 고쳐야 하고, 시세 ka10087·ka10098은 호출부를 걷어내야 하며, 실시간 10010·9068은 파싱 분기를 손봐야 합니다. 그리고 16시 이후 로직이 있다면 애프터마켓 규칙(±30%·ETF/ETN 불가·CB·사이드카 미적용·미체결 미이전)을 스케줄러에 반영해야 합니다.

이런 변경은 조용히 옵니다. 주문유형 표와 시장 시간을 코드 밖 설정으로 빼 두면 다음번에는 grep 여섯 줄 대신 설정 한 줄로 끝납니다.

자주 묻는 것

키움 REST API에서 정확히 무엇이 삭제됐나요?

TR 두 개(ka10087·ka10098, OPEN API+는 opt10087·opt10098), 주문 매매구분 trde_tp62(시간외단일가), 실시간 주문체결(00)의 FID 10010입니다. 오픈API 적용은 2026-09-12(토) 21시, 제도 적용은 2026-09-14(월)입니다.

시간외 주문유형 61·81도 사라졌나요?

공지의 삭제 목록에 없습니다. 61(장시작전시간외)과 81(장마감후시간외)은 단일가가 아니라 종가 거래이고, 장 운영시간표에도 08:30~08:40과 15:40~16:00 구간이 남아 있습니다. 다만 값과 시간은 다시 바뀔 수 있으므로 공식 가이드의 현재 표기로 대조하십시오.

공식 GitHub 명세 파일을 믿어도 되나요?

이번 건은 시차가 있었습니다. 2026-09-19 기준으로 main의 명세 JSON에 ka10087·ka10098·62·10010이 그대로 남아 있었고, 새 GTP 값 40·46·47은 없었습니다. 2026-05에 삭제된 ka10009는 이미 빠져 있으므로 정책이 아니라 반영 지연으로 보입니다. 제도 변경 직후에는 공지 게시판이 앞섭니다.

애프터마켓은 시간외단일가와 뭐가 다른가요?

단일가로 모아 체결하던 것이 정규장처럼 호가가 맞으면 바로 체결되는 접속매매로 바뀌었습니다. 16:00~20:00, ±30%, ETF·ETN 불가, VI 적용 / CB·사이드카 미적용, 정규장 미체결 주문 미이전이 공지가 밝힌 골자입니다.

이 변경으로 수익이 달라지나요?

이 글은 그 질문에 답하지 않습니다. 거래 가능한 시간과 체결 방식이 달라진 것이고, 그것이 특정 전략에 유리한지는 전략 구조와 유동성에 따라 다릅니다. 다만 고치지 않으면 주문이 실패하거나 분기를 놓친다는 것은 전략과 무관하게 공통입니다.

제도가 바뀌어도 안 멈추는 봇으로

주문유형·시장 시간·실시간 FID는 공지 한 장으로 바뀝니다.
바뀌는 값을 코드 밖으로 빼는 구조부터 같이 정리해 드립니다. 24시간 빠른 답변 가능합니다.

무료로 상담하기
본 글은 키움증권 오픈API 공지 「KRX 애프터마켓 신설 및 NXT 제도 변경 안내」(2026-09-09)와 「KRX 애프터마켓 신설 및 NXT 제도 변경에 따른 오픈API 서비스 이용안내」(2026-09-10)의 원문 표, 그리고 키움증권 공식 GitHub 저장소(Kiwoom-Securities/Kiwoom-REST-API) main 브랜치의 API 명세 파일과 examples/ 예제를 2026년 9월 19일 기준으로 직접 대조해 작성했습니다. 본문의 TR 코드·주문유형 값·FID 번호·시간표는 그 시점의 공지 표기이며, 실계좌 주문으로 검증한 것이 아닙니다. 애프터마켓 구간에서 어떤 주문유형이 허용되는지, 어떤 시세 TR이 그 시간대를 덮는지는 공지가 명시하지 않았으므로 이 글은 단정하지 않았습니다. 제도·TR·주문유형·운영시간은 추가 공지로 변경될 수 있으므로 반드시 키움 REST API 공식 가이드와 공지 게시판의 현재 내용으로 대조하십시오. 이 글은 특정 종목이나 매매 시점에 대한 권유를 담고 있지 않으며, 수익률이나 시장 방향에 대한 어떠한 전망도 하지 않습니다. 알고랩(퀀트웍스)은 투자자문업·투자일임업을 영위하지 않으며, 고객이 정한 규칙을 코드로 구현하는 도구 제작 서비스를 제공합니다. 투자 판단과 그 결과의 책임은 전적으로 투자자 본인에게 있습니다.