연쇄 손절 뒤에도 세 번 더 샀다. 그래서 진입에 가드를 걸었다
게시물 옵션
본문
9월 28일 SOL, ETH, NEAR가 연달아 손절된 뒤에도 봇은 SUI와 NEAR를 세 번 더 샀고 셋 다 손절로 끝났다. 7월 이후 230건에 손절이 쌓이면 신규 매수를 멈추는 가드를 사후에 만들어 소급 적용하자 손익 합계가 -4.99%p에서 +2.75%p로 바뀌었다. 다만 7~8월 두 달만 보면 효과가 약했다.
지난 편은 손절을 없애는 방식으로는 거래를 줄일 수 없다는 결론이었다. 그 글의 끝에 한 줄을 남겼다. 손절은 두고 들어가는 횟수를 줄이는 방법, 곧 진입 게이트와 재진입 제한은 따로 검증해야 한다고. 이 글은 업비트에서 도는 역추세 봇에 그 검증을 해본 기록이다.
1. 출발점: 연쇄 손절 뒤에도 세 번 더 샀다
9월 25일에서 9월 28일까지 손절이 이어져 봇이 정지됐다. 28일 10:49~11:00에는 SOL, ETH, NEAR가 차례로 손절됐다. 그런데 봇은 그 뒤 12:00 SUI, 13:18 SUI, 13:29 NEAR를 다시 샀고, 세 건 모두 손절로 끝났다. 아래 표의 오른쪽 열은 나중에 만든 가드를 그날 기록에 대입한 판정이다.
| 시각 | 종목 | 실제 | 가드가 있었다면 |
|---|---|---|---|
| 08:15 | SUI | 매수 신호 | 통과 |
| 09:16 | NEAR | 매수 신호 | 통과 |
| 10:49~11:00 | SOL, ETH, NEAR | 연쇄 손절 | - |
| 12:00 | SUI | 매수 후 손절 | 차단 (당일 손절 누적 4회) |
| 13:18 | SUI | 매수 후 손절 | 차단 (당일 손절 누적 5회, 같은 종목 손절 직후) |
| 13:29 | NEAR | 매수 후 손절 | 차단 (당일 손절 누적 5회, 같은 종목 손절 직후) |
오전 두 건은 가드가 있었어도 통과다. 가드는 연쇄가 시작된 뒤의 매수만 겨냥한다.
2. 확인 방법: 230건에 가드를 소급 적용했다
7월 1일 이후 거래를 코인별로 매수와 매도를 순서대로 짝지어 230건을 만들었다. 이 230건의 승률은 64.8%, 본전이 되는 승률(손익분기)은 65.8%였고 손익 합계는 -4.99%p다. 승률이 본전 승률 이상이어야 합계가 플러스가 되는데, 이 봇은 그 선에 조금 못 미쳐 있었다.
가드는 두 가지다. 하나는 재진입 금지로, 어떤 코인을 손절하면 그 코인은 일정 시간 다시 사지 않는다. 다른 하나는 서킷브레이커로, 그날 전 코인 합산 손절이 일정 횟수에 이르면 자정까지 신규 매수를 멈춘다. 손절은 매도 사유가 손절로 시작하는 거래만 센다. 트레일링과 동적 손절은 세지 않는다. 보유 중인 포지션의 청산 로직은 건드리지 않고, 매수 직전에만 얹는다. 기준값은 공개하지 않는다. 계산은 실제 봇에 들어간 것과 같은 SQL로 리플레이했다.
3. 결과: 30건이 걸렸고 합계가 뒤집혔다
| 가드 | 걸린 거래 |
|---|---|
| 재진입 금지 | 14건 |
| 서킷브레이커 | 21건 |
| 두 가드에 동시에 걸림 | 5건 |
| 합집합 | 30건 (전체의 13.0%) |
걸린 30건 가운데 손실 거래의 합이 -21.40%p, 수익 거래의 합이 +13.66%p였다. 막아서 아낀 손실에서 놓친 수익을 뺀 순효과가 +7.74%p다. 그래서 230건의 합계가 -4.99%p에서 +2.75%p가 된다. 좋은 거래도 같이 막는다는 비용이 이 숫자에 이미 들어 있다.
같은 230건에 같은 가드를 적용한 소급 계산. 위쪽 세 막대는 전체 기간, 아래쪽 두 막대는 기간을 둘로 나눈 순효과다.
4. 사후 설계의 한계
이 가드는 9월 28일의 연쇄 손절을 겪은 뒤에 만든 규칙이다. 사건을 먼저 보고, 그 사건을 막도록 설계했다. 230건 재계산에서 나온 순효과 +7.74%p는 그 규칙을 과거 기록에 되돌려 적용한 값이다. 규칙이 만들어진 뒤에 기록을 다시 읽은 결과일 뿐, 앞으로의 성과를 뜻하지 않는다.
검증 구간(09-01~09-28)에는 가드를 만들게 한 바로 그날이 들어 있다. 그래서 검증 구간의 +6.67%p는 과대평가됐을 가능성이 크다. 그날을 뺀 값은 계산하지 않았다.
5. 7~8월에는 약했다
전체 합계만 보면 깔끔하지만 기간을 둘로 나누면 그림이 달라진다. 7~8월 두 달을 학습 구간, 9월을 검증 구간으로 놓고 가드만 따로 계산했다.
| 구간 | 순효과 | 가드 적용 후 승률 | 손익분기 승률 |
|---|---|---|---|
| 학습 07-01~08-31 | +1.06%p | 67.2% | 68.1% |
| 검증 09-01~09-28 | +6.67%p | 65.4% | 62.8% |
학습 구간에서는 가드를 적용한 뒤에도 승률이 본전 승률에 못 미쳤다. 순효과는 플러스지만 약하다. 검증 구간에서는 본전 승률을 넘었다. 효과의 대부분이 최근 한 달에서 나왔다는 뜻이다. 이 구간의 해석은 바로 앞 소제목에 적은 한계를 전제로 읽어야 한다.
전체 숫자는 +7.74%p지만, 7~8월만 보면 +1.06%p다. 이 가드가 모든 시기에 통하는 장치라는 근거는 아직 없다.
이 표의 수치는 처음 낸 값을 고친 것이다. 처음 보고에는 가드와 별개인 시간 제한 청산 규칙의 효과가 섞여 있었고, 가드만 분리해 다시 계산했다.
6. 기존 연속손실 차단이 못 막은 이유
봇에는 원래 연속 손실을 막는 장치가 있었다. 9월 28일에 그게 왜 조용했는지 코드와 기록을 다시 열어봤다.
- 기존 차단은 코인별 카운터였다. 다른 코인의 연쇄 손절에는 반응하지 않았고, 해당 코인에서 본절로 소폭 이긴 한 번에도 카운터가 0으로 돌아갔다.
- 9월 28일 실측으로 전체 연속 손실은 6회였는데 코인별 최대 연속은 2회였다. 전체 카운터는 증감만 되고 어떤 매수 판단에서도 참조되지 않고 있었다.
- 일일 손실 한도는 금액 기준이라, 거래당 약 18,000원 규모에서는 사실상 걸릴 수 없는 크기였다. 9월 28일 12시 누적 손실은 약 1,100원이었다.
- 봇을 재시작하면 연속 손실과 일일 손실 카운터가 0으로 리셋됐다. 가드는 메모리가 아니라 매번 거래 기록에서 다시 계산한다.
정리하면 기존 장치는 코인 하나 안에서만 세고, 재시작하면 잊고, 금액 한도는 너무 커서 닿지 않았다. 여섯 종목이 같은 장에서 한꺼번에 흔들리는 날을 막는 장치는 사실상 없었던 셈이다.
7. 바꾼 것과 바꾸지 않은 것
바꾼 것은 신규 매수 직전의 관문 하나다. 보유 포지션의 청산과 리스크 로직은 그대로 두었다. 봇은 9월 28일 15:41에 재시작했고, 그 시점에 당일 손절이 이미 7회라 서킷브레이커가 자정까지 신규 매수를 막았다. 자정이 지나면 자동으로 재개된다. 가드가 막을 때마다 코인과 가드별로 15분에 한 건씩 기록을 남기고, 관리자 대시보드에는 가드 상태 패널을 붙였다.
바꾸지 않은 것도 있다. 학습 구간 효과가 약했기 때문에 다른 후보는 보류했다. 시간 제한 청산은 학습과 검증을 나눠 다시 확인한 뒤 도입 여부를 정한다. BTC 1시간 모멘텀 필터는 학습 구간 효과가 미미해서, 실제로 막지 않고 기록만 남기는 단계부터 시작한다.
아직 모르는 것
- 가드 도입 후 실제로 막은 진입 건수와 그 기간 손익은 기록에 아직 없다.
- 걸린 30건이 학습 구간과 검증 구간에 각각 몇 건씩인지는 나누어 집계하지 않았다.
- 표본은 감시 코인 6종의 단일 구간이다. 이 계산은 걸린 거래를 기록에서 빼는 방식이라, 그 자리에 다른 매수가 들어갔을 경우는 반영하지 않았다.
- 가드 판정 로직이 봇, 대시보드, 분석 스크립트 세 곳에 같은 SQL로 있다. 손절의 정의나 날짜 기준을 바꾸면 세 곳을 함께 바꿔야 숫자가 맞는다.
다음에 확인할 것은 두 가지다. 관찰 기간이 끝났을 때 실제로 막힌 거래의 사후 손익이 이 소급 계산과 같은 방향인지, 그리고 시간 제한 청산이 학습과 검증을 나눠도 남는지. 적용 후 실측은 2~4주 관찰이 끝나면 다음 편에서 공개한다.
함께 읽기
- 지난 편: 손절을 없애봤다. 확정 -1.45%가 -30%가 됐다
- 관련 기술 노트: 드로다운(Drawdown) 관리: 최악의 상황에 대비하기