본문 바로가기
주식 경제

파이썬 코인 백테스트 입문, 데이터부터 수익률 검증까지 정리

by 공대생 Debugger 2026. 6. 17.
반응형

파이썬 코인 백테스트 입문, 데이터부터 수익률 검증까지 정리

작성일: 2026.06.17 자료 기준: Python·pandas·NumPy·Matplotlib·Binance API·CCXT·CoinGecko API 공식 문서 및 주요 금융당국 투자자 경고 기준

파이썬 코인 백테스트는 “이 전략이 과거 데이터에서 어떻게 움직였는지”를 코드로 검증하는 과정입니다. 핵심은 예쁜 수익률 그래프를 만드는 것이 아니라, 데이터·수수료·슬리피지·과최적화를 함께 넣어 실제와 가까운 검증을 하는 것입니다. 입문자는 처음부터 복잡한 AI 모델보다 OHLCV 데이터, 간단한 이동평균 전략, 수익률·최대낙폭 지표부터 이해하는 편이 안전합니다. 이 글에서는 파이썬 코인 백테스트 입문자가 준비해야 할 도구, 데이터 수집 흐름, 최소 예제 코드, 실수 방지 체크리스트를 순서대로 정리했습니다. ※ 예시 코드는 교육용이며 특정 코인 매수·매도 권유가 아닙니다.

핵심 요약

데이터

  • 입문자가 먼저 볼 것: OHLCV, 거래쌍, 시간봉
  • 주의점: 거래소·시간대·누락 캔들 확인

도구

  • 입문자가 먼저 볼 것: Python, pandas, NumPy, Matplotlib, CCXT
  • 주의점: 버전 충돌 방지를 위해 가상환경 권장

전략

  • 입문자가 먼저 볼 것: 이동평균, RSI 등 단순 규칙
  • 주의점: 복잡한 전략보다 검증 구조가 먼저

비용

  • 입문자가 먼저 볼 것: 거래 수수료, 슬리피지
  • 주의점: 비용을 빼지 않으면 성과가 과장됨

성과지표

  • 입문자가 먼저 볼 것: 누적수익률, MDD, 승률, 손익비
  • 주의점: 수익률 하나만 보면 위험을 놓침

검증

  • 입문자가 먼저 볼 것: 훈련 구간·검증 구간 분리
  • 주의점: 과최적화와 미래 데이터 사용 방지

파이썬 코인 백테스트란 무엇인가요?

백테스트는 과거 가격 데이터를 이용해 매매 규칙을 적용해 보는 검증 과정입니다. 예를 들어 “20일 이동평균이 60일 이동평균을 위로 돌파하면 매수, 아래로 내려가면 매도” 같은 규칙을 과거 BTC/USDT 데이터에 적용해 결과를 확인하는 방식입니다.

다만 백테스트 결과가 좋다고 해서 앞으로도 수익이 난다는 뜻은 아닙니다. 미국 SEC 투자자 안내 문서도 과거 성과는 미래 성과를 예측하지 못한다고 설명합니다. 백테스트는 예측 도구가 아니라 전략의 약점과 리스크를 미리 드러내는 검증 도구에 가깝습니다.

먼저 알아야 할 백테스트 구조

입문자는 아래 5단계를 이해하면 됩니다.

1단계

  • 할 일: 데이터 수집
  • 예시: BTC/USDT 1일봉 OHLCV

2단계

  • 할 일: 데이터 정리
  • 예시: 시간 변환, 결측값 확인, 컬럼명 정리

3단계

  • 할 일: 전략 규칙 작성
  • 예시: 단기 이동평균 > 장기 이동평균이면 보유

4단계

  • 할 일: 수익률 계산
  • 예시: 포지션 × 다음 캔들 수익률

5단계

  • 할 일: 성과 평가
  • 예시: 누적수익률, MDD, 승률, 거래 횟수

여기서 가장 중요한 부분은 4단계입니다. 신호가 발생한 같은 봉의 종가로 바로 체결됐다고 가정하면 미래 정보를 사용한 결과가 될 수 있습니다. 그래서 보통은 오늘 만든 신호를 다음 봉 수익률에 적용하는 식으로 계산합니다.

준비물: 어떤 파이썬 도구를 쓰면 될까?

파이썬 코인 백테스트 입문에서는 아래 조합이면 충분합니다.

Python

venv + pip

pandas

NumPy

Matplotlib

JupyterLab

CCXT

backtesting.py

처음부터 백테스트 프레임워크를 쓰는 것도 가능하지만, 입문 단계에서는 pandas로 직접 계산해 보는 것이 좋습니다. 그래야 수수료, 포지션, 신호 지연, 데이터 누락이 실제 성과에 어떻게 반영되는지 이해하기 쉽습니다.

