shud.log
바이브코딩 기록

킴프봇 포지션 22개가 전부 묶였습니다 — 델타뉴트럴의 함정

2026-04-11킴프봇펀딩비차익델타뉴트럴HyperliquidBybit

킴프봇을 처음 만들 때는 이렇게 될 줄 몰랐습니다.

전략 자체는 단순합니다. Hyperliquid에서 롱을 잡고 Bybit에서 같은 코인 숏을 잡습니다. 가격이 올라도, 내려도 양쪽이 상쇄되니까 가격 위험이 없습니다. 그 상태로 펀딩비 차이가 쌓이면 그게 수익입니다.

이걸 봇으로 자동화해서 24시간 돌린 결과가 포지션 22개, 전부 묶힘이었습니다.


어떻게 22개가 됐나

봇 로직은 간단합니다. 펀딩비 스프레드가 0.020%/hr 이상인 코인을 찾으면 진입합니다. 진입 후 48시간이 지나거나 스프레드가 역전되면 청산합니다.

문제는 청산 조건이었습니다.

진입은 잘 됐습니다. 스프레드 0.020% 이상인 코인을 착착 잡아들였습니다. SNX, AXS, MANA, DYDX... 2포지션 한도로 운영하다가, 코드를 수정하면서 한도가 풀린 적이 있었습니다. 그 사이에 진입이 몇 개 더 쌓였습니다.

청산은 잘 안 됐습니다.

Bybit API 서명 문제가 있었습니다. GET 요청 파라미터를 알파벳 순으로 정렬해야 하는데, 청산 요청 쪽에 버그가 있었습니다. 포지션은 들어갔는데 나오질 못했습니다.

봇이 멈췄다 재시작되는 사이에도 포지션은 쌓였습니다. state.json을 리셋하면 봇 입장에서는 "포지션 없음"이 됩니다. 근데 실제 거래소에는 포지션이 남아있습니다. 이런 고아 포지션이 여러 개 생겼습니다.

결과적으로 HL 11개 + Bybit 11개, 총 22개 포지션이 동시에 존재하게 됐습니다.


왜 청산이 안 됐나

포지션이 22개가 됐다고 해서 무조건 손실인 건 아닙니다. 델타뉴트럴이니까 가격이 오르내려도 양쪽이 상쇄됩니다. 문제는 세 가지였습니다.

첫째, 증거금이 분산됐습니다.

22개 포지션에 증거금이 나눠서 들어갔습니다. 전체 잔고의 상당 부분이 묶였습니다. 새 기회가 와도 진입할 자금이 없습니다.

둘째, 청산 비용이 문제입니다.

22개를 청산하면 수수료가 꽤 됩니다. HL은 maker 수수료가 리베이트라 괜찮지만, Bybit taker는 0.055%입니다. 양쪽 합치면 포지션당 왕복 0.16% 수준입니다. 22개면 무시 못할 금액입니다.

셋째, 일부 코인은 스프레드가 역전됐습니다.

진입할 때 HL 롱 / Bybit 숏이 유리한 상황이었습니다. 근데 시장이 바뀌면서 반대 방향 펀딩비가 유리해진 코인들이 생겼습니다. 이런 건 빨리 청산해야 하는데 청산 로직이 막혀있으니까 손실이 쌓이고 있었습니다.


왜 이렇게 됐는지 솔직하게

전략이 문제가 아니었습니다. 실행이 문제였습니다.

봇을 만들면서 진입 로직은 꼼꼼하게 테스트했습니다. 스프레드 계산, API 호출, 포지션 사이징 다 잘 됐습니다. 근데 청산 로직은 덜 테스트했습니다. 진입보다 청산이 덜 중요하다고 생각했기 때문입니다.

크게 잘못된 생각이었습니다.

진입은 선택사항입니다. 조건이 맞지 않으면 안 들어가면 됩니다. 청산은 선택사항이 아닙니다. 포지션이 생기면 언젠가는 반드시 나와야 합니다. 청산 로직이 망가지면 들어간 모든 포지션이 묶입니다.

그리고 state.json 관리도 문제였습니다. 봇 상태와 실제 거래소 상태가 따로 놀면 안 됩니다. 봇이 시작할 때 항상 실거래소 포지션을 먼저 확인하고 state를 맞춰야 하는데, 그 동기화 로직이 없었습니다.


지금 상황

22개 포지션 중 일부는 펀딩비를 계속 받고 있습니다. 스프레드가 역전된 건 손실이 쌓이고 있습니다.

수동으로 하나씩 청산하고 있습니다. HL 포지션 닫고, Bybit 포지션 닫고, 확인하고, 다음 것. 시간이 걸립니다.

봇 코드도 고쳤습니다. Bybit API 서명 버그를 수정했습니다. 봇 시작 시 실제 거래소 포지션을 먼저 조회해서 state.json과 비교하는 교차 검증 로직을 추가했습니다. 고아 포지션이 생기면 즉시 감지해서 청산합니다.

그리고 MAX_POSITIONS를 2로 제한하고, 이번에는 코드로 막는 게 아니라 테스트를 거쳐서 확인했습니다.


결론

$700 정도의 자금이 22개 포지션에 분산됐습니다. 지금 청산 중이고, 다 정리하면 얼마가 남을지는 모릅니다. 몇 달치 수익이 날아갈 수도 있습니다.

그래도 배운 게 있습니다.

  • 청산 로직은 진입 로직만큼, 아니 그 이상으로 중요합니다
  • state.json은 항상 실거래소와 동기화해야 합니다
  • 포지션 한도는 코드로 강제해야 합니다, 기억으로 관리하면 안 됩니다

다음 봇은 청산 로직 먼저 만들겠습니다.

← 목록으로