노션 DB + Github + 토스증권 API + 카카오톡, 자동매매는 이렇게 돌아간다
지난 글에서 자동매매 시스템은 어떤 툴로 만들었는지 다음 편에서 다루겠다고 했다. 이번 글이 그 이야기다.

4단계 - 왜 이렇게 나눴나
지난 글에서 심리를 배제하려고 자동매매를 만들었다고 했다. 그런데 심리를 배제하려면 "판단"과 "실행" 사이에 사람이 낄 틈이 없어야 한다. 그래서 네 단계로 쪼갰다.
- 판단 : 전략 코드가 사고팔 종목과 시점을 정한다
- 실행 : API가 그 판단을 그대로 주문으로 낸다
- 기록 : 뭘 샀고 팔았는지 두 곳에 남는다
- 보고 : 결과가 알아서 내 손에 들어온다
내가 할 일은 결과를 확인하는 것뿐이다. 판단에도, 실행에도 낄 자리가 없다.
판단: 전략 코드
파일을 trading_live.py와 KOSPI_V96, 이렇게 둘로 나눠뒀다.
trading_live.py는 가격을 확인하고, 주문을 처리하고, 그 결과를 기록으로 남기는 쪽이다. 반면 KOSPI_V96은 매도 신호와 매수 신호를 만들어내는 것 말고는 아무 일도 하지 않는다. trading_live.py가 KOSPI_V96을 호출해서 "오늘 뭘 사고 팔아야 하나"만 물어보고, 나머지 절차는 전부 자기가 처리한다.
굳이 이렇게 쪼갠 이유는 하나다. 전략을 바꾸고 싶을 때 trading_live.py를 건드리지 않아도 되게 하려는 것이다. KOSPI_V96을 다른 버전 파일로 바꿔치기만 하면, 가격 확인·주문 처리·기록으로 이어지는 나머지 파이프라인은 그대로 돌아간다. 지난 글에서 "전략을 세 번 바꿨다"라고 했는데, 실제로 바뀐 건 이 신호 생성 파일 하나였다. 그 밑에서 도는 실행·기록·보고 코드는 한 줄도 안 바뀌었다.
각 버전이 뭘 다르게 판단하는지, 진입·청산 조건이 어떻게 생겼는지는 이 글에서는 넘어간다. 그건 백테스트 얘기를 할 다음 편 몫이다. 여기서 하고 싶은 말은 판단과 실행이 파일 단위로 완전히 분리돼 있다는 것, 그래서 신호를 만드는 로직이 아무리 바뀌어도 그 신호를 받아 처리하는 쪽은 전혀 손댈 필요가 없다는 것이다.
실행: 토스증권 Open API 주문 파이프라인
전략이 신호를 내면 그 다음은 순전히 기계적인 일이다. 장 마감 30분 전인 15:00부터 15:40까지, 토스증권 Open API로 8단계를 거친다.

굳이 8단계로 쪼갠 이유는 미체결 때문이다. 주문을 한 번 넣는다고 다 체결되는 게 아니다. 호가가 살짝만 움직여도 주문이 남는다. 그래서 3분 간격으로 체결 여부를 확인하고, 남은 주문은 다시 낸다.
순서는 매도가 먼저다. 15:00에 잔고를 확인하고 매도 주문을 낸 뒤, 15:03과 15:06에 안 팔린 주문을 다시 잡는다. 15:09에 매수 주문을 내고, 15:12부터 15:18까지 세 번에 걸쳐 매수·매도 미체결을 전부 재조회해 재주문한다.
15:20부터 15:30까지는 종가 단일가 구간이다. S7까지 남은 주문은 여기서 한 번 더 체결 기회를 얻고, 장이 끝나면 자동으로 취소된다. 그래서 마지막 S8은 장 마감 후인 15:40에 돈다. 그 사이 체결된 분까지 쓸어 담아 장부를 맞추고, 그날 기록을 남긴다.
한 번에 끝내지 않고 40분에 걸쳐 나눈 건, 지정가 주문이 한 번에 다 체결되지 않는 일이 생각보다 흔했기 때문이다. 15:00에 딱 한 번 주문 내고 끝내는 구조였다면, 미체결된 종목은 그날 그냥 못 사고 넘어갔을 거다.
기록: 노션 DB와 GitHub
매일매일 기록이 되어야 현재 내 상황을 알 수 있다. 며칠만 안 남아도 계좌가 어떻게 흘러갔는지 전부 놓치게 된다.
매매일지, 자산일지, 투자비중 — 전부 CSV로 GitHub에 먼저 쌓이고, 그걸 노션 데이터베이스로 밀어 넣는다.
이렇게 나눈 이유는 단순하다. 노션은 API로 지우고 다시 쓰기가 너무 쉽다. 동기화 스크립트에 버그가 하나 있으면 데이터베이스 전체가 조용히 망가질 수 있다. 반면 GitHub는 커밋 단위로 남기 때문에, 노션이 잘못돼도 언제든 원본에서 다시 밀어 넣으면 된다. 코드가 읽고 쓰는 건 노션이지만, 내가 믿는 기록은 GitHub 쪽이다.
보고: 카카오톡 알림
최종적으로 오늘의 결과를 보고하는 역할을 한다. 장이 끝나면 그날 뭘 사고 팔았는지, 손익이 얼마인지를 카카오톡으로 보낸다.
내가 능동적으로 계좌를 안 열어봐도 결과가 알아서 온다. 확인하려고 마음먹는 순간에 이미 감정이 끼어들 여지가 생기는데, 그 순간 자체를 없애는 게 목적이다.
결과적으로 판단·실행·기록·보고가 각자 자기 자리에서 돌고, 사람은 결과만 보는 구조가 됐다. 다만 이 구조 위에서 실제로 돌아간 전략의 성적표는 지난 글에서 봤듯 −12.6%였다. 좋은 파이프라인이 좋은 전략을 보장하지는 않는다는 얘기다.