💡 핵심 결론

  • 크립토 무기한 선물 백테스트는 다섯 가지 주요 원인으로 인해 실거래에서 실패합니다. 이 중 오직 두 가지만이 크립토 시장 고유의 문제에 해당합니다. 레버리지가 반영된 명목 계약 가치 기준의 펀딩 드래그(Drag) 현상과 소리 없이 발생하는 데이터 결손(Data Gap)입니다. 이 두 문제에 대한 구체적인 분석과 해결책을 본문에서 다룹니다.
  • 나머지 세 가지 함정(지정가 체결 착시, 슬리피지와 네트워크 지연, 데이터 병합 과정에서의 미래 참조 편향)은 주식, 외환(FX), 일반 선물 시장 등 자산을 가리지 않고 발생하는 보편적인 백테스트 오류입니다. 백테스트 부검 시리즈에서 실제 시장 데이터를 토대로 이미 심도 있게 실측한 내용이므로, 본문에서는 중복 설명을 피하고 해당 스포크 링크로 대체합니다.
  • 아래 제시된 펀딩 관련 수치들은 가정을 전제로 도출한 단순 계산 예시이며, 백테스트 실측 결과가 아닙니다. 엄밀한 실측 데이터와 분석 방법론은 링크된 부검 스포크 글에 수록되어 있습니다.

이 글은 방법론적 가이드라인을 제공합니다. 실측 부검 보고서가 아닙니다. 실측 통계가 필요한 항목은 수치를 직접 측정한 백테스트 부검 스포크로 대체하며 본문에서 수치를 중복 제공하지 않습니다.


1. 이 가이드가 필요한 이유

“크립토 백테스트 함정"을 다루는 시중의 포스팅은 대부분 자산군을 막론하고 발생하는 일반적인 백테스트 실수 열 가지를 늘어놓는 데 그칩니다. 이러한 단순 나열식 접근은 크립토 무기한 선물(Perpetual Futures) 시장에만 존재하는 고유하고 치명적인 두 가지 문제를 간과하게 만듭니다. 첫째, 펀딩 비용은 증거금이 아닌 레버리지가 반영된 ‘명목 계약 가치(Notional Value)‘에 부과된다는 점입니다. 둘째, 24시간 중단 없이 돌아가는 시장의 특성상, 예외 에러 없이 조용히 캔들을 빠뜨리는 API 및 소스들을 식별하고 이어 붙여야 한다는 점입니다.

따라서 본 가이드에서는 크립토 고유의 두 가지 함정에 대해 수학적 공식과 구현 코드를 곁들여 끝까지 파헤칩니다. 반면, 보편적인 세 가지 함정은 각각 핵심 요약문과 함께 이미 실측 분석을 마친 스포크 링크로 대체합니다. 동일한 실측 데이터나 수치는 클러스터 전체에서 중복 제공되지 않습니다.


2. 크립토 고유 무덤 ① 명목 가치 펀딩 드래그

무기한 선물 백테스트에서 저지르는 가장 치명적이고 비용이 많이 드는 실수는 펀딩 요율을 계좌 증거금의 미미한 비율로 취급하거나 연산에서 완전히 제외해 버리는 것입니다.

펀딩 비용은 계좌 증거금(Margin)이 아니라 포지션의 **명목 계약 가치(Notional Value)**에 부과됩니다. 손절폭을 타이트하게 잡을수록 리스크 단위당 명목 계약 가치가 커지므로, 동일한 펀딩 요율이라도 타이트한 손절폭을 사용하는 스캘핑 전략일수록 펀딩비 타격이 그에 비례해 훨씬 커집니다.

펀딩 드래그 개념도: 손절 0.5%는 명목 약 200배를 뜻하므로 펀딩 0.01%/8h가 1R의 2.0%/8h가 되고, 3일 보유면 1R 리스크 예산의 약 18%가 잠식됩니다.

손절 0.5%는 명목을 리스크의 약 200배로 키웁니다. 그래서 펀딩 0.01%/8h가 1R의 2.0%씩 갉아먹고, 3일 보유면 약 18%가 빠집니다.

이를 가장 직관적으로 이해하는 방법은 펀딩 비용을 1R 단위(진입가와 손절가 사이의 총 리스크 크기)로 환산하는 것입니다. 진입가 대비 손절폭 비율을 다음과 같이 정의합니다.

