국내주식, 한국투자증권 KIS Open API

쓰던 자동매매 프로그램이 느릴 때, 엔진만 다시 짠 기록

의뢰인은 직접 만든 국내주식 단타 프로그램을 한투 모의투자로 돌리고 계셨습니다. 화면도 규칙도 마음에 드는데 매수가 자꾸 늦는다는 것이 고민이었습니다. 조건이 맞았다는 표시는 뜨는데 주문은 나가지 않거나, 나가더라도 가격이 이미 지나간 뒤였습니다. 저희는 코드를 읽어 늦는 이유를 먼저 찾았고, 화면과 매매 규칙은 손대지 않은 채 신호부터 주문까지의 경로를 새로 만들었습니다. 2026년 10월 말에 첫 판을 전달했고 지금은 의뢰인이 써 보며 알려 주시는 내용을 반영하고 있습니다.

플랫폼
한국투자증권 KIS Open API
순위는 토스증권 Open API
작업
기존 프로그램 진단
매매 엔진 재작성
운영 시간
08:00~20:00
KRX, NXT, SOR
진행
착수 3일째 첫 납품
납품 후 수정 진행 중
엔진을 다시 짠 국내주식 자동매매 프로그램의 메인 화면. 위쪽에 신규매수 중지, 재개, 프로그램 종료, 긴급정지 버튼이 있고 정규장 연속매매 상태와 실시간 연결 상태가 나오며, 아래 운용 현황에 사용 중인 셀과 보유 종목 수가 표시된다
메인 화면. 의뢰인이 쓰던 화면을 그대로 두고 뒤의 엔진만 바꿨다. 가짜 증권사 응답을 붙여 띄운 모의투자 화면이고 프로그램 이름은 일반명으로 바꿨다

01늦는 이유를 코드에서 찾다

받은 프로그램은 파이썬 1만 3천 줄, 모듈 90여 개였습니다. 의뢰인이 AI 도구의 도움을 받아 여러 버전에 걸쳐 고쳐 온 것이라 버전마다 검증 보고서가 붙어 있었고, 고쳤다가 되돌린 버전도 있었습니다. 엔진의 중심 함수 하나가 1,650줄이어서 한 군데를 고치면 다른 곳이 막히는 상태였습니다.

의뢰인이 남긴 보고서에 이런 줄이 있었습니다. "신호 통과 2.3초 뒤 소멸, 주문 미전송." 코드를 따라가 보니 원인은 네 군데였습니다.

원인결과
조회 간격증권사에 보내는 모든 요청 사이를 1.1초씩 띄웠고, 호출 한도 오류가 나면 8초까지 늘어났다. 한투가 모의투자에 권하는 간격은 0.5초다
주문 전 확인매수 직전에 호가 조회와 주문가능금액 조회를 하나씩 차례로 보냈다. 신호가 나와도 주문은 최소 2.2초 뒤에 나간다
계좌 대조 조건최근 10초 안에 계좌를 다시 맞춰 봤어야 주문할 수 있게 돼 있었다. 잔고와 체결 조회가 몇 초마다 돌면서 주문과 같은 줄에 섰다
관측 시간새 후보 종목은 체결을 일정 시간 지켜본 뒤 판단한다. 이것은 의뢰인이 정한 설정값이어서 그대로 두고 화면에서 줄일 수 있다고 안내했다

앞의 세 가지는 매매 규칙과 상관이 없습니다. 규칙이 내린 판단을 증권사에 전달하는 길이 막혀 있던 것입니다. 그래서 규칙은 두고 길만 새로 내기로 했습니다.

02남긴 것과 다시 쓴 것

구분대상
그대로 둠화면 전체, 수동매도와 긴급정지 버튼, 토스증권 거래대금 상위 100종목 순위, 한투 실시간 시세 수신, 설정 항목 34개와 저장 파일
옮기기만 함진입, 청산, 호가 조건, 재진입, 손실 뒤 쉬는 시간을 판단하는 매매 규칙 파일 12개
새로 만듦엔진 본체, 주문 경로, 장부, 계좌 대조, 시간대별 거래소 선택, 모의와 실전 전환, 수수료와 거래세를 뺀 매매별 손익 계산
버림1,650줄짜리 중심 함수와 그 주변의 간격 조절, 대기열, 각종 검증 기록 모듈

매매 규칙 파일은 원본과 한 글자도 다르지 않습니다. 파일마다 원본의 지문 값을 적어 두고, 시험을 돌릴 때마다 같은지 자동으로 확인합니다. 누군가 실수로 규칙을 건드리면 시험이 실패합니다.

화면을 그대로 쓸 수 있었던 이유는 화면과 엔진이 주소 22개로만 대화하고 있었기 때문입니다. 새 엔진이 같은 주소에서 같은 모양으로 답하면 화면은 바뀐 줄 모릅니다. 화면이 읽어 가는 값 110여 개를 뽑아 목록으로 만들고, 새 엔진의 응답이 그 목록을 다 채우는지 확인하는 시험부터 만들었습니다.

새 엔진은 주문을 판단할 때 증권사에 묻지 않습니다. 현금과 보유 수량은 프로그램이 들고 있는 장부에서 바로 읽고, 호가는 실시간으로 받고 있는 값을 씁니다. 증권사로 가는 요청은 모두 한 줄로 서고 주문과 취소가 늘 맨 앞에 섭니다. 조회는 그 뒤에 틈이 날 때 나갑니다.

