④ 업비트 자동매매 봇 만들기 — 국면을 셋으로 나눴더니, 가장 조심스러운 국면이 가장 많이 잃었다
게시물 옵션
본문
국면을 셋으로 나눴다고 썼을 때, 그 뒤에는 숫자가 있어야 했다. 하락장·중립·상승장이 정말 서로 다르게 움직였는지, 그 구분이 실제로 손실을 줄였는지. 넉 달 치 매매 기록을 다시 열어 국면별로 쪼개봤다.
- 국면 수
- 3
- 판정 지표
- MA 기울기
- 조정 파라미터
- 5개
- 알려진 결함
- 판정 지연
③편에서 손절선이 계단식으로 세 번 올라간다고 썼다. 그런데 그 계단의 폭 자체가 고정값이 아니다. 하락장인지 상승장인지에 따라 매번 다른 폭으로 시작한다. 이번 편은 그 폭을 정하는 기준, 국면 분류부터 들어간다.
- ① 113일이 남긴 숫자와 이 시리즈의 질문
- ② 매수 로직 해부 — 다섯 개의 관문
- ③ 매도 로직 해부 — 손절·익절·트레일링의 3층 구조
- ④ 시장 국면을 셋으로 나눈다는 것 — 지금 글
- ⑤ NAS에서 24시간 — 부팅 스크립트가 조용히 실패하던 이유
- ⑥ 워치독과 중복 프로세스
- ⑦ 웹에서 봇에게 명령 보내기
- ⑧ 6월 −53% ① 용의자 지우기
- ⑨ 6월 −53% ② 진범
- ⑩ 패치 이후 — 승률이 두 배 올랐는데 손익비는 반토막
- ⑪ 계측 없는 봇은 고칠 수 없다
- ⑫ 다음 버전 — 무엇을 버릴 것인가
국면을 나누는 기준 — 이동평균의 기울기
같은 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건(매도 기준)을 분류한 결과다.
| 국면 | 매도 건수 | 승률 | 평균 수익 | 평균 손실 |
|---|---|---|---|---|
| 하락장 | 77 | 20.8% | +0.77% | −0.88% |
| 중립 | 276 | 50.7% | +0.70% | −1.01% |
| 상승장 | 22 | 72.7% | +0.78% | −0.44% |
가장 방어적으로 세팅해 둔 하락장이 승률 20.8%로 세 국면 중 가장 낮다. 가장 공격적으로 세팅해 둔 상승장이 승률 72.7%에 평균 손실도 −0.44%로 세 국면 중 제일 얕다. 기대값으로 계산하면 하락장은 건당 약 −0.53%p, 중립은 −0.14%p로 둘 다 마이너스인 반면 상승장만 +0.45%p로 플러스다. 다만 상승장 표본은 22건뿐이라 이 우위를 일반화하기는 이르다 — 넉 달 중 상승장으로 판정된 구간 자체가 짧았다는 뜻이기도 하다. 반대로 중립이 전체 매도의 74%(276/375)를 차지한다는 점도 눈에 띈다. 이 봇이 대부분의 시간을 "국면 불명확" 상태에서 매매했다는 뜻이고, 그 구간의 기대값이 마이너스라는 게 지금 이 숫자가 말해주는 전부다.
다섯 개 손잡이를 국면마다 다르게 돌린 게 결과를 바꾸기는 했다. 다만 의도한 방향과는 다르게 — 가장 조심스러웠던 국면이 가장 성적이 나빴고, 가장 공격적이었던 국면이 가장 성적이 좋았다. 이 역전이 표본이 작아서 생긴 우연인지, 아니면 앞서 짚은 "판정 지연" 결함 — 하락장 태그가 붙을 때는 이미 최악의 구간을 지나 반등이 시작된 뒤라는 — 이 만들어낸 구조적인 결과인지는 이 글만으로는 가르기 어렵다. ⑧~⑩편에서 다룰 6월 폭락 구간을 국면별로 다시 열어보면 실마리가 나올 것이다.
다음 편
⑤편에서는 전략 코드를 떠나 이 봇이 실제로 돌아가는 자리, NAS로 넘어간다. 24시간 돌아가야 하는 프로세스인데 부팅할 때마다 조용히 실패하던 스크립트가 있었다. 로그에는 에러가 안 남는데, 봇은 켜지지 않았다.
개인 운영 기록이며 투자 권유가 아닙니다. 자동매매는 원금 손실 위험이 있고, 이 봇은 실제로 손실을 냈습니다. 전략 파라미터 일부는 구체적 수치 대신 상대적 표현으로 적었습니다.
거래소 API 키를 코드나 설정 파일에 평문으로 저장하지 마세요. ⑤편에서 함께 다룹니다.
댓글목록
등록된 댓글이 없습니다.