$$SL_{frac} = \frac{|\text{entry} - \text{sl}|}{\text{entry}}$$

실효 명목 레버리지는 이 손절폭 비율의 역수이므로, 포지션 보유 기간 동안 지불하거나 수취한 누적 펀딩 비용을 R 단위로 환산하면 다음과 같습니다.

$$\text{funding_R} = \frac{\text{direction_sign} \times \text{funding_rate} \times \text{periods}}{SL_{frac}}$$

direction_sign은 롱 포지션일 때 +1, 숏 포지션일 때 -1입니다. 펀딩 요율이 양수일 때 롱 포지션은 펀딩비를 지불하고, 숏 포지션은 수취하기 때문입니다.

계산 예시 (실측 연구가 아닌 산술적 예시입니다)

0.5% 손절폭을 가진 돌파 매매 셋업을 예로 들어 보겠습니다. 이 경우 손절 비율은 0.005이므로, 약 200배에 달하는 실효 명목 레버리지를 사용하는 것과 같습니다.

  • 바이낸스 무기한 선물의 평시 펀딩비 요율은 8시간당 0.01% 안팎으로 공시됩니다.
  • 한 회차(8시간)당 펀딩 비용은 $0.01% \times 200 = 2.0%$, 곧 1R 리스크의 **2.0%**에 달합니다.
  • 포지션을 24시간 동안 유지하면 3회차가 부과되므로 펀딩비로만 **1R의 약 6%**가 증발합니다.
  • 3일 동안 유지하면 9회차가 부과되므로 **1R의 약 18%**가 비용으로 누적됩니다.

강세 추세장에서는 펀딩비가 회차당 0.03%에서 0.05%까지 치솟기도 합니다. 이 수준에 도달하면 단 24시간만 포지션을 유지해도 1R 리스크의 18% ~ 30%가 펀딩비로 증발하며, 며칠 동안 포지션을 끌고 갈 경우 1R의 50%를 초과하는 비용이 발생합니다. 펀딩비를 반영하지 않은 백테스트 상에서는 이 막대한 드래그 비용이 전혀 드러나지 않으므로, 백테스트상의 아름답던 수익 곡선이 실거래에서 첫 펀딩 타임스탬프를 지나자마자 급격히 붕괴하는 현상이 벌어집니다.

이 문제에 대한 해결책은 앞서 정의한 공식을 활용하여 거래별 청산 기댓값에서 누적 펀딩 드래그를 직접 차감하는 것입니다. 연산 코드는 6절에 제시되어 있습니다.


3. 크립토 고유 무덤 ② 조용한 데이터 결손

크립토 시장은 24시간 연중무휴로 작동합니다. 과거 데이터를 축적하는 가장 단순한 방식(단일 REST API 엔드포인트를 루프로 호출하는 방식)은 동시에 데이터를 유실하기 가장 쉬운 방식이기도 합니다. 거래소의 API 호출 요율 제한(Rate Limit)이나 순간적인 네트워크 단절은 예외 오류를 발생시키지 않은 채 조용히 캔들을 누락시킵니다.

이렇게 누락된 캔들은 단순한 UI 상의 깨짐 문제가 아닙니다. 데이터 봉이 빠지면 이동평균(MA)이나 ATR 같은 시간 기반 롤링 지표들이 시간 축을 따라 밀리게 됩니다. 즉, 백테스트 엔진이 T 시점에 발생시켰던 진입/청산 시그널이 실제 완전한 데이터에서는 T+k 시점에 발동했어야 하는 오류를 초래합니다. 시뮬레이션한 전략과 실제 거래되는 전략 간의 괴리가 여기서 발생합니다.

이에 대한 확실한 처방은 단일 API 호출 루프에 의존하는 대신, 3단계 구조의 데이터 수집 파이프라인을 구축하는 것입니다.

  1. 월간 아카이브 ZIP: 과거 대부분의 긴 역사 데이터를 완전하고 무결하게 채우는 1차 소스입니다 (다운로드 속도가 빠르며 무결성이 보장됨).
  2. 일간 아카이브 ZIP: 월간 데이터에 아직 반영되지 않은 최근 몇 주의 공백을 채우는 2차 소스입니다.
  3. 라이브 REST API: 아카이브가 아직 커버하지 못하는 직전 몇 시간 동안의 최신 실시간 데이터를 채우는 3차 소스입니다.

