shud.log
바이브코딩 기록

업비트 현물봇 만들기 — 약세장 백테스팅부터 맥미니 배포까지

2026-04-16업비트현물봇백테스팅핑퐁봇추세추종크립토봇

나도봇이 선물 마켓메이킹을 하고 있는 동안, 업비트 현물 계좌는 그냥 놀고 있었습니다.

그래서 이런 생각이 들었습니다.

"업비트 현물에도 핑퐁봇을 붙이면 어떨까?"


먼저 백테스팅부터

코드부터 짜기 전에 전략이 실제로 통하는지 확인하고 싶었습니다. 업비트 API로 BTC 일봉 5년치를 받아서 4가지 전략을 비교했습니다.

  • 바이앤홀드: 그냥 사서 들고 있기
  • 핑퐁 단독: 매일 시가 기준 ±1.5% 갭에서 사고팔기
  • 추세 추종: MA20이 MA60 위로 올라오면 사고, 아래로 내려가면 팔기
  • 하이브리드: 추세 올라갈 땐 핑퐁, 추세 꺾이면 전량 매도 후 대기

5년 전체 결과는 바이앤홀드가 압도적이었습니다.

| 전략 | 수익률 | |------|--------| | 바이앤홀드 | +641.9% | | 추세 추종 | +205.5% | | 핑퐁 단독 | +128.8% | | 하이브리드 | +127.7% |

BTC가 5년간 7.4배 오른 장이니까 당연한 결과입니다. 그냥 들고 있는 게 최고입니다.


약세장만 따로 떼어봤습니다

문제는 약세장입니다.

BTC가 2021년 11월 고점(약 7200만원)에서 2022년 12월까지 -70.9%를 찍었습니다. 이 구간만 잘라서 다시 돌렸습니다.

| 전략 | 최종 자산 | 수익률 | |------|----------|--------| | 바이앤홀드 | 290,727원 | -70.9% | | 핑퐁 단독 | 525,757원 | -47.4% | | 추세 추종 | 719,684원 | -28.0% | | 하이브리드 | 892,574원 | -10.7% ★ |

100만원이 29만원 되는 걸, 하이브리드는 89만원으로 막았습니다.

바이앤홀드 대비 **+207%**입니다.

하이브리드가 잘 버티는 이유는 단순합니다. MA20이 MA60 아래로 2% 이상 내려가는 순간 전량 매도하고 현금으로 앉아있습니다. 그래서 하락 구간의 손실을 상당 부분 피합니다.


봇 구조

전략을 코드로 옮겼습니다.

추세 판단 (1시간마다 갱신)

def get_trend():
    closes = 최근_70일_일봉_종가()
    ma20 = 평균(closes[-20:])
    ma60 = 평균(closes[-60:])

    if ma20 > ma60:
        return "up"
    elif ma20 < ma60 * 0.98:   # 2% 이상 아래
        return "down"
    else:
        return "neutral"

추세별 행동

  • up: 갭 2.25%, 매수비중 36%로 핑퐁
  • neutral: 갭 1.5%, 매수비중 30%로 핑퐁
  • down: 미체결 주문 전량 취소 + BTC 시장가 매도

체결 즉시 반대 주문 (60초 사이클)

처음엔 30분 사이클로 만들었는데, 핑퐁이 제대로 안 됩니다. 매수가 체결돼도 30분 후에야 매도 주문이 들어가니까요.

60초로 줄이고 체결 감지 즉시 반대 주문을 넣는 구조로 바꿨습니다.

매수 체결 감지 → 즉시 매도 지정가 주문
매도 체결 감지 → 즉시 매수 지정가 주문

업비트 API 삽질

업비트는 API 키 발급 시 IP 화이트리스트가 필수입니다.

맥미니 공인 IP를 넣으려고 했는데, 집 인터넷이 유동 IP라 오늘과 내일 주소가 다를 수 있습니다. 처음엔 Tailscale로 해결하려 했는데 Tailscale은 사설 IP(100.x.x.x)라 등록이 안 됩니다.

현실적인 해결책은 현재 공인 IP를 넣고, 바뀌면 그때 업데이트하는 겁니다. 가정용 인터넷은 공유기를 재시작하지 않으면 IP가 몇 주는 유지됩니다.

# 맥미니 공인 IP 확인
curl -s https://api.ipify.org

맥미니 배포

나도봇이랑 같은 방식으로 LaunchAgent에 등록했습니다.

# 배포
scp upbit_bot.py shud@192.168.45.7:/Users/shud/upbit_bot/

환경변수로 API 키를 관리합니다. plist에 직접 넣는 방식입니다.


지금 상태

  • 추세: UP (MA20 > MA60)
  • 매수 지정가: 107,403,000원 대기 중
  • BTC가 저가에서 체결되면 즉시 112,347,000원에 매도 주문

맥미니 절전도 이 기회에 비활성화했습니다. pmset으로 sleep을 전부 0으로 설정했습니다.

봇이 얼마나 벌 수 있을지는 2주 뒤에 결산해보겠습니다.

← 목록으로