자금관리8분 분량

곽철용 배팅법을 바이낸스 선물 봇에 붙여봤다 — 배팅 한도는 청산가로 돌아온다

지면 두 배로 거는 마틴게일을 바이낸스 선물 봇으로 옮겼습니다. 카지노보다 조건이 나은 건 맞는데, 배팅 한도가 사라진 게 아니라 청산가로 형태만 바뀌었다는 걸 코드로 확인한 기록입니다.

곽철용이 화투판에서 하던 그 배팅법입니다. 지면 두 배, 또 지면 또 두 배. 언젠가 한 번만 이기면 그동안 잃은 게 전부 회수되고 처음 걸었던 만큼이 남습니다. 산수만 보면 틀린 데가 한 군데도 없어요. 그래서 카지노는 이 배팅법을 금지하는 대신 테이블마다 최대 한도를 걸어둡니다. 그런데 코인 선물에는 그 한도가 없습니다. 그럼 코인에서는 되는 거 아닌가 — 이번 영상의 질문은 딱 이거였고, 뜬구름 잡는 이론으로 답하는 대신 바이낸스 API로 봇을 짜서 직접 돌렸습니다.

마틴게일은 전략이 아니라 배팅 규칙이다

  1. 진입한다. 방향은 아무래도 상관없습니다 — 마틴게일에는 예측이라는 게 아예 없습니다. 지표도, 진입 근거도 필요 없어요.
  2. 지면 다음 배팅 금액을 두 배로 올린다. 이기면 처음 금액으로 되돌린다.
  3. 한 번만 이기면 그때까지 쌓인 손실이 전부 상쇄되고 최초 배팅액만큼이 순이익으로 남는다. 그래서 '필승법'이라는 이름이 붙었습니다.

카지노에서는 깡통, 코인에서는 왜 다른가

  • 승률 — 룰렛의 짝/홀은 0(과 00) 때문에 이길 확률이 50%를 밑돕니다. 시행이 길어질수록 하우스 엣지가 확정적으로 갉아먹어요. 코인 선물에서 아무 방향으로나 던지면 수수료를 빼기 전까지는 대략 반반입니다. 규칙에 미리 박혀 있는 엣지가 없다는 게 첫 번째 차이입니다.
  • 배팅 한도 — 카지노 테이블에는 최대 한도가 있습니다. 6~7연패면 한도에 막혀 두 배로 못 올리고, 그 순간 '한 번만 이기면 회수된다'는 전제가 끊깁니다. 거래소 주문에는 그런 벽이 없습니다.
  • 결과가 확정되는 시점 — 룰렛은 공이 떨어지면 끝입니다. 반면 포지션은 내가 닫지 않는 한 진 상태로 확정되지 않아요. 그래서 코인에서는 '두 배 재배팅'을 '두 배 물타기'로 옮겨 심을 수 있습니다.
  • 대신 새로 생긴 비용 — 카지노에는 없던 게 붙습니다. 왕복 수수료, 정산 주기마다(바이낸스는 대체로 8시간, 심볼에 따라 더 짧을 수 있습니다) 오가는 펀딩비, 그리고 강제청산. 펀딩은 방향에 따라 내기도 받기도 하지만, 시장이 쏠린 쪽에 서 있으면 계속 내는 쪽이 됩니다. 특히 청산은 거래소가 정한 지점에서 내 의사와 무관하게 결과를 확정시킵니다. 결국 배팅 한도가 사라진 게 아니라 금액 한도에서 가격 한도로 형태만 바뀐 겁니다.
코인에서는 해보셔도 되는데, 카지노에서는 절대 하지 마세요. 깡통 찹니다.

봇으로 옮긴 핵심 로직

실제로 짠 봇은 재배팅이 아니라 물타기 형태입니다. 진입가에서 일정 폭 밀릴 때마다 수량을 두 배로 추가해 평단을 끌어내리고, 평단 대비 아주 얕은 익절선에 닿으면 전량 정리합니다. 마틴게일의 '두 배'는 그대로 살아 있고, 승패를 확정시키는 주체만 딜러에서 나로 바뀐 구조예요. 아래는 단계별 추가진입가와 누적 평단을 미리 계산해두는 부분입니다. 봇을 켜기 전에 이 표부터 뽑아보라고 하는 이유는, 사실 여기서 이미 답이 절반쯤 나오기 때문입니다.

