지난 글에서 토큰 문제를 넘었습니다. 이제 시세도 받아지고 주문도 나갑니다.
그런데 실제로 하루 종일 돌려보니 문서에는 안 나오는 것들이 계속 튀어나왔습니다. 이번 글은 그 기록입니다. 여기서도 제가 한 일은 증상을 말로 설명한 것이 전부입니다.
"멈췄는데 이유가 뭐야"
어느 날 자동매매 화면이 얼어붙었습니다. 마우스도 안 먹고 아무것도 안 됩니다. 그런데 조금 기다리면 다시 살아납니다. 그리고 평소에도 가끔 눈에 띄게 느려졌습니다.
제가 한 말은 이게 전부입니다. 그런데 클로드가 로그를 뒤져보더니 두 증상이 같은 뿌리라고 했습니다.

멈춘 게 아니라 줄을 서 있었습니다
KIS는 초당 부를 수 있는 횟수가 정해져 있습니다. 넘으면 거부되는 게 아니라, 제 프로그램이 알아서 기다립니다. 그래서 오류는 안 나는데 화면만 멈춥니다.
그리고 여기서 제가 몰랐던 게 있습니다. 모든 요청의 한도가 같지 않습니다.
| 종류 | 설정값 | 이유 |
|---|---|---|
| 시세 조회 등 일반 | 초당 10건 | 실전 한도의 절반만 씁니다. 실시간 시세와 다른 부분이 쓸 여유를 남깁니다. |
| 잔고·주문 | 초당 1건 | 초당 2건으로 올렸더니 「초당 거래건수 초과」 거부가 났습니다. |
「초당 거래건수 초과」가 났을 때 저는 이렇게 되물었습니다.
맞았습니다. 고칠 곳이 한 줄인지 확인하고 넘어가는 습관이 여기서 도움이 됐습니다. AI가 제안한 수정이 여러 개일 때, "이 중에 진짜 핵심이 뭐야"를 한 번 물어보면 불필요한 변경을 줄일 수 있습니다.
화면이 1분 넘게 얼어붙은 이유
「초당 1건」은 평소엔 문제가 안 됩니다. 그런데 여러 종목을 한꺼번에 매도할 때가 문제였습니다.
수십 건의 주문이 1초에 하나씩 차례로 나갑니다. 그러면 그동안 화면은 아무 반응이 없습니다. 프로그램이 죽은 게 아니라 순서를 기다리는 중이었던 겁니다.
여기에 더해, 매수 신호가 여러 종목에서 동시에 뜨면 그 수만큼 잔고를 확인하려 듭니다. 이것도 초당 1건씩 줄을 섭니다. 그래서 잔고 결과는 3초 동안 재사용하도록 바꿨습니다. 신호가 몰려도 조회는 한 번만 나갑니다.
"가끔 느려진다"의 답은 다른 데 있었습니다
느려짐 쪽은 원인이 하나 더 있었습니다. API 문제가 아니라 파이썬 쪽 이야기인데, 효과가 커서 적어둡니다.
인터넷으로 요청을 보낼 때 매번 보안 연결을 처음부터 새로 만들고 있었습니다. 인증서 목록을 매번 다시 읽어들이는데, 이게 한 번에 0.4초 가까이 걸립니다. 요청이 수백 번이면 그만큼 쌓입니다.
연결을 한 번 만들어두고 재사용하도록 바꾸니 같은 작업이 2밀리초 수준으로 줄었습니다. 200배 차이입니다.
실시간 시세 — 조용히 멈추는 쪽
조회로는 초당 열 번밖에 못 부르니, 종목 수십 개의 가격을 실시간으로 보려면 웹소켓을 써야 합니다. 여기서 겪은 게 넷입니다.
이쪽은 고장 나도 오류가 안 뜹니다. 화면은 멀쩡한데 숫자만 안 움직입니다. 그래서 알아채기가 더 어렵습니다.
- 동시에 볼 수 있는 종목이 41개까지입니다. 더 보려면 새로 등록하기 전에 안 보는 종목을 먼저 빼야 합니다. 순서를 반대로 하면 한도에 걸려 새 등록이 통째로 거부됩니다.
- 등록 요청을 몰아 보내면 연결이 끊깁니다. 수십 개를 한꺼번에 보냈다가 접속이 끊긴 적이 있어서, 지금은 0.05초씩 간격을 두고 보냅니다.
- 「이미 보고 있음」 응답이 실패처럼 생겼습니다. 이미 등록된 종목을 또 등록하면 OPSP0002라는 코드가 오는데, 형식상 실패 표시가 붙어 있습니다. 그런데 실제로는 시세가 정상적으로 들어옵니다. 이걸 실패로 읽고 등록을 취소했다가 3분 뒤 다시 등록하고, 또 실패로 읽는 무한 반복에 빠진 적이 있습니다.
- 연결이 끊겼다 붙으면 전부 초기화됩니다. 증권사 쪽 기록이 지워지므로 보고 있던 종목을 전부 다시 등록해야 합니다. 이걸 빠뜨리면 화면은 멀쩡한데 가격만 안 움직입니다.
세 번째가 특히 고약했습니다. 정상 동작인데 실패로 보이는 것이라, 로그만 보면 계속 오류가 나는 것처럼 보입니다. 실제로 시세는 잘 들어오고 있는데 말입니다.
주문 — 실제 돈이 나가는 곳
가장 조심스러운 부분입니다. 여기서 겪은 것들을 정리합니다.
주문 코드가 네 가지입니다
KIS는 요청 종류를 TR ID라는 코드로 구분합니다. 주문은 실전·모의와 매수·매도 조합에 따라 네 개가 다릅니다.
| 매수 | 매도 | |
|---|---|---|
| 실전 | TTTC0802U | TTTC0801U |
| 모의 | TTTC0012U | TTTC0011U |
모의로 연습하다가 실전으로 옮길 때 이 코드를 안 바꾸면 주문이 안 나갑니다. 그래서 실전·모의 여부와 방향만 넣으면 알아서 골라주게 해뒀습니다. 사람이 매번 고르게 두면 언젠가 틀립니다.
거부당했는데 이유를 안 알려줍니다
주문이 계속 거부됐습니다. 그런데 돌아오는 메시지에 이유가 없었습니다. 형식이 틀렸다는 정도만 있고, 어디가 틀렸는지는 안 나옵니다.
원인은 안 쓰는 항목을 빈칸으로 채워 보내고 있었던 것이었습니다. KIS는 그 항목을 아예 빼야 통과합니다. 빈칸과 없음이 다르게 취급됩니다.
이런 종류는 제가 증상만으로는 절대 못 찾습니다. 대신 "거부되는데 이유를 안 알려준다"까지만 말해도 충분했습니다. 어차피 뒤지는 건 제 몫이 아닙니다.
새 기능을 붙이자 멀쩡하던 게 깨졌습니다
한동안은 시장가로만 주문을 넣었고, 당분간 아무 문제가 없었습니다. 그러다 지정가 주문을 쓰기 시작했더니 전부 거부됐습니다.
알고 보니 처음 만들 때 "가격은 항상 시장가"라는 전제로 짜여 있었습니다. 시장가만 쓸 때는 틀린 데가 없는 코드였습니다. 제가 요구사항을 늘리는 순간 그 전제가 깨진 겁니다.
"지금까지 잘 됐으니 괜찮겠지"가 안 통하는 경우입니다.
응답이 안 오는 것과 실패는 다릅니다
가장 무서운 부분입니다.
주문을 보냈는데 응답을 못 받는 경우가 있습니다. 여기서 "실패했나 보다" 하고 다시 보내면 같은 주문이 두 번 들어갈 수 있습니다. 실제 돈이니 그냥 넘길 문제가 아닙니다.
- 연결 자체가 안 된 경우 — 주문이 나가지 않은 게 확실합니다. 실패로 처리해도 됩니다.
- 보내긴 했는데 응답이 없는 경우 — 나갔는지 아닌지 모릅니다. 「알 수 없음」으로 표시해두고 자동으로 재시도하지 않습니다. 잔고를 확인해서 판단합니다.
「살 수 있는 금액」을 직접 계산하지 마세요
가장 억울했던 것입니다.
어느 날 방금 판 돈으로 다른 종목을 못 사는 일이 벌어졌습니다. 계좌를 열어보면 돈이 분명히 있는데, 매수는 아주 조금밖에 안 들어갔습니다.
원인은 매수 수량을 직접 계산하고 있었던 것이었습니다. 주문가능현금을 가격으로 나눠서 수량을 정하는데, 이게 문제였습니다.
주식은 판 돈이 이틀 뒤에 들어옵니다. 조회로 받는 주문가능현금은 오늘 시점 금액이라, 오늘 팔아서 아직 안 들어온 돈이 빠져 있습니다. 실제로 확인해보니 이랬습니다.
| 항목 | 금액 |
|---|---|
| 주문가능현금 (오늘 기준) | 85,324원 |
| 오늘 판 대금 (아직 안 들어옴) | 197,109원 |
| 실제로 살 수 있던 금액 | 282,433원 |
직접 계산했다면 8만 원어치만 샀을 겁니다. 답은 계산하지 않는 것이었습니다. KIS에 매수가능수량을 물어보는 조회가 따로 있습니다. 가격을 같이 넘기면 증권사가 아직 안 들어온 돈까지 반영해서 정확한 수량을 알려줍니다.
번외 — 종목은 이름이 아니라 코드로
KIS와 직접 관련은 없지만 같이 겪은 거라 적어둡니다.
종목 목록을 이름으로 맞춰보다가 몇 종목이 계속 빠지는 일이 있었습니다. 원인은 같은 종목인데 이름이 조금씩 다르게 적혀 있었기 때문입니다. 특히 ETF에서 잦습니다. 앞부분은 같은데 끝이 다른 식입니다.
종목코드는 여섯 자리 숫자로 변하지 않습니다. 무엇을 맞춰보든 코드를 기준으로 해야 합니다. 그리고 코드는 반드시 글자로 다뤄야 합니다 — 숫자로 읽으면 삼성전자의 005930이 5930이 돼버립니다. 앞의 0이 사라져서 아무 데도 안 맞습니다.
정리
| 증상 | 원인과 해결 |
|---|---|
| 화면이 한참 얼어붙는다 | 멈춘 게 아니라 초당 한도에 줄 서 있는 것 |
| 「초당 거래건수 초과」 | 잔고·주문은 초당 1건까지. 결과를 몇 초 재사용 |
| 전체적으로 느리다 | 연결을 매번 새로 만들고 있는지 확인 |
| 가격만 안 움직인다 | 재접속 후 다시 등록했는지. 41개 한도를 넘었는지 |
| 로그에 계속 오류가 찍힌다 | OPSP0002는 정상. 실패로 처리하면 무한 반복 |
| 주문이 거부된다 | TR ID가 실전·모의에 맞는지, 안 쓰는 항목을 뺐는지 |
| 잔고가 있는데 못 산다 | 직접 나누지 말고 매수가능수량 조회를 쓰기 |
두 편을 쓰면서 정리해보니, 제가 한 일 중에 코딩이라 부를 만한 건 없었습니다.
한 건 이것뿐입니다. 이상한 걸 그냥 넘기지 않고 말한 것. "멈췄어", "느려", "이 숫자가 이상해" 정도면 충분했습니다. 나머지는 원인을 찾아주고 고쳐줬습니다.
오히려 참고 쓰는 게 제일 손해였습니다. "원래 좀 느린가 보다" 하고 몇 주를 그냥 썼는데, 말하고 나니 200배 빨라졌습니다.
· 1편 — 한국투자증권 KIS API를 고른 이유와 토큰 문제
· 클로드 코드가 멋대로 코드를 고칠 때 — CLAUDE.md 설정법
· 클로드 코드 승인창이 계속 뜰 때 — settings.json 권한 설정법
'AI 코딩 > 클로드 코드' 카테고리의 다른 글
| 한국투자증권 KIS API를 고른 이유 — HTS를 켜지 않아도 되는 자동매매 (0) | 2026.08.20 |
|---|---|
| 코딩 몰라도 됩니다 — 클로드 코드 설치와 첫 실행 (터미널 없이) (0) | 2026.08.19 |
| 클로드 코드 승인창이 계속 뜰 때 — settings.json 권한 설정법 (0) | 2026.08.18 |
| 클로드 코드가 멋대로 코드를 고칠 때 — CLAUDE.md 설정법 (1) | 2026.08.18 |