KRX API 종가가 내 증권사 화면과 달랐다

국내 주식 시세를 코드로 받아 보려고 하면 창구가 여럿이다. 한국거래소가 공식 OpenAPI를 열어 두었고(이하 KRX API), 증권사도 REST API로 같은 값을 준다.

나는 거래소 쪽을 골랐다. 무료에 공식이고 문서가 있으니 그럴듯했고, 하루치 전종목이 한 번의 호출에 3.7초면 왔다. 그 설계를 이 블로그에 그대로 적기까지 했다.

닷새 뒤 두 창구의 일봉을 나란히 놓고 2,762종목을 맞춰 봤다. KRX API 종가가 증권사 쪽 값과 2,330종목에서 달랐다.

먼저 결론

  • 거래소 API와 증권사 API는 같은 날 같은 종목에 다른 종가를 준다. 거래량은 그대로고 시가·고가·저가도 대개 같으니 한쪽만 보면 알 수가 없다.
  • 어느 쪽이 맞는지는 데이터가 못 고른다. 내가 매일 보는 증권사 화면과 맞춰 보고 나서야 갈렸다.
  • 종가가 갈리면 등락률의 부호가 뒤집히고, 그날 오른 종목을 추리는 목록이 통째로 달라진다.

두 창구가 주는 종가가 달랐다

[KRX OpenAPI]는 날짜로 묻는 창구다. 기준일 하나를 넘기면 그날 전종목이 통째로 온다. [키움 REST API]는 종목으로 묻는다. 종목코드 하나에 600봉이 한꺼번에 오니 방식이 정반대다.

둘 다 “일봉”이라는 같은 이름을 쓰고, 실제로 받아 보면 시가도 고가도 저가도 거래량도 같은 값이 온다. 어긋나는 것은 종가 하나뿐이고 고가와 저가가 일부 따라 갈린다.

그래서 교차 검증을 안 하면 영원히 모른다. 무료에 공식이라는 이유로 한쪽만 붙여 두고 넘어가면 더욱 그렇고, 실제로 내가 그랬다.

금요일 밤에 금요일 종가를 못 주는 창구는 쓸 수 없다

원천을 고르기 전에 먼저 잴 것은 속도가 아니라 리듬이었다. 나는 평일 저녁에 다음 날 계획을 세우는데, 주말에는 금요일 종가를 보고 월요일 주문을 정한다. 금요일 밤부터 일요일 밤 사이에 화면을 열어야 한다는 뜻이다.

거래소 API는 그 리듬을 못 받쳐 준다. 두 번 실측해 보니 조회한 날의 직전 영업일까지만 줬다. 금요일 종가를 일요일에 물었는데도 없었으니, 주말에 화면을 열 수 없다는 말이 된다.

필요한 데이터가 언제까지 도착해야 하는지를 먼저 적어 두니 창구를 보는 눈이 달라졌다. 응답 속도는 그다음이었다.

지수는 다 맞았고, 전종목에서 갈렸다

증권사 API에도 지수 일봉이 있어서, 업종 일봉으로 코스피 지수를 받아 봤다. 64일치 시·고·저·종가가 거래소 값과 전부 같았다. 호출도 70번에서 한 번으로 줄었으니 갈아탈 이유는 충분해 보였고, 나는 여기서 안심했다.

그런데 지수가 맞는다고 종목이 맞는 건 아니었다. 표본 열 종목을 골라 확인했을 때도 어떤 날은 전부 일치했다. 며칠 뒤 날짜로는 거의 다 어긋났다.

결국 그날 상장된 2,762종목을 전수로 맞춰 봤다. 종가가 갈린 종목이 2,330개로 나왔다. 84%다. 표본과 날짜를 잘못 고르면 통과해 버리는 검사였던 셈이다.

KRX API 종가는 거래소 안에서 체결된 값이었다

두 창구의 값이 다르다는 것까지는 코드가 찾아 줬다. 문제는 그다음이었다. 어느 쪽이 맞는지는 두 데이터를 아무리 노려봐도 알 수 없다.

