자금관리8분 분량

승률 99% 마틴게일 전략을 만들어 봤다 — 과연 수익이 날까?

하이킨아시 캔들 신호에 마틴게일 자금 관리를 붙여 백테스트를 돌렸습니다. 높은 승률 뒤에 숨은 파산 리스크의 구조와 안전장치의 역할을 정리했습니다.

유튜브 '묻고 더블로 가' 마틴게일 1편 보셨나요? 카지노의 필승법이라 알려진 마틴게일 전략을 코인 시장에 맞게 고쳐서 과거 데이터로 돌려보는 실험이었습니다. 이 글은 그 정리본에 영상에는 안 넣은 핵심 코드를 붙인 것입니다. 수익률 그래프는 영상에 있으니 여기 옮겨 적으면 제가 유리한 구간만 고르게 되니까요, 대신 그 숫자가 나온 구조를 설명하겠습니다.

결론부터 말하면, 마틴게일은 승률을 높이는 기술이 아니라 손실을 뒤로 미루는 기술입니다. 아주 높은 승률을 보여주지만, 단 한 번의 실패로 모든 누적 수익을 반납하고 계좌를 터뜨리는 구조적 위험을 안고 있습니다.

원리가 간단한 게 함정이다

마틴게일의 기본 아이디어는 지극히 단순합니다. 100원을 걸고 졌다면 다음 판에 200원을 걸고, 또 지면 400원을 겁니다. 이렇게 계속 배팅액을 두 배로 늘리다가 딱 한 번만 이기면, 그동안 잃었던 모든 돈을 회수하고 최초 배팅액인 100원만큼의 수익을 얻게 됩니다. 이론상 자본만 무한하다면 절대 지지 않는 전략이죠.

이번 실험에서는 하이킨아시 캔들을 이용해 진입 신호를 만들었습니다. 예를 들어 '같은 색 캔들이 5개 연속 나오면 너무 과열됐으니 반대 방향으로 진입'하는 식의 역추세 전략을 씁니다. 진입 후 가격이 제 예상과 반대로 가서 손실이 나면, 정해진 간격(예: -0.5%)마다 두 배씩 물량을 늘려 평단가를 끌어내립니다. 그러다 약간만 반등해줘도 익절하고 나올 수 있는 구조예요.

승률 99%는 어떻게 만들어지는가

백테스트를 돌려보면 정말 무서운 승률이 나옵니다. 98%, 99%가 심심치 않게 찍히거든요. 왜 그럴까요? 작은 익절 목표(tp_pct = 0.5%)와 여러 번의 물타기 기회 덕분입니다. 대부분의 자잘한 변동성은 몇 번 물을 타는 과정에서 평단가 근처로 돌아와 익절로 마감됩니다. 그래서 그래프를 보면 수많은 작은 승리가 쌓여 계단식으로 꾸준히 우상향하는 것처럼 보입니다.

여기가 함정입니다. 이 높은 승률은 수많은 '작은 수익'과 언젠가 터질지 모르는 '하나의 거대한 손실'을 맞바꾼 결과입니다. 평균 수익은 아주 작지만, 단 한 번의 실패가 주는 손실은 그동안 쌓아온 모든 것을 무너뜨릴 만큼 큽니다. 백테스트의 승률이 아니라 최대낙폭이 이 전략의 진짜 실력인 셈이죠.

아래 코드가 바로 그 '묻고 더블로 가' 부분입니다. 손실이 날 때마다 기하급수적으로 배팅액을 늘려 한 번의 반등을 노립니다.

// ---- 역행 판단 (더블다운 트리거) ----
static bool AdverseHit(int side, double price, double lastEntry, int level, Config cfg)
{
    // level 에 따라 점점 더 넓은 간격(spacing)을 쓸 수 있다. 이게 중요.
    double sp = cfg.Progressive
        ? (level < cfg.Spacing.Count ? cfg.Spacing[level] : cfg.Spacing[cfg.Spacing.Count - 1])
        : cfg.FixedStep;
    if (side > 0) return price <= lastEntry * (1 - sp / 100.0);
    else return price >= lastEntry * (1 + sp / 100.0);
}

// ---- 더블다운 ----
static void AddMartingale(int dir, double price, int level, Config cfg, ref double realized, ref double mainQty, ref double mainCost)
{
    // level+1 에 2를 거듭제곱. 0단계->2배, 1단계->4배, 2단계->8배... 기하급수적 증가.
    double addNotional = cfg.BaseUsdt * Math.Pow(2, level + 1);
    double ep = EnterPrice(price, dir, cfg); // 슬리피지 포함
    double q = addNotional / ep;
    mainQty += q;
    mainCost += q * ep;
    realized -= cfg.Fee * addNotional; // 수수료는 확실한 비용이다.
}

보이지 않는 비용이 진짜 적이다

마틴게일 전략은 물타기를 자주 하기 때문에 거래 횟수가 많아집니다. 이 말은 수수료와 슬리피지의 영향이 치명적이라는 뜻입니다. 영상의 초기 버전처럼 익절 목표를 0.5%로 아주 짧게 잡으면, 이 거래 비용이 수익의 상당 부분을 갉아먹습니다.

백테스터 코드에는 이 부분을 현실적으로 반영하기 위해 수수료(fee)와 슬리피지(slippage_pct)를 설정할 수 있게 되어 있습니다. 슬리피지는 내가 주문을 낸 가격과 실제 체결된 가격의 차이인데, 항상 나에게 불리한 방향으로 계산해서 비용으로 처리합니다. 비용은 확정값이고 엣지는 추정값입니다. 이 간단한 사실을 무시하면 백테스트는 그냥 희망 회로가 됩니다.

