본문 바로가기
IT & 비즈니스

AI 시대의 투자 생존법: 게만아 스타일 파이썬 자동매매와 백테스팅의 모든 것

by notes9107 2026. 8. 24.

1. 수익률 그래프에 속았던 첫 경험

저는 2023년 3월부터 파이썬으로 비트코인 자동매매를 만들기 시작했습니다. 당시에는 이동평균선 세 개와 RSI 조건을 조합하면 감정을 뺀 매매가 가능하리라 생각했습니다. 2020년 1월부터 2023년 2월까지의 1시간봉을 넣고 돌린 첫 결과는 누적 수익률 147%, 승률 78%로 표시됐습니다. 밤늦게까지 그래프를 확대해 보면서 이제 손으로 매매하지 않아도 되겠다고 들떴습니다. 하지만 이 결과에는 거래 수수료와 슬리피지가 빠져 있었고, 신호가 나온 봉의 종가로 즉시 체결된다는 비현실적인 가정도 들어갔습니다. 제가 처음 배운 것은 숫자가 화려할수록 계산 과정을 먼저 의심해야 한다는 점이었습니다.

2. 실전 투입 일주일 만에 드러난 문제

2023년 4월 10일, 테스트용 계정에 50만 원을 넣고 자동매매를 시작했습니다. 백테스트에서 매수 신호가 나오면 다음 봉의 시가에 주문을 넣도록 바꿨지만, 실제 프로그램은 거래소 응답이 늦어 두 번 주문을 보내는 오류를 냈습니다. 한 번 사야 할 자리에서 18만 원어치가 두 차례 체결됐고, 텔레그램 알림을 확인했을 때는 이미 포지션이 계획보다 커진 뒤였습니다. 그날 손실은 1만 4,800원으로 크지 않았지만, 손실보다 주문 수량을 통제하지 못한 사실이 더 불안했습니다. 이후 주문 전 잔고와 미체결 주문을 다시 조회하고, 주문 식별자를 기록하는 절차를 코드에 넣었습니다.
수익률만 바라보던 제 시선도 이때 바뀌었습니다. 같은 전략을 수수료 0.05%, 왕복 슬리피지 0.1%로 다시 계산하니 147%였던 결과가 38%까지 내려갔고, 최대 낙폭은 12%에서 26.7%로 커졌습니다. 특히 2022년 5월과 2022년 11월 구간에서는 열두 번 연속 손실이 발생했습니다. 승률 78%라는 숫자만 보고 있으면 이런 구간을 견딜 준비를 하지 못합니다. 저는 이후 결과 화면에 누적 수익률뿐 아니라 최대 낙폭, 연속 손실 횟수, 월별 손익, 거래당 평균 손익을 함께 표시했습니다. 그래프가 우상향하는지보다 중간에 얼마나 깊게 꺼지는지를 먼저 확인하는 습관이 생겼습니다.

3. 제가 단순한 규칙으로 다시 만든 이유

처음에는 조건을 많이 넣을수록 정교한 전략이 된다고 믿었습니다. 이동평균선 기간을 7개 조합하고 RSI 기준을 11개로 나누어 총 수백 개의 조합을 자동 검색했습니다. 그중 하나는 2021년부터 2023년까지 수익률 212%를 기록했지만, 2023년 6월부터 석 달간 손실만 이어졌습니다. 과거 차트의 특정 굴곡에 맞춘 규칙이었기 때문입니다. 그래서 2023년 9월부터는 20일 이동평균선 위에 있을 때만 매수하고, 매수 금액은 전체 잔고의 10%로 제한하는 식으로 조건을 줄였습니다. 게만아 스타일에서 제가 참고한 부분도 이런 단순함과 반복 가능한 운영 방식이었고, 복잡한 예측보다 제가 매일 점검할 수 있는 규칙을 남기는 쪽을 택했습니다.
손절 기준을 정할 때도 처음에는 고정된 3%를 사용했습니다. 그런데 가격 변동이 작은 날에는 너무 자주 청산됐고, 변동이 큰 날에는 손실 규모가 커졌습니다. 2023년 10월 한 달 동안 3% 손절이 연속으로 다섯 번 발생하면서 수수료만 2만 원 가까이 나갔습니다. 이후에는 최근 20개 봉의 평균 변동폭을 참고하되, 한 번의 손실이 계좌의 0.5%를 넘지 않도록 주문 수량을 역산했습니다. 이 방식이 수익을 보장하지는 않았지만, 적어도 한 번의 신호에 자금이 몰리는 상황은 줄어들었습니다. 제가 체감한 자동매매의 역할은 미래를 맞히는 기능보다 정해 둔 손실 한도를 지키는 데 가까웠습니다.

