Fri 08-07 · 오늘 6건 · 통산 1,388호
falette
스크랩 쪽지 로그인
업비트 자동매매 봇 만들기
 

④ 업비트 자동매매 봇 만들기 — 국면을 셋으로 나눴더니, 가장 조심스러운 국면이 가장 많이 잃었다

국면을 셋으로 나눴다고 썼을 때, 그 뒤에는 숫자가 있어야 했다. 하락장·중립·상승장이 정말 서로 다르게 움직였는지, 그 구분이 실제로 손실을 줄였는지. 넉 달 치 매매 기록을 다시 열어 국면별로 쪼개봤다.

국면 수
3
판정 지표
MA 기울기
조정 파라미터
5개
알려진 결함
판정 지연

③편에서 손절선이 계단식으로 세 번 올라간다고 썼다. 그런데 그 계단의 폭 자체가 고정값이 아니다. 하락장인지 상승장인지에 따라 매번 다른 폭으로 시작한다. 이번 편은 그 폭을 정하는 기준, 국면 분류부터 들어간다.

시리즈 지도
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가 내려오면 눌림목이지만, 하락장에서 내려오면 그냥 더 떨어지는 중일 때가 많다. 같은 숫자에 같은 대응을 하면 안 된다는 판단으로, 장기 이동평균의 기울기를 봐서 시장을 하락·중립·상승 세 국면으로 자동 판정하도록 만들었다.

기울기가 일정 폭 이상 내려가는 구간은 하락장, 일정 폭 이상 올라가는 구간은 상승장, 그 사이는 중립으로 둔다. 봉마다 다시 계산하니 국면은 고정된 게 아니라 매 순간 새로 판정된다.

국면마다 다섯 개 손잡이가 움직인다

파라미터하락장중립상승장
매수 문턱가장 엄격기본가장 느슨
재진입 대기가장 김중간가장 짧음
손절폭좁게좁게거의 두 배
익절 목표낮게낮게세 배 가까이
트레일링 여유타이트중간넉넉

의도는 단순했다. 하락장에선 짧게 먹고 빨리 빠지고, 상승장에선 길게 들고 간다. ③편에서 본 손절선 3층 구조도 사실 이 표 위에 얹혀 있다 — 상승장에서 손절폭이 두 배 넓다는 건, 3단(수익 보호)까지 올라갈 여지도 상승장에서 훨씬 크게 열려 있다는 뜻이다. 그런데 3단은 4개월간 단 한 번 발동했다. 그 한 번이 어느 국면에서 나왔는지는 뒤에서 다시 짚는다.

사진: Arturo Añez (Unsplash). 국면은 라벨 하나가 아니라 다섯 개의 숫자를 동시에 바꾸는 스위치다. 스위치가 잘못 켜지면 다섯 개가 한꺼번에 틀린 방향으로 움직인다.

구조적 한계 — 판정은 항상 늦다

이동평균의 기울기로 국면을 판정하는 방식에는 처음부터 알고 있던 약점이 있다. 이동평균이 방향을 바꾸려면, 그 전에 가격이 이미 상당히 움직인 뒤여야 한다. 즉 국면 판정은 구조적으로 늦게 온다.

가장 크게 물리는 자리에서 가장 공격적인 설정 하락이 막 시작되는 구간에서는 이동평균이 아직 꺾이지 않은 채 상승장 국면이 유지된다. 손절폭이 가장 넓고, 매수 문턱이 가장 느슨하고, 재진입 대기가 가장 짧은 설정이 하필 그 구간에 걸려 있다. 국면 전환이 실제 하락보다 늦게 도착하는 동안, 봇은 정반대로 세팅된 채 그 구간을 그대로 통과한다.

그래서 이 구분은 실제 승부를 바꿨나

설계 의도와 구조적 한계는 코드만 봐도 알 수 있다. 진짜 질문은 따로 있다. 넉 달간 이 국면 스위치가 실제로 얼마나 자주 바뀌었고, 국면별로 진짜 승률과 수익이 얼마나 달랐는가.