가른 것은 내가 매일 들여다보는 증권사 화면이었다. 삼성전자의 2026년 9월 17일 종가가 거래소 API에서는 252,500원, 증권사 API에서는 256,000원이었는데, 내 HTS에 찍힌 값은 256,000원이었다.

거래소가 주던 것은 틀린 값이 아니라 거래소 안에서 체결된 종가였다. 정확하지만 내가 화면에서 보는 값이 아니었다. 장 마감 뒤에 이어진 체결이 종가에만 반영되는 것으로 보이는데, 확실한 것은 내가 보는 값과 다르다는 사실 하나다.

두 값이 다르다는 것은 기계가 찾아 줬지만, 어느 쪽이 맞는지는 기계가 못 골랐다. 그 자리에서는 매일 그 화면을 보는 사람이 제일 정확한 검사기였다.

종가가 갈리면 등락률의 부호가 뒤집힌다

두 창구의 종가가 3,500원 다른 게 대수인가 싶었는데, 등락률을 계산해 보고 생각이 바뀌었다.

등락률은 전날 종가와 오늘 종가로 구한다. 두 창구의 종가가 갈리면 오른 종목이 내린 종목이 되고, 내린 종목이 오른 종목이 된다. 거래대금 상위 120종목 가운데 17개가 어느 창구로 보느냐에 따라 부호가 반대로 찍힌다.

내가 지으려는 도구는 저녁마다 그날 오른 종목만 추려 후보 목록을 낸다. 아직 짓는 중이라 추리는 규칙만 코드로 옮겨 두 원천에 각각 돌려 봤다. 거래소 쪽은 64종목, 증권사 쪽은 81종목이 남았다. 목록의 5분의 1이 사라졌고, 사라진 쪽에 삼성전자와 SK하이닉스가 들어 있다.

KRX API 종가와 증권사 API 종가가 갈리는 자리 — 시가·고가·저가·거래량은 같고 종가만 다르다

닷새 전에 쓴 글이 틀렸다

이 블로그에 먼저 쓴 [키움 REST API에는 예약 주문이 없다]에는 “오늘은 거래소에, 과거는 증권사에 묻는다”는 절이 있다. 그 설계가 닷새 만에 뒤집혔다.

원인부터 잘못 짚었다. 수정주가 때문인가 해서 구분값을 바꿔 가며 받아 봤는데 양쪽 다 똑같이 어긋났다. 대체거래소 체결이 섞인 건가 싶었지만 그 거래소에서 거래되지 않는 종목도 어긋났다. 거래소에 통합 시세를 주는 경로가 따로 있는지 이름을 바꿔 가며 주소를 두드려도 봤는데, 돌아온 것은 없는 주소라는 답뿐이었다.

고른 근거도 무너졌다. 나는 하루치 전종목이 한 번에 3.7초면 온다는 이유로 거래소를 골랐다. 증권사 쪽은 종목마다 한 번씩 물어야 해서 2,762종목에 10분이 걸린다. 값이 틀리면 속도는 근거가 못 된다는 걸, 열 배 넘게 느린 쪽으로 갈아타면서 배웠으니까.

더 아픈 건 그 원천 위에 얹어 둔 규칙들이었다. 거래소 시세는 액면분할이나 무상증자가 있으면 그날을 경계로 가격이 끊겨서, 나는 그걸 받을 때 고쳐 저장하는 규칙을 짜 두었다. 1년치에서 이음매 69만 건을 훑어 485건을 보정하고 남는 게 없는 것까지 확인한 규칙이었다. 증권사 API는 애초에 보정된 값을 주니 고칠 자리가 통째로 사라졌다.

그래서 그 자리는 규칙이 아니라 감시로 다시 적었다. 매일 최근 구간을 다시 받아 덮으면서, 같은 날짜의 값이 달라진 종목 수를 세어 화면에 띄우는 쪽으로.

결과와 한계