4. 백테스트에서 제가 놓쳤던 세부 조건

백테스트 코드를 다시 보면서 가장 많이 고친 부분은 봉 데이터 처리였습니다. 예전에는 현재 봉의 종가로 지표를 계산한 뒤 같은 종가에 매수한 것으로 기록했습니다. 실제로는 봉이 끝나기 전 종가를 알 수 없으므로, 신호가 확정된 다음 봉 시가에 주문해야 합니다. 이 지연을 반영하자 누적 수익률이 64%에서 21%로 떨어졌습니다. 또 거래소에서 받은 캔들 중 마지막 봉은 아직 진행 중인 경우가 있어 해당 행을 제거했습니다. 이런 수정은 화면에 보이는 그래프를 덜 예쁘게 만들었지만, 제가 실제 주문을 넣는 상황과 훨씬 가까워졌습니다.
슬리피지도 한 가지 숫자로 고정하지 않았습니다. 2024년 1월부터 3월까지 소액으로 주문하면서 예상 가격과 체결 가격의 차이를 기록했고, 평소에는 0.03% 안팎이었지만 급락 시에는 0.2%를 넘는 경우가 있었습니다. 그래서 백테스트에는 기본 슬리피지 0.08%와 불리한 조건 0.2%를 각각 넣어 두 결과를 비교했습니다. 기본 조건에서 월평균 수익이 플러스여도 불리한 조건에서 손익분기점 아래로 내려가면 실전 투입을 미뤘습니다. 백테스트는 미래를 예언하는 도구가 아니라, 제가 어떤 가정을 넣었는지 드러내는 검사표에 가깝다고 느꼈습니다.

5. 자동매매를 돌리며 만든 운영 안전장치

2024년 2월에는 클라우드 서버에서 프로그램을 24시간 실행했습니다. 그런데 새벽 3시쯤 인터넷 연결이 끊겼고, 재접속 코드가 없어 프로그램이 멈춘 채 세 시간 동안 주문을 확인하지 못했습니다. 다행히 포지션 규모가 작아 손실은 6,300원에 그쳤지만, 서버가 살아 있는지 확인하는 장치가 없었다는 점이 문제였습니다. 그 뒤로 5분마다 상태 메시지를 텔레그램으로 보내고, 15분 동안 응답이 없으면 별도 알림을 받도록 구성했습니다. 매수와 매도 알림에는 종목, 주문 수량, 예상 가격, 실제 체결 가격, 잔고를 함께 기록했습니다. 알림이 많아 처음에는 번거로웠지만, 오류 원인을 나중에 추적할 때 큰 도움이 됐습니다.
저는 프로그램이 멈추는 경우보다 정상적으로 작동한다고 착각하는 경우를 더 경계합니다. API 키 권한은 출금 기능을 끄고 거래 전용으로 설정했으며, 키 값은 코드 파일에 직접 적지 않고 환경 변수로 분리했습니다. 매일 오전에는 로그에서 중복 주문, 잔고 불일치, 체결 지연을 확인하고, 일요일에는 한 주의 거래를 CSV 파일로 내려받아 수동 기록과 대조했습니다. 2024년 5월에는 거래소 잔고와 프로그램 내부 잔고가 0.003개만큼 달라진 일을 발견했는데, 소수점 반올림 방식이 서로 달랐던 탓이었습니다. 작은 차이라도 방치하면 주문 수량 계산에 영향을 주므로, 금액과 수량의 반올림 규칙을 한 곳에서 관리하도록 고쳤습니다.

6. 제가 지금도 지키는 투자 생존 원칙

현재 저는 자동매매 계좌를 전체 투자금의 일부로만 운영합니다. 2024년 7월 기준으로 한 전략에 넣은 금액은 전체 금융자산의 8%를 넘기지 않았고, 한 번의 거래에서 감수하는 손실 한도는 계좌의 0.5%로 정했습니다. 백테스트 기간도 상승장 하나만 골라 쓰지 않고 2019년부터 2024년까지 나눠서 확인합니다. 결과가 좋지 않은 달을 삭제하거나 조건을 계속 바꾸는 대신, 왜 손실이 발생했는지 먼저 기록합니다. 자동매매를 시작하려는 분이라면 화려한 지표보다 체결 방식, 수수료, 주문 실패 처리, 최대 낙폭부터 자신의 숫자로 적어 보시기 바랍니다. 제가 겪은 시행착오를 돌아보면, 오래 운영하게 만든 것은 수익률을 높인 비법이 아니라 작은 금액으로 검증하고 이상이 생기면 멈추는 습관이었습니다.