이 세 가지 소스에서 얻은 데이터를 엄격한 타임스탬프 인덱스를 기준으로 병합하고, 전체 봉 개수가 해당 기간의 이론적 기대치와 완벽히 일치하는지 assert 구문으로 검증합니다. 이러한 정밀 검증을 생략한 채 남겨둔 데이터 결손은 결국 실거래에서 신호를 오염시켜 매매 알고리즘의 오작동을 유발합니다.


4. 나머지 세 무덤은 자산을 안 가립니다, 측정은 다른 글에서

지정가 체결 착시, 슬리피지, 미래 참조 편향은 크립토 시장만의 한계가 아닙니다. 주식, 외환(FX), 일반 선물 백테스트도 동일하게 붕괴시키는 보편적 요인들입니다. 본 가이드에서 이를 중복 서술하는 것은 백테스트 부검 시리즈가 실측 데이터를 통해 입증한 원문을 손상시키는 행위이므로, 각각의 보편적 무덤에 대해 한 문단의 핵심 요약과 함께 해당 원문 실측 링크로 대체합니다.

무덤 ③ 지정가 체결 착시

대부분의 표준 백테스터는 캔들의 꼬리가 지정가 주문 레벨에 스치기만 하면 100% 체결된 것으로 간주합니다. 실거래에서는 주문 매칭 엔진의 큐 우선순위(Queue Priority)와 순간적인 호가 스프레드 확장으로 인해 체결이 누락되는 경우가 비일비재합니다. 특히 손절폭과 익절폭이 하나의 캔들 내에서 동시에 도달했을 때, 데이터 해상도의 한계로 인해 어느 가격이 먼저 터치되었는지 판별할 수 없습니다. 실무적으로 가격이 지정가 레벨을 0.2% 이상 돌파해야 체결로 인정하는 등의 보수적인 휴리스틱(Heuristic)을 적용하지만, 이는 어디까지나 근사치일 뿐 실측 분석 결과가 아닙니다. 한 캔들 내에서 실거래 체결이 성립하는 기하학적 확률과 익절/손절 순서 규정은 다음 실측 글을 참조하십시오: 한 캔들 안에서 손절과 익절이 같이 닿으면 무엇이 먼저인가. 더 유리하게 진입한 지정가 주문이 오히려 불리한 역선택(Adverse Selection) 필터로 작동하여 나쁜 거래만 골라 체결시키는 현상은 진입가가 곧 엣지다에서 상세히 입증되었습니다.

무덤 ④ 슬리피지와 지연

지정가 체결 기회가 빗나가 백테스트 엔진이 다음 봉 시가에 시장가로 진입하거나 청산하게 될 때, 계좌는 백테스트 설계에 포함된 낙관적인 ‘메이커 가정’ 대신 비싼 테이커 수수료와 슬리피지를 지불하게 됩니다. 유동성 고갈 또는 높은 시장 변동성 국면(Regime)에서는 이 괴리가 계좌를 훼손할 정도로 벌어집니다. 메이커 대 테이커 기댓값 차이와 슬리피지 그리드는 전용 스포크 분석글인 슬리피지 부검을 통해 확인하십시오.

무덤 ⑤ 조인을 통한 미래 참조

머신러닝이나 외부 지표 모델(예: 레짐 분류기, 상관관계 매트릭스)을 원본 시계열 데이터프레임과 병합(Join)하는 과정에서 미래의 정보가 유출되어 과거로 수혈되는 경우가 많습니다. 조인 연산이 (timestamp, symbol) 키에 엄격히 구속되지 않거나 오프셋 연산이 누락되면, 미래의 결과값이 이미 과거 봉에 포함되어 비현실적으로 매끄러운 가상의 우상향 곡선이 생성됩니다. 이러한 어긋난 shift 연산의 폐해와 누출 경로는 미래 참조 편향과 침투의 함정에서 정밀 해부하였습니다.


5. 함정 지도

