②업비트 자동매매 봇 만들기 다섯 개의 관문을 세웠더니 들어갈 자리가 없었다 > 자동매매 일지

본문 바로가기
자동매매 일지

②업비트 자동매매 봇 만들기 다섯 개의 관문을 세웠더니 들어갈 자리가 없었다

페이지 정보

profile_image
작성자 Coinlab
댓글 0건 조회 54회 작성일 26-08-04 10:39

본문

떨어지는 칼날을 잡지 않으려고 조건을 다섯 개 걸었다. 조건은 정확히 의도대로 작동했다. 물리는 일도 줄었다. 그런데 4개월간 이긴 거래의 평균 수익이 +0.72%였다. 수수료를 빼면 거의 남는 게 없는 숫자다.

평균 수익
+0.72%
평균 손실
−0.95%
최대 수익
+3.06%
손익비
0.76

①편에서 6월에 −53%가 난 원인이 매도 로직에 있었다고 썼다. 그건 사실이다. 하지만 그 구멍을 막고 나서도 이 봇은 여전히 돈을 벌지 못했다. 손익비 0.76이라는 숫자가 그대로 남아 있었기 때문이다.

손익비가 1보다 작다는 건 이길 때 버는 것보다 질 때 잃는 게 크다는 뜻이다. 이 구조에서 본전을 맞추려면 승률이 56.9% 이상이어야 한다. 실제 승률은 45.3%였다.

그럼 손익비를 어떻게 올릴 것인가. 두 가지 길이 있다. 손실을 줄이거나, 수익을 키우거나. 이번 편은 후자를 다룬다. 그리고 수익이 작았던 이유는 매수 조건 안에 이미 다 적혀 있었다.

시리즈 지도
1부 · 설계
  1. ① 113일이 남긴 숫자와 이 시리즈의 질문
  2. ② 매수 로직 해부 — 다섯 개의 관문 — 지금 글
  3. ③ 매도 로직 해부 — 손절·익절·트레일링의 3층 구조
  4. ④ 시장 국면을 셋으로 나눈다는 것
2부 · 운영
  1. ⑤ NAS에서 24시간 — 부팅 스크립트가 조용히 실패하던 이유
  2. ⑥ 워치독과 중복 프로세스
  3. ⑦ 웹에서 봇에게 명령 보내기
3부 · 부검
  1. ⑧ 6월 −53% ① 용의자 지우기
  2. ⑨ 6월 −53% ② 진범
  3. ⑩ 패치 이후 — 승률이 두 배 올랐는데 손익비는 반토막
4부 · 정리
  1. ⑪ 계측 없는 봇은 고칠 수 없다
  2. ⑫ 다음 버전 — 무엇을 버릴 것인가

처음엔 조건이 하나였다

초기 버전의 매수 조건은 단순했다. RSI가 과매도 구간에 들어오면 산다. 그게 전부였다.

결과는 예상대로였다. 하락 추세에 걸린 코인은 RSI가 30 밑으로 내려간 뒤에도 계속 떨어졌다. 25까지 가고, 20까지 가고, 15까지 갔다. 봇은 그 구간 내내 열심히 샀다. 과매도 신호는 계속 떠 있었으니까.

이때 깨달은 게 하나 있다. "싸다"는 신호와 "오를 것이다"라는 신호는 다르다. RSI는 앞의 것만 알려준다. 뒤의 것을 알려면 다른 걸 봐야 했다.

그래서 조건을 붙이기 시작했다. 하나씩, 사고가 날 때마다 하나씩. 그렇게 다섯 개가 됐다.

다섯 개의 관문

최종 구조는 AND 직렬이다. 하나라도 걸리면 주문은 나가지 않는다.

신호 발생 01 과매도 이력 지금이 아니라 직전 02 RSI 반등 중 3연속 상승 03 가격 반등 저점 대비 하한 이상 04 거래량 확인 평균 초과 05 과열 아님 저점 대비 상한 이내 최종 게이트 · 장기 MA 기울기 음수면 전부 통과해도 차단 다섯 관문을 모두 통과해도 마지막에 장기 이동평균 기울기가 꺾여 있으면 주문은 취소된다. 앞선 조건이 전부 단기 지표라, 큰 방향을 한 번 더 확인하는 장치로 뒀다.
Gate 01
지금 과매도인가가 아니라, 최근에 과매도였는가

이 전략의 핵심이다. 현재 RSI가 아니라 직전 몇 봉 안에 과매도 구간을 찍은 적이 있는지를 본다. 지금 과매도라는 건 아직 떨어지는 중이라는 뜻이기 때문이다.

Gate 02
RSI가 실제로 올라오고 있는가

최근 세 개 봉의 RSI가 연속으로 상승했는지 확인한다. 한 번 튀어오른 것과 방향이 바뀐 것을 구분하기 위한 조건이다. 동시에 RSI가 상한선을 넘지 않았는지도 함께 본다.

Gate 03
가격이 저점 대비 일정 폭 이상 올라왔는가