주문을 보냈는데 응답이 없을 때는 다시 보내지 않습니다. 증권사가 받았는지 모르는 상태에서 한 번 더 보내면 두 번 살 수 있습니다. 주문 내역을 조회해 접수됐는지 확인될 때까지 그 종목의 새 주문을 막아 둡니다.

03실제 서버에 붙여 보고 고친 것

가짜 증권사를 붙인 시험은 첫날 통과했습니다. 문제는 한투 모의투자 서버에 붙인 10월 28일과 정규장 하루를 돌린 29일에 나왔습니다. 첫 납품까지 판을 아홉 번 새로 만들었습니다.

긴급정지를 누른 뒤의 화면. 긴급정지 버튼은 흐려지고 자동매매 재개 버튼이 생겼으며, 긴급정지 중이고 자동매매 신규주문 차단, 보유주식 강제청산 없음이라는 안내가 나온다
긴급정지 상태. 자동 매수와 자동 매도를 모두 멈추고 미체결 주문을 취소한다. 보유 주식은 팔지 않는다 (가짜 증권사 응답으로 띄운 화면)

10월 29일 모의 정규장에서 잰 값입니다. 신호가 나온 뒤 주문을 보낼 때까지 매수 30건의 중앙값이 0.63초, 매도 29건이 0.50초였습니다. 한투 모의투자 서버는 주문 앞뒤로 1초쯤 다른 요청이 없어야 주문을 받아 주는 일이 많아 그만큼 기다린 시간이 들어 있습니다. 실전 서버에는 이 기다림을 두지 않습니다.

04장중에 프로그램이 꺼진 일

납품 전에 저희 PC에서 실전 소액으로 밤새 켜 두고 지켜봤습니다. 10월 29일 오전 9시, 정규장이 열린 직후에 프로그램이 꺼졌습니다.

처음에는 코드 오류를 의심했습니다. 윈도우가 남긴 기록을 열어 보니 프로그램이 자기 실행 파일의 일부를 디스크에서 다시 읽으려다 실패한 것이었습니다. 프로그램 폴더가 구글 드라이브 안에 있었습니다. 구글 드라이브는 PC에 가상 드라이브로 붙는데, 구글 드라이브 앱이 새벽에 스스로 재시작하면서 드라이브가 잠깐 사라졌다가 돌아왔습니다. 그 전에 켜 둔 프로그램은 몇 시간 뒤 필요한 파일 조각을 읽으려는 순간 죽습니다.

증상이 원인보다 몇 시간 늦게, 아무 때나 나타나기 때문에 코드 문제로 오해하기 쉽습니다. 그 뒤로 시험은 C 드라이브의 일반 폴더에 복사해서 돌렸고, 의뢰인께 드린 사용안내서에 구글 드라이브나 원드라이브 같은 동기화 폴더에서 실행하지 말라는 안내를 넣었습니다.

05납품 뒤에 이어진 수정

의뢰인은 모의투자로 일주일을 쓰신 뒤 아홉 가지를 정리해 보내 주셨습니다. 로그와 대조해 하나씩 확인했고, 그중 일곱 가지를 반영한 수정판을 11월 9일에 만들었습니다.

현재 보유 표. 종목마다 보유 수량, 평균 매입가, 실시간 체결가, 매입금액이 나오고 오른쪽 끝에 수동매도 버튼이 있다
보유 종목 표와 수동매도 버튼. 긴급정지 중에도 수동매도는 쓸 수 있다 (종목과 숫자는 예시값)

나머지 두 가지 가운데 하나는 주문 통로를 조회와 완전히 나누는 구조 변경이라 따로 판단하기로 했습니다. 수정판에서 팔 때 쓰는 기준을 끈 경우의 매도는 가짜 증권사 시험으로만 확인했고, 장중 모의 확인은 아직 남아 있습니다.

06납품물과 기술

한국투자증권 KIS Open API (REST, WebSocket) 토스증권 Open API (순위) Python 3.13 로컬 웹 화면 SQLite

모의투자 서버는 넥스트레이드 주문을 받지 않습니다. 그래서 프리마켓과 애프터마켓 주문은 모의로 확인할 수 없었고, 실전 계좌에서 한 주를 접수했다가 바로 취소하는 방법으로 경로를 확인했습니다.

07관련 사례와 더 보기

한투 API가 돌려주는 오류와 대응은 KIS API 에러코드 정리에 따로 적어 두었습니다.

※ 본 사례는 고객 요구사항을 익명 처리하여 재구성한 것이며, 화면의 종목, 수량, 계좌는 예시값입니다. 수익률과 수익금은 공개하지 않습니다. 알고랩은 매매 자동화 프로그램 제작 서비스이며, 종목 추천, 투자 자문, 수익 보장 서비스가 아닙니다.

쓰고 계신 프로그램이 있다면

어떤 증상이 있는지와 소스코드가 있는지만 알려 주셔도 상담을 시작할 수 있습니다.
고쳐 쓸 수 있는지, 새로 만드는 편이 나은지부터 말씀드립니다.

무료 상담 시작하기 고객 후기 보기
← 제작 사례 전체 보기