설치 순서

터미널 또는 명령 프롬프트에서 새 폴더를 만들고 아래 순서로 실행합니다.

python -m venv .venv

Windows는 아래처럼 활성화합니다.

.venv\\Scripts\\activate

macOS 또는 Linux는 아래처럼 활성화합니다.

source .venv/bin/activate

필요한 패키지를 설치합니다.

pip install pandas numpy matplotlib ccxt jupyterlab backtesting

JupyterLab을 실행하려면 아래 명령어를 입력합니다.

jupyter lab

※ 패키지 버전과 지원 환경은 업데이트될 수 있습니다. 설치 오류가 나면 공식 문서의 최신 설치 안내를 먼저 확인하는 것이 안전합니다.

코인 백테스트 데이터는 어디서 가져올까?

가장 많이 쓰는 형태는 OHLCV 데이터입니다.

O

  • 의미: Open, 시작가

H

  • 의미: High, 고가

L

  • 의미: Low, 저가

C

  • 의미: Close, 종가

V

  • 의미: Volume, 거래량

Binance Spot API의 Kline 문서는 GET /api/v3/klines 엔드포인트를 제공하며, 캔들은 open time으로 식별된다고 설명합니다. CCXT 공식 매뉴얼도 거래소가 OHLCV를 지원하는 경우 fetch_ohlcv()로 캔들 데이터를 가져올 수 있다고 안내합니다.

초보자에게는 CCXT 방식이 편합니다. 거래소별 API 차이를 어느 정도 통일해 주기 때문입니다. 다만 거래소마다 지원 기간, 요청 제한, 누락 캔들이 다를 수 있으므로 원본 거래소 API 문서도 같이 확인해야 합니다.

최소 예제: BTC/USDT 일봉 데이터 가져오기

아래 코드는 Binance의 BTC/USDT 일봉 데이터를 불러와 pandas DataFrame으로 정리하는 예시입니다.

import ccxt
import pandas as pd

exchange = ccxt.binance({
 "enableRateLimit": True
})

symbol = "BTC/USDT"
timeframe = "1d"
limit = 1000

ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)

df = pd.DataFrame(
 ohlcv,
 columns=["timestamp", "open", "high", "low", "close", "volume"]
)

df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms", utc=True)
df = df.set_index("timestamp")

print(df.tail())

이 단계에서 바로 전략을 만들지 말고 먼저 아래를 확인해야 합니다.

  • 캔들 개수가 예상과 맞는가?
  • 시간대가 UTC인지, 한국시간으로 바꿔야 하는가?
  • 중간에 누락된 날짜가 있는가?
  • 거래량이 0인 구간이 있는가?
  • 내가 원하는 현물·선물 거래쌍이 맞는가?

간단한 이동평균 백테스트 예시

아래 예시는 단기 이동평균이 장기 이동평균보다 위에 있으면 보유, 아니면 현금 보유로 가정하는 단순 전략입니다.

import numpy as np
import matplotlib.pyplot as plt

# 이동평균 계산
df["ma_short"] = df["close"].rolling(20).mean()
df["ma_long"] = df["close"].rolling(60).mean()

# 매매 신호: 단기선이 장기선 위면 1, 아니면 0
df["signal"] = np.where(df["ma_short"] > df["ma_long"], 1, 0)

# 다음 봉부터 포지션이 반영되도록 한 칸 이동
df["position"] = df["signal"].shift(1)

# 일별 수익률
df["market_return"] = df["close"].pct_change()

# 전략 수익률
df["strategy_return"] = df["position"] * df["market_return"]

# 누적 수익률
df["market_equity"] = (1 + df["market_return"]).cumprod()
df["strategy_equity"] = (1 + df["strategy_return"]).cumprod()

df[["market_equity", "strategy_equity"]].plot(figsize=(10, 5))
plt.title("BTC/USDT Simple Moving Average Backtest")
plt.grid(True)
plt.show()

이동평균 전략은 입문용 예시일 뿐입니다. 이 결과가 좋거나 나쁘다고 해서 실제 매매 전략으로 적합하다는 뜻은 아닙니다. 목적은 신호 생성 → 포지션 반영 → 수익률 계산 흐름을 이해하는 것입니다.

수수료와 슬리피지를 넣어야 하는 이유

초보자가 가장 많이 하는 실수는 거래 비용을 빼지 않는 것입니다. 코인 시장은 변동성이 크고, 잦은 매매 전략일수록 수수료와 슬리피지의 영향이 커집니다.

거래 수수료

  • 의미: 체결 시 거래소에 내는 비용
  • 백테스트 반영 방법: 거래가 발생한 날 수익률에서 차감