최근 몇 시간 안의 최저가를 기준으로, 거기서 하한선 이상 반등했는지 본다. 지표가 아니라 실제 가격으로 확인하는 조건이다. RSI는 올라오는데 가격은 안 오르는 경우가 있어서 넣었다.

Gate 04
거래량이 붙었는가

현재 봉의 거래량이 최근 평균을 일정 배수 이상 넘는지 확인한다. 거래량 없이 오르는 반등은 되돌아오는 경우가 많다는 판단이었다. 배수는 크게 잡지 않았다. 크게 잡으면 신호가 거의 안 뜬다.

Gate 05
이미 너무 오르지는 않았는가

Gate 03의 반대편이다. 저점 대비 상한선을 넘게 올랐으면 이미 늦은 것으로 보고 매수를 보류한다. 반등 초입에만 들어가겠다는 의도다. 그리고 이 조건이 이 글의 결론과 직결된다.

03번과 05번이 만드는 창문

여기가 이 전략의 급소다

Gate 03은 "저점 대비 얼마 이상 올랐을 것", Gate 05는 "저점 대비 얼마 이하로만 올랐을 것"이다. 둘을 합치면 진입 가능 구간이 좁은 띠로 잡힌다.

저점 아직 반등 아님 · 매수 보류 진입 가능 구간 이미 늦음 · 매수 보류 하한 (Gate 03) 상한 (Gate 05) 저점 대비 상승률 이만큼 초록 띠 안에 들어와야만 주문이 나간다. 하한은 1%도 안 되는 지점, 상한은 그 세 배 남짓한 지점이다. 그 사이의 좁은 구간에서만 매수가 성립한다.

논리 자체는 합리적으로 들린다. 덜 올랐으면 아직 반등이 아니고, 많이 올랐으면 이미 늦었다. 문제는 이 띠 안에서 사면 남은 상방이 얼마나 되느냐다.

반등이 시작된 지점에서 이미 어느 정도 오른 뒤에 들어간다. 그 상태에서 익절 목표까지 가려면 추가 상승이 필요한데, 목표 자체가 1%대에서 4% 사이로 잡혀 있다. 진입 시점에 이미 반등폭의 일부를 소모한 상태에서 출발하는 것이다.

숫자로 확인된 결과 4개월간 이긴 거래의 평균 수익은 +0.72%였다. 최대 수익도 +3.06%에 그쳤다. 반면 진 거래의 평균 손실은 −0.95%. 손절선은 진입가 기준으로 고정돼 있으니 손실은 온전히 다 맞고, 수익은 이미 깎인 상태에서 시작한다. 손익비 0.76은 매도 로직이 아니라 여기서 만들어졌다.

그리고 창을 더 좁혔다

6월 24일에 이 하한선을 올렸다. 기존보다 더 많이 반등해야 매수하도록 바꾼 것이다.

당시 의도는 명확했다. 가짜 반등에 속아서 들어가는 일이 잦다고 판단했고, 확인을 더 강하게 하면 승률이 오를 것이라 봤다. 실제로 조건을 강화하는 방향이었으니 틀린 접근은 아니었다.

그런데 이 변경은 진입 시점을 더 뒤로 미루는 것이기도 했다. 더 확실해질 때까지 기다린다는 건, 더 오른 뒤에 산다는 뜻이다. 남은 상방은 그만큼 더 줄어든다.

같은 날 있었던 다른 변경 6월 24일에는 감시 종목 두 개를 추가하고, 특정 코인의 급락 반등을 확인하는 실험적 게이트도 하나 넣었다. 이 게이트는 7월 8일에 폐기했다. 하루에 세 가지를 동시에 바꾼 셈인데, 이러면 나중에 무엇이 효과가 있었는지 분리할 수 없다. 한 번에 하나만 바꿨어야 했다.

만들어놓고 꺼버린 필터

매수 조건에는 원래 하나가 더 있었다. 장기 추세 필터다. 장기 이동평균 위에 있을 때만 매수하도록 하는 조건이었다.

켜봤더니 매수 신호가 거의 나오지 않았다. 며칠에 한 번 뜰까 말까 했다. 그래서 껐다.

지금 보면 이 판단이 문제였다. "신호가 안 뜬다"는 건 필터가 고장났다는 뜻일 수도 있지만, 지금이 살 때가 아니라는 뜻일 수도 있다. 나는 전자로 해석했다. 봇이 놀고 있는 게 답답했기 때문이다.

거래를 안 하는 것도 하나의 포지션이라는 걸 그때는 받아들이지 못했다. 자동매매 봇을 만들어놓고 봇이 아무것도 안 하고 있으면 뭔가 잘못된 것 같은 기분이 든다. 그래서 조건을 풀었다.

다만 완전히 버리지는 않았다. 필터 자체는 껐지만, 매수 직전 마지막 관문으로 장기 이동평균의 기울기를 확인하는 게이트를 남겨뒀다. 기울기가 음수면 앞의 조건을 전부 통과해도 매수하지 않는다. 위치가 아니라 방향만 보는 완화된 형태다.

거래를 많이 한 종목일수록 승률이 낮았다

4개월 데이터를 종목별로 나눠보면 눈에 띄는 패턴이 하나 있다.

