AI 트레이딩봇 — Docker 없이 Python 스크립트 하나로 운영하기
삽질 기록이다. 거창한 아키텍처 얘기 아니고, “왜 이걸 진작 안 했지?” 싶은 그런 류.
문제: 새벽에 장이 열려도 봇은 자고 있었다
원래 구성은 이랬다. 로컬 Windows PC에 Docker 띄우고, n8n 워크플로우로 Alpaca API 찌르고, Claude한테 판단 맡기고, 주문 넣는 파이프라인.
얼핏 보면 그럴듯하다. 근데 문제가 있다.
Docker가 꺼지면 봇도 꺼진다.
윈도우 업데이트, 절전 모드, 가끔씩 Docker Desktop이 멋대로 죽는 것까지. NYSE는 UTC 13:30에 열린다. 한국 시간으로 새벽 10시 반. 그 시간에 PC가 제대로 돌고 있다는 보장이 없었다. 실제로 몇 번 장이 열렸는데 봇이 죽어 있었다.
처음 떠올린 해결책들
외부 서버로 옮기면 되지 않냐는 생각이 먼저 들었다.
- Railway — 무료 플랜 있고, cron job 지원함. 근데 컨테이너 올리고 환경변수 세팅하고… 또 다른 관리 포인트가 생긴다.
- Oracle Cloud 무료 인스턴스 — AMD VM 무료로 주는 거 있다. 세팅 한번 하면 24/7 돌긴 하는데, 가끔 무료 인스턴스 강제 회수 당했다는 후기들이 있어서 불안했다.
- Fly.io, Render — 비슷한 고민.
결론을 못 내고 있었다.
깨달음: 이미 24/7 돌고 있는 게 있잖아
어느 날 갑자기 생각이 들었다.
맥북이 항상 켜져 있잖아.
AI 어시스턴트 플랫폼이 이미 돌고 있고, 맥은 절전 없이 24/7 운용 중이다. 굳이 외부 서버를 하나 더 만들 이유가 없었다. 이미 있는 인프라를 안 쓰고 있던 거다.
해결책은 단순했다. n8n 버리고, Python 스크립트 하나로 다시 짜서, cron으로 15분마다 실행.
마이그레이션: n8n 워크플로우 → Python 한 파일
n8n에서는 각 노드가 하나의 step이었다. HTTP Request 노드로 Alpaca 찌르고, Function 노드에서 로직 짜고, 또 HTTP Request로 Claude 부르고…
이걸 Python 하나로 펼쳐 놓으니 오히려 더 명확했다.
1
2
3
4
5
6
7
run.py
├── 장 시간 체크 (UTC 13:30~20:00, 월~금)
├── Alpaca에서 계좌/포지션/SPY가/뉴스 수집
├── 자동 청산 (익절 +5%, 손절 -3%)
├── 한도 체크 (buying power, 숏 비중, 손실 한도)
├── Claude에 판단 요청 → JSON 파싱
└── Alpaca 주문 → 텔레그램 알림
cron 등록은 이렇게:
1
*/15 * * * * /usr/bin/python3 ~/trading-bot/run.py >> ~/trading-bot/run.log 2>&1
끝이다.
n8n 대비 뭐가 좋아졌나
Docker 의존성 제로. Python이랑 pip 패키지 세 개만 있으면 된다.
코드가 파일 하나. n8n 워크플로우는 JSON으로 export해도 사람이 읽기 불편하다. Python 파일은 git에 올리고 diff 보면 바로 무슨 변경인지 안다.
디버깅이 쉽다. 뭔가 잘못되면 python3 run.py 직접 실행해보면 된다. n8n에서는 노드 하나하나 실행 추적하면서 어디서 터졌는지 찾아야 했다.
로그가 단순하다. cron이 stdout/stderr 파일에 그냥 쌓는다. 더 필요하면 logging 모듈 붙이면 되고.
구현 로직 간략 소개
핵심 흐름만 짧게:
자동 청산 먼저 — AI한테 묻기 전에, 수익률 +5% 넘으면 익절, -3% 밑이면 손절. 이건 룰 기반이라 AI 판단 불필요.
한도 체크 — buying power가 부족하거나, 숏 비중이 너무 크거나, 손실이 일정 이상이면 HOLD. 리스크 관리.
Claude 판단 — 계좌 현황 + 포지션 + SPY 현재가 + 최신 뉴스 넘겨서 BUY/SELL/HOLD + 신뢰도 받아옴. 신뢰도 40 미만이면 자동 HOLD.
주문 — equity의 12% 규모로 market order.
텔레그램 — 모든 결과 (BUY/SELL/HOLD/에러) 다 알림. 잠 자다 알림 오면 뭔가 됐다는 거다.
교훈
이미 있는 인프라를 먼저 봐라.
새 서버 띄울 생각부터 하지 말고, 지금 돌고 있는 게 뭔지 먼저 파악하는 게 맞다. 대부분의 경우 이미 쓸 수 있는 게 있다.
n8n이 나쁜 도구는 아니다. 비개발자가 워크플로우 짜기엔 좋다. 근데 코드로 짜도 되는 걸 GUI 노드로 관리하는 건 오히려 overhead다. 특히 Docker 위에 올려놓고 안정성까지 신경 써야 한다면.
Python 스크립트 + cron. 고전적이지만, 여전히 제일 단순하고 믿을 만하다.