def martingale_plan(seed_qty, entry_price, step_pct=0.01, max_step=7, side="long"):
    """단계별 추가진입가 / 수량 / 누적평단을 미리 계산한다. 봇을 켜기 전에 이걸 먼저 본다."""
    plan, total_qty, total_cost = [], 0.0, 0.0
    for i in range(max_step + 1):
        # 롱이면 아래로, 숏이면 위로 물타기 라인을 잡는다
        drift = -step_pct * i if side == "long" else step_pct * i
        price = entry_price * (1 + drift)
        qty = seed_qty * (2 ** i)          # 지면 두 배 — 마틴게일의 전부
        total_qty += qty
        total_cost += price * qty
        plan.append({
            "step": i,
            "price": round(price, 2),
            "qty": round(qty, 6),
            "avg": round(total_cost / total_qty, 2),   # 누적 평단
            "notional": round(total_cost, 2),          # 누적 명목가치
        })
    return plan

# 시드 0.01 BTC로 시작해 1%마다 7단계까지 물타기
for row in martingale_plan(0.01, 60000.0):
    print(row)
# step 7의 수량은 1.28 BTC — 시드의 128배다. 0~7단계 누적 수량은 시드의 255배.

단계당 1%씩 7단계면 진입가에서 겨우 7% 내려온 자리입니다. BTC가 7% 빠지는 건 드문 일도 아니고요. 그런데 그 지점에서 제가 들고 있어야 하는 물량은 시드의 255배입니다. 여기서 이 전략의 성격이 드러납니다 — 위험이 없어진 게 아니라, 아주 높은 확률의 작은 이익과 아주 낮은 확률의 거대한 손실로 모양만 바꿔 담은 겁니다. 아래는 그 계획표를 실제 주문으로 집행하는 부분입니다.

import os, time, ccxt

ex = ccxt.binanceusdm({
    # 폴백 디폴트 금지. 키가 없으면 여기서 바로 죽는 게 맞다
    # 테스트넷 키와 실계좌 키는 서로 다른 값이다. 아래는 테스트넷 키를 넣는 자리
    "apiKey": os.environ["BINANCE_TESTNET_API_KEY"],
    "secret": os.environ["BINANCE_TESTNET_API_SECRET"],
})
ex.set_sandbox_mode(True)   # 테스트넷. 실계좌 전환은 계획표를 다 본 뒤에 판단할 것
ex.load_markets()

symbol, step = "BTC/USDT", 0
plan = martingale_plan(0.01, ex.fetch_ticker(symbol)["last"])
ex.create_market_buy_order(symbol, plan[0]["qty"])   # 0단계 진입

while True:
    last = ex.fetch_ticker(symbol)["last"]

    if last >= plan[step]["avg"] * 1.003:            # 평단 +0.3%면 전량 정리
        held = sum(p["qty"] for p in plan[:step + 1])
        ex.create_market_sell_order(symbol, held, params={"reduceOnly": True})
        break

    if step < len(plan) - 1 and last <= plan[step + 1]["price"]:
        ex.create_market_buy_order(symbol, plan[step + 1]["qty"])   # 수량 두 배로 추가
        step += 1

    time.sleep(2)
# 이 루프에는 손절이 없다. 마지막 단계까지 밀리면 평단 회복을 기다리는 것 말고 할 수 있는 게 없고,
# 그 사이 청산가에 닿으면 거래소가 대신 정리한다.
이 코드에 손절이 없는 건 빠뜨린 게 아닙니다. 마틴게일에 손절을 붙이는 순간 '한 번만 이기면 회수된다'는 전제 자체가 깨져서, 논리적으로 넣을 자리가 없어요. 그래서 실계좌에서 돌리면 손절 시점을 제가 정하는 게 아니라 거래소 청산엔진이 정합니다. 여기서 흔히 하는 착각이 하나 있습니다. '10배 롱은 대략 -10%에서 청산이니까 7%까지만 물타기하는 계획은 안전하다'는 계산인데, 그 -10%는 0단계 포지션 하나만 들고 있을 때의 값입니다. 수량을 두 배씩 늘리면 청산가는 평단과 불어난 총 명목가치를 기준으로 다시 계산되고, 증거금을 같이 채워 넣지 않으면 청산선이 현재가 쪽으로 계속 올라붙습니다. 안전 여부를 가르는 건 '진입가에서 몇 % 내려왔나'가 아니라 '남은 증거금이 255배로 커진 명목가치를 감당하는가'예요. 단계 수 × 단계 폭 × 레버리지를 넣었을 때 각 단계의 평단·명목가치·청산가가 어떻게 움직이는지 표로 나란히 뽑아보고, 테스트넷에서 먼저 확인하세요.