60% 50% 40% 30% 20건 100건 거래 횟수 → SUI · 22건 · 59.1% NEAR · 42건 · 52.4% XRP · 77건 · 48.1% ETH · 91건 · 46.2% SOL · 58건 · 43.1% BTC · 64건 · 40.6% 거래가 많았던 종목일수록 승률이 낮다. 가장 적게 거래한 SUI가 59.1%로 가장 높고, 가장 많이 거래한 ETH가 46.2%로 낮은 축이다.

완벽한 역상관은 아니지만 방향은 뚜렷하다. 신호가 자주 뜬 종목일수록 그 신호가 부정확했다.

해석은 두 가지가 가능하다. 하나는 변동성이 큰 종목에서 조건이 더 자주 충족되지만 그만큼 되돌림도 잦다는 것. 다른 하나는 매수 조건 자체가 거래를 늘리는 방향으로 튜닝돼 있어서, 자주 걸리는 종목일수록 얕은 신호까지 잡아냈다는 것.

둘 다 같은 곳을 가리킨다. 문턱이 낮았다는 것이다.

이 그래프의 한계 표본 크기가 종목마다 다르다. SUI는 22건뿐이라 승률 59.1%가 우연일 여지가 크다. 반대로 ETH는 91건이라 46.2%가 비교적 안정적인 수치다. 즉 승률이 낮게 나온 종목의 숫자가 더 믿을 만하다. 좋은 쪽 숫자일수록 표본이 작다는 건 유쾌한 사실이 아니다.

조건을 늘리면 안전해질 거라는 착각

이 편을 쓰면서 가장 분명해진 게 있다. 조건을 늘리는 것과 전략이 좋아지는 것은 다른 문제다.

다섯 개의 관문은 각각 실제 사고에서 나왔다. 하락하는 코인을 계속 받아낸 경험에서 Gate 01이 나왔고, RSI만 튀고 가격은 안 움직인 경험에서 Gate 03이 나왔다. 하나하나는 다 근거가 있었다.

그런데 각 조건이 무엇을 막는지만 생각했고, 무엇을 함께 잃는지는 계산하지 않았다. 필터는 손실만 걸러내지 않는다. 이익도 같이 걸러낸다. 다섯 개를 직렬로 걸면 다섯 번 걸러진다.

남은 것은 안전하지만 먹을 게 없는 자리였다.

돌리기 전에 계산할 수 있었던 것

진입 창의 상한이 저점 대비 얼마이고, 익절 목표가 얼마인지는 설정 파일에 다 적혀 있었다. 이 둘을 나란히 놓고 보기만 했어도 "목표 수익이 진입 시점에 이미 절반쯤 소진된다"는 걸 알 수 있었다.

진입 시점 = 저점 + a (a는 상한 이내) 익절 목표 = 진입가 + b 실제로 필요한 총 상승폭 = a + b 그런데 반등 하나에서 a + b 만큼 나오는가?

이 계산을 4개월이 지난 뒤에야 했다. 백테스트는 돌렸지만 벤치마크 대비 성과만 봤고, 전략 구조 자체가 산술적으로 성립하는지는 검토하지 않았다.

다음 버전이라면

지금 다시 만든다면 세 가지를 바꾸겠다.

  • 조건 개수를 줄인다. 다섯 개 중 실제로 기여한 게 뭔지 하나씩 꺼보면서 측정한다. 지금은 다섯 개가 한 덩어리라 개별 기여도를 모른다.
  • 진입 창의 상한을 없애거나 크게 넓힌다. "이미 늦었다"는 판단이 실제로 손실을 막았는지 데이터로 확인한 적이 없다. 막연한 불안으로 넣은 조건일 가능성이 높다.
  • 조건을 추가할 때마다 진입 빈도와 평균 수익률의 변화를 기록한다. 조건 하나를 추가하고 나서 무엇이 좋아졌고 무엇이 나빠졌는지를 남기지 않으면, 나중에 되돌릴 근거가 없다.

세 번째가 가장 중요하다. 이 봇은 조건이 하나씩 늘어나는 동안 그 변경이 성과에 어떤 영향을 줬는지 아무도 기록하지 않았다. 나 말고는 아무도 없는데도.

다음 편

③편에서는 매도 로직을 뜯는다. 수수료를 반영한 실질 수익률 계산식, 손절선을 계단식으로 올리는 3층 구조, 그리고 그 3층 중 3단이 4개월간 단 한 번만 발동한 이유에 대해. 매수가 왜 어려웠는지를 봤으니, 이제 매도가 왜 이상했는지를 볼 차례다.

개인 운영 기록이며 투자 권유가 아닙니다. 자동매매는 원금 손실 위험이 있고, 이 봇은 실제로 손실을 냈습니다. 전략 파라미터 일부는 구체적 수치 대신 상대적 표현으로 적었습니다.

거래소 API 키를 코드나 설정 파일에 평문으로 저장하지 마세요. ⑤편에서 함께 다룹니다.

추천0 비추천0

댓글목록

등록된 댓글이 없습니다.

Total 2건 1 페이지

검색