RebalanceGo
리밸런싱 포트폴리오

그 숫자는 몇 분 전의 가격입니다

계산기 시세가 증권사 앱과 조금 다른 이유를 묻는 분들께, 그 숫자는 몇 분 전의 가격입니다라는 답과 함께 시세 하나가 화면까지 오는 길을 만든 사람의 눈으로 정리했습니다.

발행 2026-08-03수정 2026-08-037분 분량

버그인 줄 알고 코드부터 뒤졌습니다

계산기에 시세 연동을 처음 붙인 날을 기억합니다. 검색으로 종목을 추가하면 현재가가 자동으로 채워지는, 지금 보면 당연한 기능이 처음 돌아간 날이었죠. 들뜬 마음으로 증권사 앱을 열어 같은 종목을 나란히 띄웠는데, 두 화면의 가격이 달랐습니다. 큰 차이는 아니었습니다. 몇십 원, 비율로 치면 0.1%도 안 되는 차이. 그런데 만든 사람 눈에는 그 몇십 원이 그렇게 거슬릴 수가 없습니다.

한 시간쯤 코드를 뒤졌습니다. 응답을 잘못 파싱했나, 필드를 잘못 읽었나, 반올림 문제인가. 전부 아니었습니다. 답은 코드 바깥에 있었어요. 두 화면의 숫자는 서로 다른 시각의 가격이었던 겁니다. 증권사 앱은 지금 이 순간의 체결가를, 제 계산기는 몇십 초 전의 가격을 보여주고 있었습니다. 버그가 아니라 시차였죠.

그날 이후 시세 응답에 가격만 담지 않고 '이 값이 언제 것인지'를 함께 저장하도록 구조를 바꿨습니다. 데이터에 asOf라는 필드 하나가 늘었을 뿐인데, 숫자를 대하는 마음이 달라졌습니다. '지금 값'이 아니라 '몇 시 몇 분의 값'이라고 생각하면, 두 화면이 조금 달라도 놀랄 일이 아니게 되니까요.

시세 하나가 화면에 도착하기까지는 생각보다 긴 길을 지납니다. 거래소에서 체결이 일어나고, 그 값이 데이터 제공자에게 전달되고, 제 서버가 그것을 받아 오고, 중간의 캐시를 거쳐 브라우저에 그려집니다. 단계마다 시간이 조금씩 붙습니다. 애초에 무료로 제공되는 시세 자체가 실시간이 아니라 몇 분 지연된 값인 경우도 많고요. 실시간 호가는 거래소가 돈을 받고 파는 상품에 가까워서, 정식 계약을 맺은 증권사 앱 정도가 진짜 '지금'을 보여줄 수 있습니다.

거래소에서 화면까지, 시세가 지나오는 경로와 캐시

처음 계획은 지금과 달랐습니다

여기에 제가 일부러 얹은 지연도 있습니다. RebalanceGo 서버는 같은 종목의 시세 요청이 오면 30초 동안은 기억해 둔 값을 돌려줍니다. 환율은 더 길어서 5분입니다. 신선도를 일부러 낮춘 셈인데, 여기엔 사연이 있습니다.

설계 단계의 구상은 지금과 달랐습니다. 미국 시세와 환율은 해외의 큰 금융 데이터 서비스에서, 한국 시세는 국내 포털에서 받아 오는 이원 구성이었죠. 그런데 개발을 시작하고 얼마 지나지 않아 해외 쪽에서 429라는 HTTP 응답이 돌아오기 시작했습니다. Too Many Requests, 요청이 너무 많으니 그만 보내라는 신호입니다. 처음엔 제 잘못인 줄 알았습니다. 요청 간격을 늘려 보고, 헤더를 바꿔 보고, 사람이 없는 새벽 시간에 다시 시도해 보기도 했습니다. 며칠을 매달렸는데 차단은 풀리지 않았습니다. 개인 프로젝트가 기대도 되는 수준의 문호가 아니었던 거죠. 결국 그쪽을 폐기하고 국내 소스 하나로 전부 통합했습니다. 그날 배운 것을 한 줄로 적어두면 이렇습니다. 공짜 데이터는 언제든 끊길 수 있는 데이터다.

