가상화폐 자동 매매 프로그램 제작기 (실패)
"내 돈을 프로그램에 맡길 수 있을까?"
업무 자동화를 한동안 만들다 보면 한 가지 욕심이 생긴다. 크롤링을 자동화하고, 챗봇을 만들고, 문서에서 개인정보를 지우는 일까지 코드에 맡기고 나면, 다음 질문이 자연스럽게 따라온다.
"그럼 돈 버는 것도 자동화할 수 있지 않을까?"
가상화폐 자동매매는 그 질문의 끝에 있었다. 24시간 열려 있는 시장, 공개된 API, 분 단위로 쏟아지는 데이터. 자동화를 좋아하는 사람에게 이보다 매력적인 놀이터는 없다. 게다가 잘만 하면 돈까지 번다.
결론부터 말하면, 나는 이걸 두 번 만들었고 두 번 다 멈췄다. 진짜 돈은 단 한 번도 넣지 못했다. 그런데 이 글을 쓰려고 옛 코드를 다시 열어보고 나서야, 내가 왜 멈췄는지 그제야 정확히 알게 됐다.
1차 시도: 지표를 믿어보기로 했다
처음 만든 건 순수한 기술적 지표 기반 프로그램이었다. RSI, 이동평균선, MACD, 볼린저 밴드, 스토캐스틱. 차트를 보는 사람이라면 누구나 아는 지표들을 실시간으로 계산하고, 일정 조건이 맞으면 매수·매도하도록 규칙을 짰다.
여기에 거창한 AI는 없었다. 그냥 "RSI가 30 아래면 사고, 70 위면 판다" 같은 규칙의 조합이었다. 대신 백테스트 엔진을 붙여서, 과거 데이터로 이 규칙이 돈을 벌었을지 검증했다. 확보가능한 데이터를 바탕으로 각 지표들을 실시간으로 계산해서 그 값이 업비트와 완전히 동일하게 만들어내는 것 부터가 일이었다. 그래도 꾸역꾸역 만들다보니 용케 해냈는데..
문제는 그 다음부터였다.
첫째, 백테스트에서 내 상식에 납득이 가는 전략이 좀처럼 나오지 않았다. 수익이 나는 조합을 찾으면, 그건 대개 과거 데이터에만 기막히게 들어맞는 숫자 놀음이었다. 파라미터를 조금만 바꿔도 결과가 뒤집혔다. "이게 정말 시장을 읽는 건가, 아니면 과거에 맞춰 끼워 넣은 건가." 스스로 설득되지 않는 전략에 돈을 걸 수는 없었다.
둘째, 시간 단위의 벽이 있었다. 단타는 판단할 시간이 너무 촉박했다. 신호가 떴을 때 사람이든 코드든 망설일 여유가 없었다. 그나마 현실적인 건 며칠 단위로 보는 스윙이었지만, 스윙은 또 그만큼 내가 개입할 여지가 많아서 "자동매매"라는 말이 무색했다.
셋째, 결정적으로 실전에서 무너졌다. 규칙을 다 짜고 실제 계좌에 붙였더니, 프로그램은 매수는커녕 잔고 조회부터 막혔다. 업비트 API의 요청 수 제한(rate limit)에 계속 걸린 것이다. 그날 로그는 이런 줄로 가득 차 있었다.
ERROR - KRW 잔고 조회 중 오류 발생: 요청 수 제한 파싱에 실패했습니다.
WARNING - 잔고 조회 재시도 중... (1/3)
DEBUG - API 요청 제한 준수를 위해 0.90초 대기
... (같은 내용 수천 줄)
340KB짜리 로그 파일을 나중에 열어보니, 전부 잔고 조회 실패와 재시도와 대기의 무한 반복이었다. 매수 주문이 성공한 기록은 단 한 줄도 없었다. 거창하게 "AI를 믿을 수 없어서 안 썼다"가 아니라, 주문 한 번 제대로 넣어보지 못하고 멈춘 것이다. 그 프로그램을 나는 버전을 바꿔가며 여섯 번이나 다시 만들었지만, 결과는 크게 다르지 않았다.
2차 시도: 그럼 AI에게 맡기면 되지 않을까
지표만으로는 "판단"이 안 된다는 게 1차의 교훈이었다. 숫자는 정확한데, 그 숫자를 종합해서 "그래서 살 거냐 말 거냐"를 정하는 일은 단순한 규칙으로 떨어지지 않았다.
그래서 두 번째는 방향을 바꿨다. 판단을 AI에게 맡기기로 한 것이다. 마침 LLM이 빠르게 좋아지던 때였다.
사실 AI에게 맡겨보려는 시도가 처음은 아니었다. 그전에도 단일 스크립트로 Gemini에게 매수·매도를 물어보는 걸 만들어봤지만, 거래소 API조차 제대로 붙이지 못한 채 흐지부지됐다. AI에게 판단을 맡긴다는 발상은 한 번에 되는 일이 아니었다. 이번엔 작정하고 제대로 만들기로 했다.
이번엔 제법 본격적으로 설계했다. 구조는 이랬다.
| 단계 | 하는 일 |
|---|---|
| 마켓 스캔 | 거래량 상위 코인을 추려 후보를 만든다 |
| 데이터 수집 | 지표(RSI·ADX 등)와 함께 암호화폐 뉴스 헤드라인까지 모은다 |
| AI 판단 | Gemini에게 이 데이터를 통째로 주고 매수 종목과 비중을 정하게 한다 |
| 검증 | AI가 내놓은 목표가·손절가·손익비를 코드가 다시 확인한다 |
| 실행 | 오전 9시 5분에 매수, 다음 날 8시 59분에 청산한다 |
여기에 회고(reflection) 기능까지 붙였다. 하루가 끝나면 AI가 그날 매매를 스스로 복기하고, 그 교훈을 다음 날 판단에 반영하게 한 것이다. 사람처럼 배우는 트레이더. 글로 적으니 꽤 그럴듯했다.
균열: 로그를 열어봤다
그럴듯해 보였다는 게 핵심이다. 이번 글을 쓰면서 그날 AI가 실제로 무슨 판단을 내렸는지 로그를 열어봤는데, 거기서 환상이 깨졌다.
내가 AI에게 준 지시는 이렇게 시작했다.
너는 월가 출신의 암호화폐 전문 트레이더야.
소극적 관망보다 적극적 매수를 선호해.
HOLD는 정말 신호가 없을 때만. 웬만하면 BUY 추천해.
오늘은 공격적으로 간다.
그리고 그 지시를 받은 AI는, 충실하게 "웬만하면" 사라고 답했다. 다섯 종목을 골라줬는데, 그 판단의 근거를 뜯어보니 문제가 한둘이 아니었다.
| AI가 말한 것 | 실제 |
|---|---|
| "G 코인 RSI 62.62 (매수 영역)" | 실제 G의 RSI는 38. 다른 코인 숫자를 그대로 복사해 붙였다 |
| "긍정적 뉴스: G 프로젝트 업데이트" | 그날 뉴스 목록에 그런 헤드라인은 없었다. 지어낸 것이다 |
| "손익비 2.0 이상 필수, 위반 시 검증 실패" | 정작 매수한 종목은 AI 스스로 손익비를 1.5로 적어놓고도 통과됐다 |
지표 숫자를 지어내고, 있지도 않은 뉴스를 근거로 댔다. 그러고도 문장은 전문가처럼 매끄러웠다. 더 허탈했던 건 회고였다. 그날 실제 수익은 한 종목에서 +0.28%, 1,746원짜리를 1,751원에 판 5원의 차이였는데, AI는 다음 날 회고에 이렇게 적었다.
"거래량 급증과 긍정적 뉴스, RSI 신호가 시장 전환 가능성을 제대로 포착했습니다. 정확한 판단이었습니다."
5원을 벌고 "정확한 판단"이라 자평하는 트레이더. 그리고 그 자화자찬이 다음 날 프롬프트에 다시 들어가 또 다른 판단의 재료가 됐다. 자기가 만든 환각을 학습 자료 삼아 도는 폐쇄 회로였던 셈이다.
멈춤
여기서 멈췄다. 그리고 짚고 넘어가야 할 사실이 하나 있다. 2차 시도도 처음부터 끝까지 모의투자(paper)였다. 진짜 돈은 1원도 넣지 않았다. 모든 거래 기록에 "paper": true가 붙어 있다.
그러니까 내가 "신뢰가 안 가서 멈췄다"고 말할 때, 그건 막연한 공포 같은 게 아니었다. 내가 "웬만하면 사라"고 시켜둔 AI가, 숫자까지 지어내가며 "사라"고 하는 걸 두 눈으로 본 것이다. 그 판단을 믿고 실제 계좌를 연결한다는 건, 내 편향을 그럴듯한 말로 포장해 돌려받는 일에 지나지 않았다.
원래 이 개발일지엔 "멈출 줄 아는 것도 개발 역량"이라고 점잖게 적었었다. 틀린 말은 아니지만, 솔직히 말하면 멈춤의 절반은 다른 데 관심이 옮겨갔기 때문이다. 못 믿을 도구를 붙들고 있을 만큼 이게 절박하진 않았다. 그래서 흐지부지 손을 놨다.
실패라고 불렀지만
이 글을 쓰려고 두 코드를 나란히 다시 열어보고 나서야 보인 게 있다. 두 번의 실패는 원인이 정반대였다.
- 1차(지표)는 숫자는 정확한데 판단을 못 했다.
- 2차(AI)는 판단은 그럴듯한데 숫자를 지어냈다.
서로의 약점이 서로의 강점이다. 그렇다면 역할을 나누면 된다. 숫자는 코드가 계산하고, AI에게는 그 검증된 숫자를 건네 "이 상황을 어떻게 보냐"만 묻는다. AI가 내놓은 목표가나 손익비는 믿지 않고 코드가 다시 계산해 검증한다. AI는 자연어로 맥락을 읽고, 숫자는 끝까지 결정론적인 코드가 책임지는 구조.
2차 코드엔 이미 AI 출력을 검증하는 모듈이 있었다. 다만 그때의 나는 AI를 너무 믿도록 설계했을 뿐이다. 환각을 막는 일은 더 똑똑한 AI를 기다리는 게 아니라, 애초에 AI가 거짓말할 수 없는 자리에 두는 설계의 문제에 가깝다.
아직 그 세 번째 버전은 만들지 않았다. 그리고 이건 더 이상 "돈 버는 봇"에 대한 이야기가 아닌 것 같다. AI에게 무언가 중요한 판단을 맡길 때, 그 판단을 어디까지 믿고 어디서 끊을 것인가. 자동매매는 그 질문이 돈이라는 가장 정직한 단위로 드러나는 실험실이었을 뿐이다.
실패라고 적어두었던 두 프로젝트는, 그렇게 다음 프로젝트의 부품으로 아직 폴더 안에 남아 있다.