왜 이게 실전에서 깨지는가

  • 자본은 기하급수로 늘고 시장은 그걸 안 기다려 줍니다. n단계까지 버티려면 시드의 2^(n+1)−1배가 필요합니다. 10단계면 2,047배예요. 뒤집어 말하면 내 시드로 감당 가능한 단계 수는 체감보다 훨씬 적습니다.
  • 청산가가 배팅 한도 역할을 그대로 물려받습니다. 카지노 테이블 한도를 피해서 코인으로 왔는데, 레버리지를 쓰는 순간 더 단단한 한도가 다시 생깁니다. 레버리지를 낮추면 청산은 멀어지지만 필요 자본이 그만큼 커지고요. 둘 중 하나는 반드시 물러야 합니다.
  • '반반'이라는 가정이 비용 앞에서 무너집니다. 물타기 한 번마다 taker 수수료가 붙고, 단계가 올라갈수록 명목가치가 두 배씩 커지니 수수료도 두 배씩 커집니다. 여기에 정산 주기마다 명목가치 기준으로 펀딩비가 오갑니다. 받는 방향일 때도 있지만, 쏠린 쪽에 서 있으면 커진 명목가치만큼 그대로 빠져나갑니다. 익절 0.3%가 이 비용을 다 덮는지부터 계산하고 시작해야 합니다.
  • 에퀴티 곡선이 사람을 속입니다. 이 전략은 승률이 아주 높게 찍힙니다. 대부분의 사이클이 이익으로 끝나니까요. 그래서 초반 곡선은 거의 직선으로 우상향합니다. 그 곡선은 전략이 좋다는 증거가 아니라 아직 최악의 연패를 안 만났다는 증거일 뿐입니다. 승률만 높게 찍힌 그래프를 보고 판단하면 안 되는 대표 사례예요.
  • 슬리피지와 유동성. 마지막 단계 물량은 시드의 수십~수백 배입니다. 그 크기를 시장가로 던지는 순간 계획표의 가격과 실제 체결가가 갈라집니다. 계획표는 언제나 실전보다 낙관적입니다.

정리하면, 코인에서 마틴게일이 카지노보다 조건이 나은 건 사실입니다. 규칙에 박힌 하우스 엣지가 없고 배팅 한도도 명목상으로는 없으니까요. 그런데 나아진 만큼 위험이 사라진 게 아니라 형태가 바뀌었을 뿐입니다. 잃을 확률이 낮아진 대신 잃을 때의 크기가 커졌어요. 기대값이 개선된 게 아니라 분포의 모양이 달라진 겁니다. 이 시리즈에서 마틴게일을 계속 붙잡고 있는 이유도 수익을 내려는 쪽보다는 그 분포가 실제 계좌에서 어떻게 생겼는지 눈으로 보려는 쪽에 가깝습니다. 다음 편에서는 단계 폭과 레버리지를 바꿔가며 청산까지 걸리는 시간을 재봅니다. 첨부 코드는 전부 테스트넷 기준이고 교육·연구 목적입니다. 특정 매매 방식을 권하는 글이 아니고, 실계좌에 올릴지는 각자의 판단이며 그 결과도 각자의 몫입니다.

첨부파일

영상에 사용된 소스코드와 설명서입니다. 로그인 없이 받을 수 있습니다.

마틴게일 선물 봇 (테스트넷)martingale_futures_bot.py · 7.4 KB단계별 자본 소요 / 청산가 대조표 생성기martingale_step_table.py · 3.6 KB연패 길이 분포 시뮬레이션 원본streak_simulation.csv · 1.8 KB