슬리피지

  • 의미: 원하는 가격과 실제 체결가 차이
  • 백테스트 반영 방법: 거래 발생 시 추가 비용으로 가정

스프레드

  • 의미: 매수·매도 호가 차이
  • 백테스트 반영 방법: 짧은 시간봉 전략에서 중요

펀딩비

  • 의미: 무기한 선물 보유 비용 또는 수익
  • 백테스트 반영 방법: 선물 백테스트에서 별도 반영

아래는 포지션이 바뀌는 날마다 비용을 차감하는 단순 예시입니다.

fee_rate = 0.001 # 예: 0.1%
slippage = 0.0005 # 예: 0.05%

df["trade"] = df["position"].diff().abs()
df["cost"] = df["trade"] * (fee_rate + slippage)

df["strategy_return_net"] = df["strategy_return"] - df["cost"]
df["strategy_equity_net"] = (1 + df["strategy_return_net"]).cumprod()

df[["strategy_equity", "strategy_equity_net"]].plot(figsize=(10, 5))
plt.title("Before vs After Trading Costs")
plt.grid(True)
plt.show()

※ 실제 수수료율은 거래소, VIP 등급, 메이커·테이커, 현물·선물 여부에 따라 달라집니다. 최신 수수료는 거래소 공식 페이지에서 직접 확인해야 합니다.

성과지표는 수익률만 보면 안 됩니다

백테스트 결과를 볼 때 누적수익률 하나만 보면 위험을 놓치기 쉽습니다. 최소한 아래 지표는 같이 봐야 합니다.

누적수익률

  • 의미: 전체 기간 동안 얼마나 변했는지
  • 왜 중요한가: 가장 직관적인 성과

MDD

  • 의미: 최대 낙폭
  • 왜 중요한가: 버틸 수 있는 손실인지 판단

승률

  • 의미: 이긴 거래 비율
  • 왜 중요한가: 손익비와 함께 봐야 함

평균 손익

  • 의미: 거래당 평균 수익 또는 손실
  • 왜 중요한가: 잦은 매매 전략 검증

거래 횟수

  • 의미: 매매 빈도
  • 왜 중요한가: 수수료 영향 확인

변동성

  • 의미: 수익률 흔들림
  • 왜 중요한가: 위험 대비 성과 판단

MDD는 아래처럼 계산할 수 있습니다.

equity = df["strategy_equity_net"].dropna()

running_max = equity.cummax()
drawdown = equity / running_max - 1
mdd = drawdown.min()

total_return = equity.iloc[-1] - 1

print("누적수익률:", round(total_return * 100, 2), "%")
print("MDD:", round(mdd * 100, 2), "%")

수익률이 높아도 MDD가 너무 크면 실제로 운용하기 어렵습니다. 예를 들어 누적수익률이 200%라도 중간에 -70% 낙폭이 있었다면 대부분의 투자자는 전략을 계속 유지하기 어렵습니다.

입문자가 가장 많이 하는 실수

미래 데이터 사용

  • 문제점: 실제보다 성과가 좋아짐
  • 해결 방법: 신호를 한 칸 shift

수수료 미반영

  • 문제점: 잦은 매매 전략이 과대평가됨
  • 해결 방법: 거래 발생 시 비용 차감

한 기간만 테스트

  • 문제점: 특정 장세에만 맞을 수 있음
  • 해결 방법: 상승장·하락장·횡보장 분리

파라미터 과최적화

  • 문제점: 과거에만 맞춘 전략이 됨
  • 해결 방법: 검증 구간 분리

데이터 누락 무시

  • 문제점: 왜곡된 수익률 발생
  • 해결 방법: 결측값·거래량 확인

거래소 차이 무시

  • 문제점: 실제 체결 환경과 달라짐
  • 해결 방법: 사용할 거래소 데이터로 검증

레버리지부터 적용

  • 문제점: 손실과 청산 위험 확대
  • 해결 방법: 현물 기준 구조 이해가 먼저

과최적화를 피하는 기본 방법

과최적화는 백테스트에서 가장 위험한 착각입니다. 예를 들어 이동평균 기간을 5일, 6일, 7일… 200일까지 모두 돌려서 가장 수익률이 높은 조합만 고르면 과거 데이터에만 맞춘 결과가 될 수 있습니다.

입문 단계에서는 아래 방식이 안전합니다.

  1. 전체 데이터를 훈련 구간과 검증 구간으로 나눕니다.
  2. 훈련 구간에서만 전략 규칙을 정합니다.
  3. 검증 구간에서는 파라미터를 바꾸지 않고 결과만 확인합니다.
  4. 수익률뿐 아니라 MDD와 거래 횟수를 함께 봅니다.
  5. 다른 코인, 다른 시간봉에서도 결과가 완전히 무너지지 않는지 확인합니다.

