퀀트 트레이딩에 관심이 생겨서, 매매 전략을 실제 시장에서 검증해보고 싶었습니다. 백테스트만으론 부족했어요. 실시간 시세·체결·슬리피지 같은 건 실제로 돌려봐야 감이 옵니다. 그래서 조건을 걸어두면 자동으로 신호를 잡고 뉴스가 뜨면 알림을 주는 실험 환경을 만들어, 데이터를 모으려고 한동안 24시간 돌려봤습니다.
근데 왜 하필 토스였나 — 소수점 미장 때문에
사실 증권사 API는 다른 데도 있었습니다. 한국투자증권만 해도 공식 REST API가 있었으니까요. 근데 저는 미국 주식을 다뤄야 했습니다. 미장은 한 주 한 주가 비쌉니다 — 엔비디아, 아마존 한 주 사려면 목돈이 들죠. 전략을 잘게 쪼개 검증하려면 소수점 거래(fractional)가 사실상 필수였는데, 그 소수점 미장은 제가 알기론 토스에서만 됐습니다.
여기서 딜레마가 생겼습니다. 공식 API가 있는 증권사는 제가 필요한 소수점 미장이 안 되고, 소수점 미장이 되는 토스는 공식 API가 없었어요. 결국 '기능'을 택했습니다. 공식 API가 없는 걸 감수하고 토스로 갔죠.
그래서 방법은 하나였습니다 — 비공식 라이브러리. 앱이 내부적으로 쓰는 API를 누군가 뜯어서 만들어둔 것들이 있었고, 거기에 제가 아는 지식(인증 토큰을 어떻게 얻는지, 요청을 어떻게 흉내 내는지)을 이어붙여서 굴렸습니다. 연구용 프로토타입이라 이 정도면 됐어요.
가장 큰 벽은 '24시간'이었습니다 — 원래 이건 클라우드에서 안 돕니다
진짜 문제는 따로 있었습니다. 비공식 API는 제 컴퓨터가 켜져 있고 제 로컬 환경일 때만 돌아갔습니다. 인증이 실제 기기·환경에 묶여 있어서요. 그럼 24시간 돌리려면 제 컴퓨터를 24시간 켜둬야 하는데, 비현실적이었습니다. 그렇다고 서버에 올리자니 토스 제약상 배포 환경(클라우드/서버)에선 그냥 막혔고요.
그래서 개발 지식을 동원했습니다. 로컬에서만 되던 걸 클라우드에서도 돌아가게 우회하는 방법을 연구해서, 제 로컬 환경을 클라우드 위에 재현하는 식으로 24시간 구동에 성공했습니다. 거기서 한발 더 나가, 계정 여러 개를 동시에 굴리는 것까지 실제로 되게 만들었어요. 됐습니다. 근데 이건 편법 위에 또 편법을 얹은 거였습니다. 되게 만드는 데 든 그 노력 전부가, 사실 '원래 열려 있지 않은 문'을 억지로 여는 작업이었죠.
되긴 됐는데, 늘 불안했습니다
문제는 이게 '정식으로 열어준 문'이 아니라 '뒷문'이라는 거였습니다.
토스 앱 업데이트 한 번이면 깨질 수 있었습니다. 내부 API 구조가 바뀌면 제 코드는 예고 없이 그대로 멈춥니다. 문서도 없었어요. 뭐가 되는지, 응답이 어떻게 오는지 전부 제가 직접 찔러보며 알아내야 했습니다 — 추측과 실험의 연속. 계정 관점에서도 떳떳한 방식은 아니었고, 언제 막혀도 할 말 없는 상태였습니다.
전략을 검증하려고 돌려두는 건데, 정작 저는 '아침에 깨보면 실험이 멈춰 있을까 봐' 불안했습니다. 데이터를 모으자고 만든 게, 데이터가 언제 끊길지 신경 쓰이게 만든 셈이었죠.
그러다 토스가 공식 Open API를 냈습니다
토스증권이 정식 Open API를 열었습니다. OAuth2 정식 인증에, 문서에, 시세·계좌·주문·레퍼런스까지. 그래서 이걸 감싸는 클라이언트 SDK를 하나 만들어서(async 파이썬, 토큰 자동 발급·갱신, Decimal로 금액 정밀도 보존) 자동매매 백엔드에 얹었습니다.
바뀐 건 이런 것들이었습니다.
인증이 정식입니다. client_id/secret으로 OAuth2 토큰을 발급받아 씁니다. 토큰을 훔쳐 흉내 낼 필요가 없어요. 문서가 있습니다. 응답이 뭐가 오는지, 뭘 보낼 수 있는지 명시돼 있어서, 찔러보는 대신 읽으면 됩니다. rate limit도 공식으로 명시됩니다. 그룹별 초당 한도가 문서에 있고 응답 헤더로 실시간 확인까지 되니, "얼마나 때려도 되나"를 눈치로 재던 걸 이제 숫자로 압니다.
멀티 계정도 정식이 됐습니다. 예전엔 계정 여러 개를 억지로 붙여 굴렸는데, 공식은 한도가 client_id(= 멤버) 단위라 멤버마다 자격증명이 다르면 요청 버킷이 서로 독립적입니다. 억지로 하던 걸 정식 스펙이 그대로 보장해줬어요.
그리고 이게 컸습니다 — 그냥 배포하면 됩니다. 예전엔 클라우드에서 24시간 돌리려고 우회를 연구해서 억지로 여는 게 일이었는데, 공식 API는 서버 환경을 정식으로 허용합니다. 그 우회 전부가 통째로 필요 없어졌어요.
진짜 달라진 건 '편함'보다 '안심'이었습니다
물론 편해졌습니다. 근데 그게 핵심은 아니었어요.
가장 큰 변화는 불안의 토대가 사라진 것입니다. 예전엔 잘 돌아가도 '이게 내일도 될까'가 항상 깔려 있었어요. 뒷문은 언제든 닫힐 수 있으니까요. 공식 API는 계약입니다. 토스가 "이건 쓰라고 열어둔 문"이라고 명시한 거고, 바뀌면 공지가 있고, 문서가 보증합니다.
같은 자동매매인데, 편법 위에서 굴리던 걸 이제 정식 계약 위에서 굴립니다. 코드가 아니라 토대가 바뀐 겁니다.
남는 생각
비공식으로라도 먼저 만들어본 게 헛짓은 아니었습니다. 그때 내부 인증·요청 구조를 손으로 뜯어본 경험이, 공식 SDK를 감쌀 때 그대로 감이 됐거든요. 뭐가 필요한지 이미 알고 있었으니까요.
결국 순서는 이랬습니다 — 없으면 뒷문으로라도 만들어보고, 정문이 열리면 갈아탄다. 다만 정문이 준 건 새 기능이 아니라, 자는 동안 신경 안 써도 된다는 것이었어요.
애초에 저는 소수점 미장이라는 '기능' 하나 때문에 공식 API 없음을 감수하고 토스로 갔습니다. 기능이냐 안정이냐, 둘 중 하나를 골라야 했던 셈이죠. 그런데 이제 그 토스가 공식 API까지 냈습니다. 고르던 두 개를, 이제 둘 다 갖게 됐어요.
물론 아직 완성형은 아닙니다. 예를 들어 예약 구매 같은 건 공식 Open API에 아직 없어요. 그래도 토스가 올해 안에 완성형을 목표로 하고 있다고 해서, 나머지 조각이 채워지는 걸 기대하며 지켜보는 중입니다.