이론상 지지 않는 전략 — 마틴게일을 실전에 붙여봤다
마틴게일 봇을 바이낸스 선물 BTC·ETH·SOL에 붙여 돌린 기록입니다. 승률이 높은데도 계좌가 안전해지지 않는 이유를 코드와 자금 계산으로 정리했습니다.
마틴게일은 자동매매를 검색하면 가장 먼저 나오는 전략이고, 대체로 가장 먼저 버리라고 하는 전략입니다. 그런데 버리라는 말만 듣고 버리면 왜 버려야 하는지는 끝까지 모릅니다. 그래서 직접 프로그램으로 만들어 바이낸스 USDT-M 선물에 붙였고, BTC·ETH·SOL 세 종목으로 돌렸습니다. 계좌 화면과 종목별 결과, 손실이 났을 때의 사례는 영상에 그대로 담았습니다. 이 글은 그 화면이 왜 그렇게 나왔는지, 구조 쪽을 정리한 것입니다.
'이론상 지지 않는다'는 말의 정확한 뜻
마틴게일의 원형은 동전 던지기입니다. 지면 다음 판에 두 배를 겁니다. 한 번만 이기면 그때까지의 손실 전부와 1단위 이익이 한꺼번에 회수됩니다. 1+2+4+…+2^(n-1) = 2^n − 1 이라서, 다음 판 베팅 2^n 이 직전까지의 누적 손실보다 항상 1 큽니다. 이 산수 자체는 틀린 데가 없습니다. 문제는 이 결론이 두 개의 전제 위에 서 있다는 겁니다. 자본이 무한할 것, 그리고 베팅 상한이 없을 것. 둘 중 하나만 깨져도 '이론상 지지 않는다'는 '언젠가 한 번 크게 진다'로 바뀝니다. 카지노가 테이블마다 최대 베팅액을 걸어두는 이유가 이겁니다.
이걸 코인 시장으로 옮기면 물타기 봇이 됩니다. 진입한 뒤 가격이 정해진 폭만큼 역행하면 직전 물량의 두 배로 추가 진입합니다. 진입 단가가 계속 낮아지니 평단까지만 되돌아오면 전량 익절할 수 있습니다. 즉 이 봇에게 '되돌림'은 승리, '추세'는 패배입니다. 방향을 맞히는 전략이 아니라 시장이 평균으로 돌아온다는 데 자본을 거는 전략이고, 그 판돈이 단계마다 두 배가 됩니다.
실제로 돌린 봇의 구조
- 단계 간격 1% — 최초 진입가 기준으로 1% 간격의 그리드를 깔았습니다. 1%씩 내려갈 때마다 다음 단계로 넘어갑니다. 이 값을 좁히면 단계가 빨리 소진되고, 넓히면 물려 있는 기간이 길어집니다.
- 배수 2.0 — 마틴게일의 정의 그대로입니다. 1.5나 1.3으로 낮추면 이른바 소프트 마틴이 되는데, 완화될 뿐 성질은 같습니다.
- 최대 단계 7 — 이 봇에서 실질적으로 가장 중요한 숫자입니다. 뒤에서 다루겠지만 이 숫자 하나가 파산 확률과 필요 자본을 동시에 결정합니다.
- 익절 폭 0.4% — 익절만 평단 기준입니다. 평단 대비 0.4% 반등하면 전량 정리하고 사이클을 처음부터 다시 시작합니다.
- 종목별 독립 인스턴스 — BTC·ETH·SOL을 같은 파라미터로 각각 돌렸습니다. 계좌는 공유하고 포지션 상태만 분리했는데, 이 구성이 나중에 문제가 됩니다.
import os, ccxt
KEY, SECRET = os.environ.get("BINANCE_KEY"), os.environ.get("BINANCE_SECRET")
if not KEY or not SECRET:
raise RuntimeError("BINANCE_KEY/SECRET 미설정 — 폴백 디폴트를 두지 않는다")
ex = ccxt.binanceusdm({"apiKey": KEY, "secret": SECRET})
GAP = 0.01 # 최초 진입가 기준 1% 간격 그리드
MULT = 2.0 # 마틴 배수
MAX_STEP = 7 # 최대 물타기 단계 — 사실상 이 숫자가 파산 확률을 정한다
TP = 0.004 # 평단 대비 0.4% 반등이면 전량 청산
class MaxStepReached(Exception):
pass
def step_once(symbol, step, entry_price, avg_price, base_qty, pos_qty):
last = ex.fetch_ticker(symbol)["last"]
if last >= avg_price * (1 + TP):
ex.create_market_order(symbol, "sell", pos_qty,
params={"reduceOnly": True}) # 익절 — 사이클 종료
return 0
if last > entry_price * (1 - GAP * (step + 1)):
return step # 아직 다음 단계 아님
if step >= MAX_STEP:
raise MaxStepReached(symbol) # 단계 소진 — 손실이 확정되는 유일한 지점
ex.create_market_order(symbol, "buy", base_qty * MULT ** step)
return step + 1코드에서 눈여겨볼 곳은 손절이 없다는 점입니다. 이 봇에는 사이클을 끝내는 경로가 두 개뿐입니다. 평단 위로 올라와서 익절하거나, 최대 단계를 소진하고 멈추거나. 손절선을 붙이는 순간 '한 번만 이기면 회수된다'는 전제가 깨지기 때문에, 정직하게 마틴게일을 구현하면 이 모양이 될 수밖에 없습니다. 바꿔 말하면 이 전략의 리스크 관리는 전부 MAX_STEP 한 줄에 들어 있습니다.
승률이 높다는 게 오히려 문제다
돌려보면 대부분의 사이클은 이깁니다. 1% 역행 뒤 0.4% 되돌림은 코인 시장에서 흔한 움직임이라, 계좌 곡선이 잔물결 없이 계단식으로 올라갑니다. 그래서 며칠만 보면 이 전략은 아주 좋아 보입니다. 여기가 함정입니다. 마틴게일은 승률을 높이는 기술이 아니라 손실을 뒤로 미루는 기술입니다. 이길 확률을 끌어올린 만큼 질 때의 크기를 키워서 맞바꾼 것이고, 수수료 때문에 그 교환비가 정확히 공평하지도 않습니다. 아래는 1단계 진입금 100 USDT로 시작했을 때 단계마다 얼마가 필요한지 계산한 코드입니다. 백테스트가 아니라 그냥 산수입니다.
BASE = 100.0 # 1단계 진입금 (USDT)
GAP, MULT = 0.01, 2.0
entry = 100.0 # 예시 진입가
cost = qty = 0.0
for step in range(10):
price = entry * (1 - GAP * step) # 이번 단계의 진입가
amount = BASE * MULT ** step # 이번 단계 투입금
cost += amount
qty += amount / price
avg = cost / qty # 갱신된 평단
print(f"{step+1:>2}단계 진입가 {price:6.2f} 누적투입 {cost:>10,.0f} "
f"평단 {avg:6.2f} 평단까지 반등 {(avg/price - 1)*100:5.2f}%")
# 10단계 누적 투입금 = 1단계의 1023배 (100 USDT로 시작하면 102,300 USDT)
# 가격은 9% 내려왔을 뿐인데, 필요 자본은 천 배가 됐다왜 이 전략이 실전에서 깨지는가
영상에서 보여드린 손실 사례는 특별한 사건이 아니라 이 구조에서 언젠가 반드시 나오는 장면입니다. 마틴게일의 손실은 시간에 고르게 흩어져 오지 않고 한 번에 몰려서 옵니다. 그래서 짧은 관찰 구간에서는 거의 항상 좋아 보이고, 그 구간이 어디서 끝날지는 고를 수 없다는 게 핵심입니다. 아래는 돌리면서 확인한 것들입니다.
- 자본은 선형인데 필요 증거금은 지수입니다. 위 계산처럼 가격이 9% 역행하는 동안 필요 자본은 1,023배가 됩니다. 코인에서 9%는 이례적인 움직임이 아닙니다.
- 강제청산이 최대 단계보다 먼저 옵니다. 설계상 버틸 수 있는 단계와 거래소가 버티게 해주는 단계는 다른 숫자이고, 실제로 계좌를 끝내는 건 후자입니다.
- 평균회귀 가정이 추세장에서 무너집니다. 이 봇은 되돌림에 베팅하는데, 한 방향으로 계속 밀리는 구간에서는 되돌림 자체가 오지 않습니다. 변동성이 큰 종목일수록 단계 소진이 빨라집니다.
- 익절 폭이 좁아서 비용 비중이 큽니다. 0.4%를 먹자고 taker 왕복 0.08%를 내면 수익의 5분의 1이 수수료로 나갑니다. 단계마다 물량이 두 배라 비용도 같이 두 배가 되고, 선물이면 펀딩비가 여기에 더 붙습니다.
- 종목을 나눠도 분산이 되지 않습니다. BTC·ETH·SOL을 따로 돌렸지만 급락은 세 종목에 동시에 옵니다. 인스턴스는 셋인데 증거금은 하나라서, 위험이 나뉘는 게 아니라 같은 시점에 겹칩니다.
- 가장 위험한 건 코드가 아니라 손입니다. 마지막 단계에 다다르면 MAX_STEP을 8로 고치고 싶어집니다. 그 수정이 통하는 날이 훨씬 많다는 게 문제고, 통하지 않는 날은 한 번이면 충분합니다.
첨부파일
영상에 사용된 소스코드와 설명서입니다. 로그인 없이 받을 수 있습니다.
마틴게일 봇 소스코드단계별 필요 자본 계산표최대 단계 설계 워크시트