토스증권 Open API로 자동매매 봇을 만들어보기로 했다. 처음부터 실주문을 넣을 생각은 없었다. 일단 데이터가 제대로 들어오는지, 인증이 안정적으로 되는지부터 확인하는 게 우선이었다. Phase 0는 그 기반을 다지는 작업이었다.
파일 구조부터 정리했다
처음엔 스크립트 하나에 다 때려박고 시작했는데, 금방 한계가 왔다. 결국 역할별로 5개 파일로 쪼갰다.
| 파일 | 역할 | 핵심 내용 |
|---|---|---|
| toss_common.py | 공통 모듈 | .env 기반 자격증명 로딩, OAuth2 토큰 발급, 계좌번호 조회, 시세 조회, 통합 인증 함수, 콘솔+파일 동시 로깅 |
| get_price.py | 시세 조회 | 관심 종목 리스트 일괄 현재가 조회 후 콘솔 출력 |
| toss_portfolio.py | 포트폴리오 대시보드 | 보유 종목 조회 + 한글/영문 혼용 시 정렬용 폭 계산 로직 |
| toss_test.py | 연결 진단 | 인증 → 보유종목 원본 응답 출력까지 3단계 접속 가동성 테스트 |
| auto_trader.py | 자동매매 엔진 | 시세 감시 루프 + 3중 안전장치 + 텔레그램 알림 스켈레톤 + 재시도/백오프 로직 |
공통 모듈이 제일 중요했다
toss_common.py를 먼저 만든 이유는 단순하다. 인증 로직을 파일마다 복사-붙여넣기 하고 싶지 않았다. 자격증명 로딩, 토큰 발급, 계좌 조회, 시세 조회를 한 곳에 몰아넣고 나머지 파일에서는 authenticate() 하나만 호출하도록 만들었다. 로깅도 콘솔과 파일에 동시에 남기게 해뒀는데, 이건 나중에 401 에러 디버깅할 때 진가를 발휘했다.
한글 정렬이 생각보다 골치 아팠다
toss_portfolio.py에서 보유 종목을 표로 출력하는데, 한글 종목명과 영문/숫자가 섞이니까 정렬이 다 틀어졌다. 한글은 폭이 2배로 잡히는데 일반 문자열 길이 계산은 그걸 모르니까 벌어지는 문제였다. unicodedata.east_asian_width()로 실제 표시 폭을 계산해서 get_display_width, fit_to_width, center_korean 세 함수로 정리했다. 콘솔 출력 정렬 하나 때문에 이렇게까지 해야 하나 싶었지만, 막상 맞춰놓고 보니 훨씬 보기 편했다.
3중 안전장치, 이건 타협하지 않았다
자동매매 봇은 잘못 만들면 진짜 돈이 날아간다. 그래서 auto_trader.py에는 처음부터 안전장치를 세 겹으로 걸었다.
DRY_RUN = True # 실주문 절대 안 나가도록
TARGET_BUY_PRICE = 1 # 임시 목표가를 1원으로 (사실상 체결 불가)
# 실주문 호출부는 물리적으로 주석 처리
# response = requests.post(ORDER_URL, headers=headers, json=order_payload)
DRY_RUN 플래그 하나만 믿지 않았다. 목표가를 1원으로 걸어서 설령 로직에 구멍이 있어도 매수 조건을 만족할 수 없게 만들었고, 실주문 API를 호출하는 코드 자체를 주석으로 막아뒀다. 세 겹 다 뚫려야 실제로 주문이 나가는 구조다. 과하다 싶을 수도 있는데, 자동매매는 “설마 이런 실수를 하겠어” 싶은 지점에서 사고가 난다고 생각해서 이렇게 했다.
Phase 0에서는 실주문 없이 인증, 시세 조회, 포트폴리오 조회 기능만 구현하고 DRY_RUN·목표가 1원·주문 코드 주석 처리로 3중 안전장치를 걸어 안정성을 확보했다.
토큰 만료랑 네트워크 오류는 재시도 로직으로 방어
토스증권 API도 다른 OAuth2 기반 API들처럼 액세스 토큰이 일정 시간 지나면 만료된다. 401이 뜨면 그냥 죽어버리는 대신, 토큰을 재발급받고 원래 요청을 한 번 더 시도하도록 만들었다. 네트워크 순간 끊김 같은 것도 지수 백오프로 몇 번 재시도하게 해뒀다. 아직 실전에서 오래 돌려본 건 아니라서 이 로직이 얼마나 견고한지는 다음 Phase에서 더 검증해볼 생각이다.
다음 단계
toss_test.py로 3단계 접속 테스트까지는 통과했다. 다음 Phase에서는 실제 감시 루프를 더 오래 돌려보면서 재시도 로직이 실전에서도 버티는지 확인하고, 텔레그램 알림도 스켈레톤에서 실제 동작으로 붙여볼 예정이다.
“파이썬 자동매매 봇 3중 안전장치 구현기 | 토스 개발기 #0”에 대한 16개의 생각