무덤크립토 고유?실거래 발생 증상처치 및 해결 위치
펀딩 드래그예 (무기한 선물 한정)백테스트 상에서는 완벽하나, 8시간 펀딩 타임스탬프를 지나는 순간 잔고 손실 누적.본문 가이드 §2 + §6 파이썬 코드
데이터 결손일부 (API 공통 한계; 24시간 크립토에서 심화)지표 왜곡 및 시그널 시점 지연/밀림 현상 발생.본문 가이드 §3
지정가 체결 착시아니오 (보편)가상 백테스트의 높은 승률 대비, 실거래 미체결 및 누락 빈발.부검 시리즈: 인트라바 & 진입가 엣지 스포크
슬리피지·지연아니오 (보편)낙관적 메이커 가정으로 인한 허구의 엣지 팽창.부검 시리즈: 슬리피지 스포크
조인 미래 참조아니오 (보편)시뮬레이션 환경에서 비정상적으로 매끄러운 완벽한 우상향 곡선.부검 시리즈: 미래 참조 스포크

6. 파이썬: 펀딩과 마찰을 R 단위로 차감하기

이 함수는 본 가이드에서 다룬 크립토 고유의 두 가지 드래그(명목 펀딩 비용 및 테이커 실행 마찰)를 보정합니다. 거래 단위 행 데이터프레임을 입력받아 드래그 비용들을 단순 참고용 컬럼으로 방치하지 않고 순 기댓값(순 R 단위 수익)에서 실제로 자동 차감합니다.

import numpy as np
import pandas as pd


def apply_funding_and_friction(
    df: pd.DataFrame,
    taker_fee: float = 0.0004,
    slippage_pct: float = 0.0005,
) -> pd.DataFrame:
    """Adjust per-trade R-multiple expectancy for the two crypto-specific
    drags: notional funding cost and execution friction.

    Expected columns:
      entry_price, stop_loss_price,
      funding_rate (signed, per 8h window),
      funding_periods (count of 8h windows held),
      direction (+1 long, -1 short),
      gross_pnl_R (gross result in R units).
    """
    out = df.copy()

    # Stop distance as a fraction of entry price.
    # This fraction is the inverse of effective notional leverage,
    # so funding scales by 1 / sl_frac.
    out["sl_frac"] = (
        (out["entry_price"] - out["stop_loss_price"]).abs() / out["entry_price"]
    )
    out["sl_frac"] = out["sl_frac"].replace(0, np.nan).fillna(0.01)  # zero-division guard

    # Funding cost in R units, matching the body formula.
    # direction sign matters: a long pays when funding_rate > 0; a short receives.
    # A positive funding_cost_R means the trade LOSES that many R to funding.
    out["funding_cost_R"] = (
        out["direction"] * out["funding_rate"] * out["funding_periods"]
    ) / out["sl_frac"]

    # Execution friction (taker fee + slippage), expressed in R units.
    out["friction_cost_R"] = (taker_fee + slippage_pct) / out["sl_frac"]

    # Net expectancy actually deducts both drags.
    out["net_pnl_R"] = (
        out["gross_pnl_R"] - out["funding_cost_R"] - out["friction_cost_R"]
    )

    return out

시중의 일반적인 코드 대비 두 가지 버그가 교정되었습니다. 첫째, 펀딩 비용 연산에 포지션 방향(direction)을 반영하여 숏 포지션이 펀딩비를 수취하는 경우(수취 시 비용 차감)를 정확히 모델링했습니다. 둘째, 계산된 드래그 비용들을 단순히 컬럼으로 적재해두는 것이 아니라 순 R 값에서 직접 차감 연산 처리합니다.

지정가 체결 오류, 슬리피지 확장, 미래 참조의 세밀한 처치는 본문에서 재구현하지 않고, 상호 연결된 전용 부검 스포크의 검증 엔진을 사용하십시오.


7. FAQ

Q1. 손절폭이 매우 좁은 타이트 손절 스캘퍼에게 펀딩비는 실제로 얼마나 큰 부담인가요?

