매크로 지표 자동 수집, 어디까지 맡기고 어디서 손을 뗄지 정했다
환율, 금리, 신용융자, 외국인 수급. 매일 손으로 긁어 모으던 걸 기계한테 넘겼다. 근데 다 넘기진 않았다. 어디서 손을 떼야 하는지가 이 작업의 진짜 내용이었다.
매크로 지표 자동 수집을 시작한 이유는 단순했다. 시장 상황을 보려고 매번 한국은행 사이트 들어가고, 공공데이터포털 눌러보고, 야후 파이낸스 열어서 눈으로 옮겨 적는 짓을 반복하고 있었거든. 지표 대여섯 개면 그럭저럭 버티는데, 보고 싶은 게 스무 개 넘어가면서부터는 그냥 안 보게 되더라. 볼 수 없어서 안 보는 게 아니라 귀찮아서 안 보는 상태. 그게 제일 나빴다.
그래서 클로드코드한테 이걸 시켰다. 결과적으로 매일·매주·매월 알아서 도는 수집 파이프라인이 생겼고, 5주 넘게 굴렸다. 그런데 만들고 나서 진짜 시간을 쓴 건 "더 많이 자동화하기"가 아니라 "여기서부턴 자동으로 두면 안 되겠다"고 선을 긋는 쪽이었다. 그 선 얘기를 하려고 한다.
📑 목차
- 1. 매크로 지표가 뭔지부터, 그리고 왜 자동화였나
- 2. 기계한테 넘긴 것: 수집, 계산, 그림, 발송
- 3. 시작하자마자 막힌 문 두 개
- 4. 제일 무서웠던 건 숫자가 조용히 늙는 거였다
- 5. 같은 '외국인 순매수'가 세 개로 나왔다
- 6. 자동으로 만들어진 지표를 통째로 버리라고 했다
- 7. 그래서 선을 어디에 그었나
1. 매크로 지표가 뭔지부터, 그리고 왜 자동화였나
매크로 지표는 개별 회사 실적 말고 경제 전체 상태를 보는 숫자들이다. 환율, 금리, 통화량, 국제수지 같은 것. 주식 하는 사람이면 "지금 시장이 어떤 국면인가"를 볼 때 쓰고, 그냥 뉴스만 봐도 매일 나오는 숫자들이기도 하다. 환율이 왜 움직이는지는 예전에 따로 정리해 둔 글이 있으니 배경이 궁금하면 그쪽을 보면 되고, 여기선 그 숫자를 어떻게 모으느냐만 다룬다.
이런 숫자들은 대부분 공짜다. 한국은행이 ECOS라는 이름으로 통계 API를 열어놨고, 기업 공시는 금융감독원 DART가, 미국 쪽은 세인트루이스 연준의 FRED와 증권거래위원회 EDGAR가 열어놨다. 여기서 API는 "사람이 눈으로 보라고 만든 웹페이지 말고, 프로그램이 숫자만 받아가라고 따로 뚫어둔 창구"라고 보면 된다. 창구가 있으니 웹페이지를 긁을 필요가 없다. 웹페이지를 긁는 방식이 필요한 경우는 크롤링 글에 따로 적어놨는데, 공식 창구가 있으면 그쪽이 백배 낫다. 안 깨지니까.
실제로 이 작업에서 새로 발급받은 유료 키는 0개였다. 이미 갖고 있던 무료 키들만 재사용했다. 돈이 안 든다는 게 시작하기 전엔 별거 아닌 것 같았는데, 나중에 "이 지표 하나 더 넣어볼까?"를 부담 없이 시도하게 만들더라. 비용이 붙어 있으면 그 시도를 안 했을 거다.
2. 기계한테 넘긴 것: 수집, 계산, 그림, 발송
넘긴 건 크게 네 덩어리다.
먼저 데이터를 받아오는 일. 지표별로 창구가 다 다르니까 창구마다 작은 어댑터를 하나씩 뒀다. 국내 신용융자, 국고채 금리, 국제수지, 글로벌 지표, 시가총액 집중도, 투자자별 수급, 김치 프리미엄, 채권 발행시장 같은 식으로. 처음엔 몇 개로 시작했는데 계속 붙다 보니 어댑터가 열 개를 넘겼고, 마지막엔 스물이 넘었다.
받아온 원자료를 그냥 쌓아두기만 하면 안 읽히기 때문에 계산도 기계 몫으로 돌렸다. 전월 대비 얼마나 변했는지, 1년 누적으로 보면 어떤지 정도는 미리 계산해 두게 했다.
그림도 마찬가지다. 숫자만 스무 개 늘어놓으면 아무도 안 본다. 나조차도. 그래서 차트를 자동으로 그리게 했고, 차트 종류는 여섯에서 열하나로, 나중엔 열여덟까지 늘었다.
마지막은 정해진 시각에 보내주는 일인데, 이건 맥의 launchd에 걸었다. launchd는 맥이 "몇 시에 이거 실행해"를 기억해 주는 기본 기능이다. 평일 오후엔 일일 요약이 텔레그램으로 오고, 금요일엔 주간 리포트가, 매달 1일엔 전체 데이터 묶음과 차트가 한 번에 나온다. 텔레그램으로 뭘 받는 배선 자체는 아침 브리핑 만들 때 이미 깔아둔 거라 그대로 재사용했다.
여기까지가 "명령어 하나 치면 전부 도는" 상태. 시작할 땐 이게 목표였다.
▲ 매크로 지표 수집에서 자동으로 도는 일과 사람이 손으로 남긴 일을 좌우로 나누고 아예 안 하기로 한 것을 하단에 정리한 경계선 도표 (자체 제작 이미지)
3. 시작하자마자 막힌 문 두 개
근데 다 되진 않더라.
하나는 거래소 원자료였다. 투자자 유형을 다섯 갈래로 쪼갠 보유 비중 시계열을 받으려고 했는데, 접근이 막혔다. 서버 쪽에서 특정 아이피를 차단하면 그걸로 끝이다. 우회 수단을 찾을 수도 있겠지만, 남의 사이트가 명시적으로 막아둔 걸 뚫는 건 하고 싶지 않았다. 그래서 그 칸은 비워뒀다. 흐름(누가 얼마 샀나)은 다른 경로로 받을 수 있어서 그건 살렸고, 비중 시계열만 공백으로 남았다.
다른 하나는 반대매매 실데이터. 빚내서 산 주식이 강제로 팔리는 물량인데, 이게 시장 스트레스를 보기엔 딱 좋은 숫자다. 근데 공개된 곳을 두 군데 뒤졌는데 둘 다 안 됐다. 결국 프록시로 갔다. 프록시 지표는 "진짜 숫자를 못 구하니까, 그것과 같이 움직일 법한 다른 숫자로 대신 본다"는 뜻이다. 근사치라는 걸 아는 채로 쓰는 거다.
못 구하는 데이터가 있다는 걸 인정하는 데 생각보다 시간이 걸렸다.
이 두 개를 처리하면서 기준이 하나 생겼다. 못 구하면 못 구한다고 화면에 적어두게 한 것. 빈칸을 그럴듯하게 메우는 게 제일 나쁘다. 프록시로 대체한 자리엔 프록시라고 라벨을 붙였고, 아예 비어 있는 자리는 비어 있는 채로 뒀다.
4. 제일 무서웠던 건 숫자가 조용히 늙는 거였다
여기가 이 글에서 제일 하고 싶은 얘기다.
외국인 수급을 받아오는 부분이 있었다. 증권사 API로 실시간 데이터를 받고, 과거분은 저장해 둔 엑셀에 이어 붙이는 구조. 그런데 API 쪽이 실패하면 이 코드가 아무 말 없이 묵은 엑셀로 되돌아가고 있었다. 이걸 폴백이라고 하는데, 원래는 좋은 설계다. 하나 막혀도 서비스가 안 죽으니까. 문제는 조용했다는 거다. 화면엔 멀쩡한 숫자가 떴고, 그게 며칠 전 숫자인지 오늘 숫자인지 구분이 안 됐다.
에러가 나서 빨간 글씨가 뜨면 차라리 낫다. 사람이 알아채니까. 근데 이건 계속 정상으로 보인다. 자동화가 조용히 잘못되는 문제는 따로 한 편 쓴 적이 있는데, 이 건은 그중에서도 악질이었다. 결과물이 틀린 게 아니라 낡은 거라서.
폴백은 없앴다. 실패하면 실패했다고 말하고 멈추게. 그러고 나서 다시 뽑은 외국인 1년 누적 순매수가 −107.5조원이었다(2026년 6월 중순 기준·조원·한국투자증권 오픈API 실시간분에 보관해 둔 엑셀 과거분을 이어 붙임). 이게 정합값이다.
그다음에 규칙을 하나 더 넣었다. 모든 숫자 옆에 언제 것인지, 단위가 뭔지, 어디서 온 건지를 붙이게 했다. 이 세 개가 없으면 그 숫자는 검증 전 추정치로 취급한다. 지표마다 늦게 도착하는 정도가 다르기 때문이다. 국제수지는 체감상 두 달쯤 지나야 확정치가 붙고, 투자자 예탁금은 이삼일 정도 늦더라. 두 숫자를 나란히 놓고 "지금 이렇다"고 말하면 그건 지금이 아니다.
자동 수집에서 관리해야 할 건 데이터의 정확성이 아니라 데이터의 나이였다.
▲ 실시간 API 실패 시 묵은 엑셀로 조용히 되돌아가던 기존 구조와 실패하면 멈추도록 고친 구조를 위아래로 대비한 흐름도 (자체 제작 이미지)
5. 같은 '외국인 순매수'가 세 개로 나왔다
지표를 늘리다 보면 같은 말이 여러 군데서 나온다. 그리고 값이 다르다.
외국인이 얼마나 사고팔았나를 세 군데서 받았는데 이렇게 나왔다. 주식 쪽 집계로는 연초 이후 누적 −136.8조원(거래 기준·원화, 한국투자증권 오픈API 2026년 6월 중순 조회), 채권 쪽은 +70~90조원(보관 기준·원화, 한국은행 ECOS 2026년 6월 중순 조회), 국제수지 기준으로는 −378억달러(한국은행 ECOS 국제수지 통계 2026년 6월 중순 조회). 앞 절의 −107.5조원과 이 −136.8조원이 둘 다 같은 증권사 창구에서 나온 외국인 주식 순매수인데 값이 다른 건, 앞엣것은 최근 1년을 굴려서 더한 수치고 이건 연초부터 쌓아 올린 수치라서다. 기간이 다르면 같은 이름이어도 다른 숫자가 나온다. 처음엔 이걸 다 더해서 순합을 내려고 했다. 안 닫히더라. 당연했다. 셋 다 맞는 숫자인데 집계 기준이 다르고(거래 기준이냐 보관 기준이냐), 통화가 다르고(원화냐 달러냐), 포함 범위가 다르다.
여기서 두 가지를 정했다.
기준이 다른 숫자는 나란히 놓지 않는다. 놓아야 하면 각각 라벨을 붙이고, 절대 더하지 않는다. 라벨 없이 두 숫자를 붙여 쓰면 읽는 사람은 둘이 같은 척도라고 자동으로 믿는다. 심지어 몇 달 뒤의 나도 그렇게 믿었다.
그리고 정본을 하나 지정했다. 셋 다 유효한데 합이 안 닫히면, 근거를 댈 수 있는 하나를 진실원으로 못 박고 나머지는 보조로 내린다. 국경 넘는 자금 흐름은 내가 판단하기로는 국제수지 기준이 정본이다. 주식 집계와 채권 집계는 각자 자기 시장 안에서 오간 것만 세지만, 국제수지는 거주자와 비거주자 사이에 오간 돈 전체를 하나의 회계 틀로 묶어서 잡으니까. "애매하니까 둘 다 참고" 같은 태도는 판단을 미루는 것처럼 보이지만 실은 아무것도 안 정하는 거였다.
▲ 외국인 순매수가 주식·채권·국제수지 세 소스에서 서로 다른 값으로 갈리는 것을 세 칸으로 보여주고 국제수지를 정본으로 강조한 비교 카드 (자체 제작 이미지)
6. 자동으로 만들어진 지표를 통째로 버리라고 했다
이게 제일 아팠다.
파이프라인이 커지니까 원자료를 서로 나누고 곱해서 만든 지표들이 생겼다. 개인 순매수 대비 시총이 얼마나 반응했나를 재는 것, 자금 한 단위가 부를 몇 배로 부풀렸나를 재는 것 같은 거. 그럴듯했다. 숫자도 소수점 아래까지 딱 떨어지게 나왔고, 그걸로 "천장 신호가 나왔다"는 문장까지 쓸 수 있었다.
보다가 되물었다. 이 지표, 누가 검증한 거냐고. 학계에서 쓰는 거냐고. 아니었다. 이 파이프라인이 자기가 만들어낸 계산이었다. 만든 쪽이 계산하고 만든 쪽이 의미를 붙인 거다. 게다가 2차 시장에서 누가 사면 누군가는 판다. 순유입이 0인 판에서 "유입 대비 반응"을 재는 건 어딘가 동어반복이었다.
전부 철거시켰다. 관련 문서 버전을 여러 번 갈아엎어야 했고, 이미 그 지표로 써놓은 해석 문장들도 다 걷어내야 했다. 그리고 규칙을 박았다. 크기를 말해야 하면 외부 문헌에 있는 값과 범위만 쓴다. 굳이 자체 계산을 써야 하면 "자체 산출·미검증"이라고 라벨을 단다.
돌아보면 이게 이 프로젝트 통틀어 제일 크게, 제일 여러 번 반복한 실수였다. AI한테 뭘 시키면 결과물이 그럴듯하게 나오는데, 그럴듯한 것과 검증된 건 완전히 다른 물건이다. 채점 기준을 어떻게 세우냐가 진짜 어렵다는 건 모델 비교하면서도 똑같이 겪었고, 남의 방법론을 따라 만들다 3일을 버린 적도 있다. 매번 같은 자리에서 넘어지네 ㅎㅎ
소수점이 붙어 있으면 왜 그렇게 믿음이 가는지 모르겠다.
7. 그래서 선을 어디에 그었나
정리하면 이렇다.
기계 쪽에 남긴 것: 데이터를 받아오는 일, 단순 계산, 차트 그리기, 정해진 시각에 보내주기. 이건 사람이 해봤자 더 잘하지도 않고 빼먹기만 한다. 매일 도는 일일 요약, 주간 리포트, 매달 1일 데이터 묶음까지가 여기다.
손에 남긴 것: 이 숫자가 무슨 뜻이냐를 쓰는 일. 월간 서술 보고서는 지금도 데이터만 자동으로 받아놓고 해석은 앉아서 쓴다. 그리고 미국·글로벌 쪽 분기 데이터 재계산도 아직 수동이다. 실적 발표가 나오면 사람이 한 번 돌려야 한다.
아예 안 하기로 한 것: 검증 안 된 자체 지표 만들기, 못 구한 데이터를 근사치로 조용히 메우기, 기준 다른 숫자 나란히 놓기.
이 경계가 어디서 왔냐면, 다 사고 난 자리에서 왔다. 미리 설계해서 그은 선이 하나도 없다. 조용한 폴백을 겪고 나서 나이 관리 규칙이 생겼고, 숫자 세 개가 안 맞은 뒤에 정본 지정이 생겼고, 자체 지표를 철거하고 나서 라벨 규칙이 생겼다.
돌아보니 자동매매를 완전자동으로 안 만들었을 때랑 결론이 비슷하더라. 거기선 주문 넣기 직전에 손가락 하나를 남겼는데, 여기선 해석하기 직전에 남겼다. 자동화의 마지막 한 칸은 계속 사람 몫으로 남는 것 같다. 그 칸이 어디냐가 매번 다를 뿐이고. 권한을 어디까지 풀지 정하는 문제도 비슷한 결이었다.
누가 이걸 해보면 좋을까. 매주 같은 사이트 대여섯 군데를 돌면서 숫자를 옮겨 적고 있는 사람. 공식 API가 있는 데이터라면 반나절이면 배선이 끝난다. 반대로 데이터가 흩어져 있고 출처마다 기준이 다르면, 배선보다 기준 정리에 시간이 훨씬 더 든다는 걸 알고 시작하는 게 낫다.
분기 데이터는 아직도 손으로 돌린다. 자동으로 넘기려면 실적이 새로 나왔는지를 기계가 판단해야 하는데, 그 판단을 맡겨도 되는지가 아직 안 정해졌다. 3줄 요약 - 매크로 지표 수집·계산·차트·발송은 전부 자동으로 넘겼다. 공식 API만 쓰면 유료 키 없이도 된다. - 자동화에서 진짜 관리할 건 정확성이 아니라 숫자의 나이였다. 조용히 묵은 데이터로 되돌아가는 폴백을 없애고, 모든 수치에 기준일·단위·출처를 붙이게 했다. - 해석은 손에 남겼다. 파이프라인이 스스로 만들어낸 지표는 검증된 게 아니라서 전부 버렸다.
이 글은 정보 제공이 목적이고, 작성 시점 기준이다. 요금·기능·정책은 이후 바뀔 수 있으니 결제·설치 전 공식 페이지를 한 번 확인하는 게 좋다. 특정 제품 사용을 권유하거나 결과를 보장하지 않는다. 참고한 공식 자료 - 한국은행 경제통계시스템 오픈API: ecos.bok.or.kr/api (외국인 채권 보관잔고·국제수지 수치 조회처) - 금융감독원 DART 오픈API: opendart.fss.or.kr - 미국 세인트루이스 연준 FRED API: fred.stlouisfed.org/docs/api - 미국 증권거래위원회 EDGAR API: sec.gov/edgar/sec-api-documentation - 공공데이터포털: data.go.kr - 한국투자증권 오픈API 포털: apiportal.koreainvestment.com (외국인 주식 순매수 연초 이후 누적 −136.8조원·최근 1년 누적 −107.5조원 조회처) - 맥 정기 실행(launchd) 공식 문서: Creating Launch Daemons and Agents