매도 사유(reason) 로그에는 2026-06-01부터 국면 태그가 실제로 찍혀 있다 — "손절(neutral)", "트레일링(bear)" 같은 식이다. 다만 이 태그는 손절·익절·트레일링 세 가지 사유에만 붙고, 그 이전 거래와 동적손절(본절·수익보호) 계열 사유에는 없다. 그 공백은 실제 매도 시각의 캔들로 봇과 동일한 수식(SMA50, 10봉 기울기, 임계값 0.3%)을 다시 돌려 채웠다. 태그가 남아 있는 161건으로 역산 결과를 대조하니 92.5%(149/161)가 일치했다 — 나머지는 대부분 기울기가 임계값 근처(±0.05%p 이내)에 걸린 경계 사례였다. 아래 표는 이 방식으로 국면 전체 375건(매도 기준)을 분류한 결과다.

국면매도 건수승률평균 수익평균 손실
하락장7720.8%+0.77%−0.88%
중립27650.7%+0.70%−1.01%
상승장2272.7%+0.78%−0.44%

가장 방어적으로 세팅해 둔 하락장이 승률 20.8%로 세 국면 중 가장 낮다. 가장 공격적으로 세팅해 둔 상승장이 승률 72.7%에 평균 손실도 −0.44%로 세 국면 중 제일 얕다. 기대값으로 계산하면 하락장은 건당 약 −0.53%p, 중립은 −0.14%p로 둘 다 마이너스인 반면 상승장만 +0.45%p로 플러스다. 다만 상승장 표본은 22건뿐이라 이 우위를 일반화하기는 이르다 — 넉 달 중 상승장으로 판정된 구간 자체가 짧았다는 뜻이기도 하다. 반대로 중립이 전체 매도의 74%(276/375)를 차지한다는 점도 눈에 띈다. 이 봇이 대부분의 시간을 "국면 불명확" 상태에서 매매했다는 뜻이고, 그 구간의 기대값이 마이너스라는 게 지금 이 숫자가 말해주는 전부다.

3단(수익 보호)의 그 한 건 ③편에서 확인한 유일한 3단 발동 사례 — 5월 28일 08:30 KRW-BTC 매수, 5월 31일 00:42 "동적 손절 수익보호 −0.02%"로 매도 — 를 같은 방식으로 역산하면 기울기 +0.06%p, 중립 국면이었다. 앞서 세운 가설("상승장의 넓은 손절폭이 3단까지 여지를 열어줬을 것")은 틀렸다. 실제로는 국면 임계값(±0.3%p) 근처에도 못 미치는 완전한 횡보 구간에서, 중립 설정의 트레일링 여유(0.8%p)가 좁게 걸려 본절 근처에서 빠르게 청산된 사례였다. 이 사유는 reason 로그에 국면 태그가 남지 않는 유형이라 역산에만 의존한 결과다.

다섯 개 손잡이를 국면마다 다르게 돌린 게 결과를 바꾸기는 했다. 다만 의도한 방향과는 다르게 — 가장 조심스러웠던 국면이 가장 성적이 나빴고, 가장 공격적이었던 국면이 가장 성적이 좋았다. 이 역전이 표본이 작아서 생긴 우연인지, 아니면 앞서 짚은 "판정 지연" 결함 — 하락장 태그가 붙을 때는 이미 최악의 구간을 지나 반등이 시작된 뒤라는 — 이 만들어낸 구조적인 결과인지는 이 글만으로는 가르기 어렵다. ⑧~⑩편에서 다룰 6월 폭락 구간을 국면별로 다시 열어보면 실마리가 나올 것이다.

다음 편

⑤편에서는 전략 코드를 떠나 이 봇이 실제로 돌아가는 자리, NAS로 넘어간다. 24시간 돌아가야 하는 프로세스인데 부팅할 때마다 조용히 실패하던 스크립트가 있었다. 로그에는 에러가 안 남는데, 봇은 켜지지 않았다.

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

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

댓글 0
첫 번째 댓글을 남겨보세요
댓글 작성
LOGIN