// ---- 슬리피지/수수료 반영 체결가 & 청산 ----

// 슬리피지를 반영해 항상 불리한 가격에 체결시킨다. 백테스트의 최소 양심.
static double EnterPrice(double price, int dir, Config cfg)
{
    return dir > 0 ? price * (1 + cfg.SlippagePct / 100.0) : price * (1 - cfg.SlippagePct / 100.0);
}
static double ExitPrice(double price, int posDir, Config cfg)
{
    return posDir > 0 ? price * (1 - cfg.SlippagePct / 100.0) : price * (1 + cfg.SlippagePct / 100.0);
}

// 청산 시에도 수수료는 꼬박꼬박 나간다.
static void CloseAll(double price, int side, double mainQty, double mainCost,
                     bool hedgeOn, double hedgeQty, double hedgeCost, Config cfg, ref double realized)
{
    double avgMain = mainCost / mainQty;
    double exM = ExitPrice(price, side, cfg);
    double grossM = side > 0 ? (exM - avgMain) * mainQty : (avgMain - exM) * mainQty;

    // 총 거래대금에 비례해서 수수료가 빠진다.
    realized += grossM - cfg.Fee * (exM * mainQty);

    // ... 헷지 포지션도 동일하게 처리 ...
}
이건 백테스트가 아니라 그냥 산수입니다. 목표 익절이 0.5%인데, 왕복 거래 비용이 0.12%(진입 수수료 0.04% + 슬리피지 0.02%, 청산 수수료 0.04% + 슬리피지 0.02%)라고 해보죠. 목표 수익의 24%가 그냥 사라지는 거예요. 만약 마틴을 한 번 타면 비용은 더 늘어납니다. 이건 전략의 엣지 문제가 아니라 비용 구조의 문제입니다. 저도 처음엔 이 비용을 빼고 돌렸다가 '대박 전략'인 줄 알고 좋아했었거든요.

한 방에 터지지 않기 위한 개선점들

그럼 이 위험한 전략을 그냥 버려야 할까요? 영상에서 소개한 것처럼, 마틴게일의 파괴력을 줄이고 생존율을 높이기 위한 몇 가지 안전장치를 달아볼 수 있습니다. 물론 이건 마틴게일을 '좋은 전략'으로 만드는 게 아니라, '덜 위험한 전략'으로 만드는 것에 가깝습니다.

  • 익절 목표 넓히기: 0.5%에서 2.0%로. 거래 비용이 수익에서 차지하는 비중을 줄여줍니다. 가장 기본적이고 강력한 개선입니다.
  • ATR 변동성 필터: ATR 지표로 변동성을 측정해, 시장이 너무 과열되었을 때는 진입이나 물타기를 쉽니다. 급격한 추세에 휘말려 순식간에 여러 단계 물타는 걸 막아줍니다.
  • 물타기 간격 넓히기: 0.5% 고정 간격이 아니라 0.5% -> 0.7% -> 1.0% 처럼 단계를 거칠수록 간격을 넓힙니다. 평단가 개선 효과는 줄지만, 그만큼 강제청산까지 버틸 공간을 더 많이 확보하는 생존 기술입니다.
  • 헷지 모드: 2단계 같은 특정 마틴 레벨부터는 반대 방향 포지션을 일부 잡아 손실 확대를 늦춥니다. 일종의 보험이지만, 그만큼 수익도 줄어드는 양날의 검입니다.

왜 이게 실전에서 깨지는가

  • 꼬리 리스크(Tail Risk)는 사라지지 않습니다. 개선책들은 파산을 '지연'시킬 뿐, 언젠가 올 블랙스완 이벤트 한 방에 모든 누적 수익이 사라질 수 있습니다.
  • 자본은 유한하고 배팅액은 기하급수적으로 늘어납니다. 5번만 물을 타도 첫 배팅의 32배(2^5)가, 10번이면 1024배의 자금이 필요합니다. 제 계좌는 무한하지 않거든요.
  • 심리적 한계를 버틸 수 없습니다. -30%, -40% 평가손을 보면서 기계적으로 다음 물타기 버튼을 누르는 건 사람이 할 일이 아닙니다. 가장 위험한 건 코드가 아니라 손입니다.
  • 거래소 제약이 발목을 잡습니다. 최대 포지션 크기 제한이나 호가창 두께 때문에 원하는 가격에 원하는 만큼 물량을 실을 수 없습니다. 특히 고단계 마틴은 엄청난 물량이 필요합니다.
  • 파라미터가 너무 많습니다. ATR 필터, 헷지 시작 레벨, 물타기 간격... 이 숫자들은 과거 데이터에 과최적화되었을 가능성이 높습니다. 파라미터를 없앤 게 아니라 이름을 바꾼 겁니다.
  • 백테스트와 실전의 괴리가 생각보다 큽니다. 마틴게일처럼 짧은 순간에 여러 번 거래하는 전략은 체결 지연이나 API 렉 같은 미세한 차이에 결과가 크게 뒤바뀝니다.

이 글과 첨부 코드는 전략 구조를 설명하려고 만든 교육·연구 자료입니다. 특정 종목이나 매매를 권하지 않습니다.

첨부파일

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

하이킨아시 마틴게일 백테스터 소스마틴게일1탄.zip · 1.5 MB