30초 캐시는 그 경험의 산물입니다. 여러 사람이 같은 종목을 조회할 때마다 원본에 매번 요청을 보내면 언젠가 같은 차단을 또 당합니다. 30초 안에 온 같은 요청에는 서버가 기억해 둔 값을 돌려주는 것만으로 원본으로 가는 트래픽이 크게 줄어들죠. 여담이지만 제 서버에도 남용 방지용 요청 제한이 있어서, 한도를 넘으면 429를 돌려줍니다. 차단당하며 배운 쪽이 차단하는 코드를 짜고 있는 셈이라, 만들면서 조금 웃었습니다.

30초와 5분이라는 숫자에 대단한 근거가 있는 것은 아닙니다. 시세는 장중에 계속 움직이니 짧게, 환율은 그보다 느리게 움직이니 길게 잡은 상식적인 배분에 가깝습니다. 정밀한 실험으로 얻은 값이라기보다, 나중에 문제가 생기면 고치면 되는 값으로 두었죠. 도구를 만들다 보면 이런 결정이 의외로 많습니다. 완벽한 답을 찾느라 멈추는 것보다, 근거를 적어두고 넘어가는 편이 결과적으로 나았습니다.

그러면 30초 늦은 시세로 계산해도 되는가. 저는 이 도구의 용도에서는 된다고 판단했습니다. 리밸런싱 계산은 초를 다투는 매매가 아니라 비중을 보는 일입니다. 5만 원짜리 주식의 시세가 100원 다르면 0.2%인데, 이 오차로 '몇 주를 사고팔지'라는 결론이 바뀌는 경우는 목표 비중의 경계선에 딱 걸쳐 있을 때 정도입니다. 초 단위 정확도를 좇는 대신 데이터가 끊기지 않는 쪽을 고른 트레이드오프이고, 지금도 이 선택이 맞았다고 생각합니다.

그래서 숫자를 이렇게 읽으시면 됩니다

계산기의 결과는 주문서가 아니라 계획서로 읽는 것이 정확합니다. 몇 주를 사고팔지는 계산기에서 정하되, 실제 주문 가격은 증권사 앱의 호가창에서 확인하는 흐름이죠. 몇 가지 더 알아두시면 숫자가 달라 보이는 날 당황하지 않습니다.

  • 장이 닫혀 있으면 마지막 체결가가 보입니다. 한국의 낮 시간에 미국 종목을 열면 전일 종가가 뜨는 이유입니다.
  • 계산기의 환율은 포털 고시 환율이라, 실제 환전에 적용되는 환율과는 다릅니다. 애초에 '환율'이라는 단일한 숫자는 세상에 없고, 고시하는 곳마다 시각마다 조금씩 다릅니다. 해외 종목이 섞인 포트폴리오라면 시세보다 환율 쪽 차이가 평가액에 더 크게 작용하기도 합니다. 1,400원대 환율에서 5원 차이면 벌써 0.3%가 넘으니까요.
  • 가격이 빠르게 움직이는 순간에는 캐시 때문에 차이가 평소보다 커질 수 있습니다. 그런 날일수록 주문 전에 호가창을 한 번 더 보시는 편이 좋습니다.

요즘도 배포 전 점검 때마다 계산기와 증권사 앱을 나란히 놓고 봅니다. 달라진 게 있다면, 숫자가 몇십 원 다를 때 코드를 의심하는 대신 시계를 본다는 것 정도죠. 이 글은 시세와 환율 데이터의 성격을 설명하는 정보이며, 특정 종목의 매매나 특정 서비스의 이용을 권하는 것이 아닙니다. 계산기와 증권사 앱의 숫자가 미묘하게 다르던 날, 그 차이가 어디서 오는지 궁금했던 분께 답이 되었기를 바랍니다.

이 글은 투자 입문자가 이해하기 쉽도록 정리했으며, 내용은 운영 과정에서 순차적으로 보완될 수 있습니다. 특정 종목의 매매를 권유하지 않습니다.