기본 8시간당 0.01%의 펀딩 요율을 기준으로 하고 손절폭이 0.5%라면, 이는 약 200배의 실효 명목 레버리지를 의미합니다. 따라서 펀딩 타임스탬프가 찍힐 때마다 1R 리스크 대비 무려 2.0%의 펀딩 비용이 누적 차감됩니다. 포지션을 하루(24시간) 동안 끌고 갈 경우(3회차 부과) 1R의 약 6%가 증발하며, 3일 동안 유지하면 1R의 약 18%에 상응하는 비용 부담이 발생합니다. 강세 추세장에서 펀딩 요율이 0.03% ~ 0.05%로 확대될 경우 그 손실 비율은 3배에서 5배까지 증폭됩니다. 이는 가정을 전제로 계산한 수학적 예시이며 실측 백테스트 통계가 아닙니다. 퍼페추얼 펀딩의 산정 방식과 8시간 부과 주기는 바이낸스 아카데미 펀딩 요율 설명에 문서화되어 있습니다.

Q2. 지정가 체결 판단을 위한 ‘0.2% 가격 침투(Penetration) 룰’의 근거는 무엇인가요?

이 수치는 수학적으로 고정된 물리 상수가 아니라 퀀트 업계의 보수적인 실무 통용 기준입니다. 캔들의 꼬리 끝이 지정가 레벨에 스치기만 했는데 체결된 것으로 간주하면 시뮬레이션상의 체결률이 비현실적으로 왜곡(부풀려짐)됩니다. 따라서 최소한의 가격 침투폭을 체결 조건으로 요구하는 것이 합리적인 기본값입니다. 한 봉 안에서 손절과 익절 중 무엇이 실제 먼저 체결되는지에 대한 엄밀한 기하학적 실측 분석은 인트라바 글에서 검증되었습니다.

Q3. 슬리피지를 단일 고정 수수료 대신 동적 그리드 스윕(Grid Sweep) 모델로 평가해야 하는 이유는 무엇인가요?

고정된 단일 슬리피지 요율은 꼬리 위험(Tail Risk)과 급격한 스프레드 확장을 완전히 가립니다. 뉴스 발표나 유동성 위기 시점에는 호가 스프레드가 극단적으로 넓어지므로, 슬리피지를 일정 범위에 걸쳐 스윕(Sweep)하여 전략이 위기 국면(Regime)에서도 생존할 수 있는지 점검하는 스트레스 테스트가 필요합니다. 실측된 메이커 대 테이커 기댓값 차이는 슬리피지 부검 스포크에서 확인하실 수 있습니다.

Q4. 데이터프레임 병합 시 흔히 발생하는 미래 참조 편향(Look-Ahead Bias)을 완벽히 방지하는 기법은 무엇인가요?

모든 병합(Join) 연산을 오직 (timestamp, symbol) 복합 키에만 바인딩하고, 병합 직후 데이터프레임의 행 수(Row Count)를 assert 구문으로 검증하며, 모델 입력으로 사용되는 모든 외부 피처 컬럼은 사전에 한 봉 뒤로 이동(.shift(1))시켜 백테스트 시뮬레이터가 반드시 이미 종결된(Closed) 봉의 데이터만 조회하도록 제한해야 합니다. 자세한 유출 예방 메커니즘은 미래 참조 스포크를 참고하십시오.

Q5. 본 가이드에 수록된 수치들은 실제 시장 통계 데이터인가요?

본문 중 펀딩비와 관련된 요율 및 드래그 수치들은 가정을 근거로 도출한 산술적 계산 결과입니다. 이론적인 재현은 가능하지만 실제 시장 실측 데이터는 아닙니다. 본 클러스터에서 제공하는 모든 정량적 실측 수치는 각 스포크 글에 포함된 독자적인 데이터셋과 표본 수를 기반으로 계산되었습니다.


관련 연구


업데이트 및 변경 이력

  • 2026-06-04: 가이드 형태로 전체 재구성. 크립토 시장 고유의 두 무덤(펀딩비, 데이터 결손)은 R 단위 펀딩 교정 공식 및 순 R 차감 로직이 포함된 소스코드로 정리하여 본문 유지하고, 나머지 보편적 3대 무덤은 전문 백테스트 부검 시리즈 스포크 링크로 대체 위임. 검증되지 않은 가공 수치 및 날조된 출처(SQTS Guideline) 인용 부분 삭제.

교육용 콘텐츠이며 투자 권유나 금융 조언이 아닙니다. 데이터·가격·도구 사양은 바뀔 수 있으니, 실거래 전 직접 검증하고 페이퍼 트레이딩으로 확인하시기 바랍니다.