백테스트 도구를 고르는 질문은 사실 “어떤 전략을 검증하려 하는가”와 “검증 다음에 무엇을 할 것인가”다. 이 둘이 정해지면 선택은 거의 자동으로 나온다.
그리고 도구보다 중요한 게 하나 더 있다. 백테스트 결과를 무의미하게 만드는 오류들이다. 이걸 모르면 어떤 도구를 써도 화려한 수익 곡선과 실전 손실을 동시에 얻는다. 도구 비교 다음에 그 얘기를 한다.
세 도구의 성격
Vectorbt — 속도와 파라미터 탐색
전체 가격 데이터를 배열로 놓고 벡터 연산으로 한 번에 계산한다. 반복문으로 캔들을 하나씩 도는 방식과 근본적으로 다르다. 그래서 파라미터 조합 수천 개를 한꺼번에 돌리는 작업에서 압도적이다.
import vectorbt as vbt
price = vbt.YFData.download("BTC-USD").get("Close")
# RSI 임계값 조합을 한 번에 탐색
rsi = vbt.RSI.run(price, window=[7, 14, 21])
entries = rsi.rsi_crossed_below(30)
exits = rsi.rsi_crossed_above(70)
pf = vbt.Portfolio.from_signals(price, entries, exits, fees=0.001)
print(pf.total_return())
약점은 로직이 복잡해질 때다. “직전 포지션의 손익에 따라 다음 주문 크기를 바꾼다” 같은 순차 의존이 들어가면 벡터화가 어려워진다. 신호 기반의 단순한 진입·청산 전략에 가장 잘 맞는다.
Backtrader — 이벤트 기반의 표준
캔들을 하나씩 순회하며 그때마다 전략 코드를 호출한다. 실제 거래와 시간 흐름이 같아서 복잡한 주문 로직을 그대로 표현할 수 있다. 지정가·손절·추적손절 주문, 분할 진입, 포지션별 관리가 자연스럽다.
import backtrader as bt
class RsiStrategy(bt.Strategy):
params = dict(period=14, low=30, high=70)
def __init__(self):
self.rsi = bt.indicators.RSI(period=self.p.period)
def next(self):
if not self.position and self.rsi < self.p.low:
self.buy()
elif self.position and self.rsi > self.p.high:
self.close()
약점은 속도다. 파이썬 반복문이라 파라미터를 대량으로 훑는 작업에는 부적합하다. 자료가 많고 예제가 풍부해 배우기 좋다는 점은 큰 장점이다.
Freqtrade — 백테스트에서 실거래까지
백테스트 프레임워크가 아니라 거래 봇이다. 백테스트, 파라미터 최적화, 페이퍼 트레이딩, 실거래가 하나의 도구 안에 있고, 거래소 연동과 텔레그램 알림 같은 운영 요소가 기본 제공된다.
freqtrade download-data --exchange binance -t 1h --days 365
freqtrade backtesting --strategy MyStrategy --timerange 20250101-20260101
freqtrade hyperopt --strategy MyStrategy --hyperopt-loss SharpeHyperOptLoss
강점은 백테스트와 실거래 코드가 같다는 점이다. 검증한 전략을 옮겨 적는 과정에서 생기는 불일치가 없다. 약점은 프레임워크의 구조를 따라야 한다는 것과, 암호화폐에 특화돼 있다는 것이다.
어느 것을 쓸까
| 상황 | 선택 |
|---|---|
| 파라미터 수천 개 탐색, 아이디어 빠른 검증 | Vectorbt |
| 복잡한 주문·포지션 로직, 학습 목적 | Backtrader |
| 검증 후 바로 실거래, 운영까지 한 번에 | Freqtrade |
| 여러 자산·시장을 함께 | Backtrader 또는 Vectorbt |
실무적으로는 조합이 흔하다. Vectorbt로 후보 파라미터 영역을 좁히고, 그 결과를 Freqtrade나 Backtrader에서 현실적인 수수료·슬리피지 조건으로 재검증하는 식이다.
백테스트를 무의미하게 만드는 것들
도구보다 중요하다.
1. 미래 참조 편향(Lookahead Bias)
그 시점에 알 수 없었던 정보를 쓰는 것. 가장 흔하고 가장 치명적이다.
- 아직 안 끝난 캔들의 종가로 매매 판단을 한다
- 지표를 계산할 때 전체 기간 데이터로 정규화한다
- 현재 상장된 종목만으로 과거를 테스트한다(생존 편향)
증상은 명확하다. 비현실적으로 매끄러운 수익 곡선이다. 백테스트 수익률이 너무 좋으면 전략이 훌륭한 게 아니라 버그일 가능성이 훨씬 높다.
2. 비용 누락
- 거래 수수료: 매수·매도 양쪽에 붙는다. 단타일수록 치명적이다
- 슬리피지: 원하는 가격에 체결되지 않는다. 유동성이 낮은 종목에서 크다
- 선물 펀딩비: 무기한 선물에서는 포지션 유지 비용이 계속 나간다. 이걸 빼면 장기 보유 전략의 결과가 통째로 바뀐다
수수료 0으로 돌린 백테스트는 검증이 아니라 상상이다.
3. 데이터 품질
- 거래소 API의 과거 데이터에 결측 캔들이 있다
- 거래소마다 가격이 다르다. 백테스트한 거래소와 실거래 거래소를 맞춰야 한다
- 상장 폐지된 코인을 빼고 테스트하면 결과가 좋게 나온다(생존 편향)
4. 과최적화
파라미터를 수천 개 훑어 가장 좋은 조합을 고르는 것 자체가 위험하다. 과거에 가장 잘 맞은 조합은 대체로 미래에 안 맞는다. 최소한의 방어는 기간을 나누는 것이다. 앞 기간으로 최적화하고 뒤 기간(한 번도 안 본 데이터)으로 검증한다. 뒤 기간 성과가 무너지면 과최적화다.
시작하는 순서
- 아이디어를 Vectorbt로 빠르게 훑는다 — 가능성이 있는지만 본다
- 수수료·슬리피지·펀딩비를 현실적으로 넣고 다시 돌린다 — 여기서 대부분 탈락한다
- 살아남은 것을 학습 기간/검증 기간으로 나눠 확인한다
- 페이퍼 트레이딩으로 실시간 환경에서 검증한다
- 그다음에 소액 실거래
⚠️ 투자 판단과 손실의 책임은 전적으로 본인에게 있다. 이 글은 도구 비교이며 특정 전략이나 수익을 보장하지 않는다. 백테스트 성과는 미래 수익을 보장하지 않으며, 암호화폐는 변동성이 매우 크다.

Leave a Reply