저장용 체크리스트

파이썬 코인 백테스트를 시작하기 전 아래 항목을 확인해 보세요.

  • 현물 전략인지 선물 전략인지 먼저 정했는가?
  • 사용할 거래소와 거래쌍을 정했는가?
  • OHLCV 데이터의 시간대와 누락 여부를 확인했는가?
  • 신호 발생 시점과 체결 시점을 분리했는가?
  • 수수료와 슬리피지를 반영했는가?
  • 누적수익률뿐 아니라 MDD를 계산했는가?
  • 훈련 구간과 검증 구간을 나눴는가?
  • 한 코인, 한 기간에만 맞춘 전략은 아닌가?
  • 실거래 전 소액 또는 모의 환경에서 재검증할 계획이 있는가?

자주 묻는 질문

Q1. 파이썬을 처음 배워도 코인 백테스트를 할 수 있나요?

가능합니다. 다만 처음부터 자동매매나 AI 모델로 가기보다 pandas로 OHLCV 데이터를 정리하고, 이동평균 같은 단순 전략을 계산하는 것부터 시작하는 편이 좋습니다. 백테스트는 코딩보다 데이터와 가정이 더 중요합니다.

Q2. 1분봉 백테스트가 더 정확한가요?

항상 그렇지는 않습니다. 1분봉은 데이터가 많고 체결 비용, 스프레드, 누락 캔들 영향을 더 크게 받습니다. 입문자는 1일봉이나 4시간봉으로 구조를 이해한 뒤 짧은 시간봉으로 내려가는 것이 안전합니다.

Q3. CCXT만 쓰면 모든 거래소 데이터가 똑같이 정리되나요?

아닙니다. CCXT는 거래소 API 접근을 통일해 주지만, 거래소별 데이터 제공 범위와 제한은 다를 수 있습니다. CCXT 매뉴얼도 거래소마다 OHLCV 지원 여부와 조회 가능 기간에 차이가 있을 수 있다고 안내합니다.

Q4. 백테스트 수익률이 높으면 바로 실거래해도 되나요?

아닙니다. 백테스트는 과거 검증일 뿐이고 실제 시장에서는 체결 지연, 슬리피지, 수수료, 서버 오류, 심리적 부담이 발생합니다. 실거래 전에는 검증 구간 분리, 모의투자, 소액 테스트가 필요합니다.

Q5. 현물과 선물 백테스트는 무엇이 다른가요?

현물은 보통 매수·보유·매도 구조로 계산합니다. 선물은 롱·숏, 레버리지, 펀딩비, 강제청산, 마크가격까지 고려해야 합니다. 입문자는 현물 구조를 먼저 이해한 뒤 선물 백테스트로 확장하는 것이 좋습니다.

공식 출처

함께 읽으면 좋은 글

  • 파이썬 이동평균 매매 전략 백테스트 예제
  • 바이낸스 API로 코인 시세 데이터 가져오는 법
  • 코인 백테스트 수수료·슬리피지 반영 방법
  • 바이낸스 선물 PNL·ROI 계산법

마무리

✅ 3줄 요약

  • 파이썬 코인 백테스트 입문은 데이터 수집, 신호 생성, 포지션 반영, 수익률 계산, 성과 검증 순서로 보면 됩니다.
  • 수익률보다 중요한 것은 수수료, 슬리피지, MDD, 과최적화 여부입니다.
  • 백테스트 결과는 미래 수익 보장이 아니며, 실거래 전에는 반드시 검증 구간 분리와 모의 테스트가 필요합니다.

나중에 코드를 다시 확인하려면 이 글을 저장해두세요. 실제 실습 중 오류가 발생했다면 사용한 파이썬 버전, 패키지 버전, 거래소, 거래쌍, 시간봉을 함께 기록해두면 원인을 찾기 쉽습니다.

※ 면책조항: 이 글은 파이썬 코인 백테스트 입문자를 위한 교육용 정보입니다. 특정 암호자산, 거래소, 매매 전략, 레버리지 사용을 권유하지 않습니다. 암호자산은 가격 변동성이 크고 원금 손실 위험이 있으며, 백테스트 결과는 미래 성과를 보장하지 않습니다. 실제 거래 전에는 거래소 공식 수수료, API 제한, 현지 규제, 세무 기준, 본인의 위험 감내 수준을 직접 확인해야 합니다.

태그: #파이썬코인백테스트 #코인백테스트입문 #Python백테스트 #암호화폐백테스트 #CCXT #pandas #바이낸스API #백테스트수수료 #퀀트입문

반응형

댓글