2026년 9월 현재 지수도 전종목도 증권사 API에서 받기로 정했다. 실제로 돌려 본 것은 거기까지다. 지수 일봉을 받아 오는 부분은 지어서 확인했고, 위의 전종목 대조는 그날 한 번 스크립트로 돌린 것이지 매일 도는 배치는 아직 짓는 중이다.

거래소 API는 지우지 않고 남겨 두기로 했다. 저녁 배치가 하루치를 두 번의 호출, 3초로 함께 받아 종가를 맞춰 보고 어긋난 종목 수를 화면에 적게 할 생각이다. 이번 사고가 *값이 조용히 달랐다*였으니, 3초로 감시를 사는 셈이다.

배치 시각도 20시 30분으로 미뤘다. 마감 뒤 체결이 저녁까지 이어지는 게 차이의 원인으로 보여서, 그게 끝난 뒤에 받으려는 것이다.

아직 모르는 것이 남아 있다. 증권사가 그날 저녁에 주는 값이 정말 최종인지는 확인하지 못했다. 위 대조는 주말에 한 것이라 이틀 지난 금요일치가 있다는 것만 확인한 셈인데, 정작 필요한 것은 그날 밤에 받은 값이 나중에 바뀌지 않는가다.

단서는 불안한 쪽이다. 며칠 지난 날짜는 양쪽이 표본 전부 일치했는데 최근 날짜는 거의 다 어긋났다. 최근 며칠이 아직 굳지 않은 값이라면 저녁에 받은 값도 나중에 바뀔 수 있으니까. 이건 장이 열리는 날에만 잴 수 있어서, 평일 저녁에 다시 받아 보고 확인할 참이다.

무엇을 어디까지 만들었는지는 [RichRich 프로젝트 페이지]에 정리해 두고 있다.

원천을 고를 때 먼저 물을 것은 무료인가 빠른가가 아니라, 신뢰도가 제일 중요하다.

이 글의 요약

KRX API 종가는 증권사 API가 주는 종가와 다르다. 2,762종목을 맞춰 보니 2,330종목이 갈렸고, 거래량은 한 건도 어긋나지 않았다.

거래소 API는 조회한 날의 직전 영업일까지만 주기 때문에, 주말에 금요일 종가를 보려면 증권사 쪽이 필요하다.

어느 값이 맞는지는 데이터끼리 비교해서는 알 수 없고, 내가 매일 보는 증권사 화면이 기준이 됐다.

종가가 갈리면 등락률의 부호가 뒤집혀서, 그날 오른 종목을 추리는 목록의 5분의 1이 달라졌다.

지금은 증권사 API를 원천으로 쓰고, 거래소 API는 매일 대조용으로 남겨 어긋난 종목 수를 화면에 띄운다.

자주 묻는 것

  • KRX API 종가가 증권사 HTS와 다른 이유는 뭔가?

거래소가 주는 것은 거래소 안에서 체결된 종가라서다. 장 마감 뒤에 이어진 체결이 종가에만 반영되는 것으로 보이는데, 시가·고가·저가와 거래량은 양쪽이 같고 종가에서만 갈린다.

  • 국내 주식 일봉은 거래소와 증권사 중 어디서 받아야 하나?

내가 화면에서 보는 값과 같은 쪽이다. 나는 두 창구를 전종목으로 맞춰 본 뒤 증권사 API로 옮겼다. 거래소 API는 무료에 공식이지만 종가가 내 HTS와 달랐고, 직전 영업일까지만 준다.

  • 두 창구의 값이 다른지 어떻게 확인하나?

표본 몇 종목이 아니라 그날 상장된 전종목을 맞춰 본다. 표본으로는 어떤 날 전부 일치해서 그냥 통과해 버린다. 어느 쪽이 맞는지는 데이터만으로 못 고르고, 증권사 앱이나 HTS에 찍힌 값과 맞춰 보는 수밖에 없었다.

이 기록을 쓰는 사람에 대해서는 [소개]에 적어두었다.

  • 이 글은 개인의 학습·개발 기록이며 투자 권유가 아닙니다.
  • 투자 판단과 그 결과는 투자자 본인에게 있습니다.