AlgoLab Blog · 퀀트·시스템·알고 · 2026

백테스팅 파이썬 라이브러리 5종 비교 — 뭘 고르고 뭘 피하나

퀀트 · 백테스팅 2026-08-01 · 약 9분 읽기 · 알고랩 AlgoLab
한 줄 요약 파라미터를 수천 개 훑어 아이디어를 거를 때는 vectorbt, 부분 체결·지정가 대기처럼 주문 흐름을 그대로 재현해야 할 때는 NautilusTrader 같은 이벤트 드리븐 엔진, 하루 만에 개념을 익힐 때는 backtesting.py가 맞습니다. backtrader는 자료가 가장 많지만 원 저장소의 개발이 2018년경 멈춘 상태라 신규 프로젝트의 1순위로 권하기 어렵고, zipline-reloaded는 팩터 파이프라인이 필요할 때만 값을 합니다. 그리고 한국 주식이라면 라이브러리보다 pykrx·FinanceDataReader·증권사 API 데이터 품질이 결과를 더 크게 바꿉니다.

"백테스팅 파이썬 라이브러리 뭐 쓰세요?"라는 질문에는 사실 두 개의 질문이 섞여 있습니다. ① 전략에 알파가 있는지 빨리 걸러내고 싶다② 실제 주문 흐름까지 흉내 내서 실전 괴리를 줄이고 싶다는 완전히 다른 요구인데, 라이브러리들은 이 둘 중 한쪽에 최적화되어 있습니다. 하나로 다 하려다 보면 어느 쪽도 제대로 안 됩니다.

이 글은 파이썬 백테스팅에서 실제로 후보에 오르는 5종 — backtrader, vectorbt, backtesting.py, zipline-reloaded, NautilusTrader — 을 같은 전략 코드로 놓고 무엇이 쉽고 무엇이 막히는지 정리했습니다. 백테스트 자체의 절차(데이터 정제 → 워크포워드 → 몬테카를로)는 자동매매 백테스트 완전 가이드에서 다뤘으니, 여기서는 도구 선택만 봅니다.

먼저 밝힙니다. 아래 유지보수 상태·기능 설명은 2026년 8월 시점에 공개된 저장소·문서를 근거로 정리한 것입니다. 오픈소스는 상태가 자주 바뀌므로, 실제 도입 전에 PyPI 페이지와 공식 저장소의 최근 커밋·릴리스 날짜를 직접 확인하세요. 또한 이 글은 정량적 방법론 설명이며 특정 전략·종목의 수익을 보장하거나 권유하지 않습니다.

이 글의 순서

  1. 먼저 갈래를 나눈다 — 이벤트 드리븐 vs 벡터라이즈드
  2. 5종 한눈 비교표
  3. backtrader — 자료는 1등, 시계는 2018년
  4. vectorbt — 속도는 압도적, 대신 표현력을 포기
  5. backtesting.py — 가장 빨리 배우는 것
  6. zipline-reloaded — 파이프라인이 필요할 때만
  7. NautilusTrader — 실전 흐름을 그대로
  8. 한국 주식의 진짜 병목은 라이브러리가 아니다
  9. 성과지표는 별도 도구로 다시 계산한다
  10. 5초 선택 가이드

1. 먼저 갈래를 나눈다 — 이벤트 드리븐 vs 벡터라이즈드

파이썬 백테스터는 크게 두 갈래입니다. 이 구분을 모르고 도구를 고르면 나중에 "왜 이게 안 되지"의 90%가 여기서 나옵니다.

이벤트 드리븐(event-driven)은 시간을 한 바(bar)씩 앞으로 밀면서, 매 시점에 그 시점까지의 정보만 보고 판단합니다. backtrader, NautilusTrader, zipline-reloaded가 여기 속합니다. 주문이 큐에 들어가고, 다음 바에서 체결되고, 미체결이 남는 과정을 그대로 흉내 낼 수 있습니다. 대신 파이썬 루프를 도니까 느립니다.

벡터라이즈드(vectorized)는 신호 전체를 numpy 배열로 만들어 한 번에 계산합니다. vectorbt가 대표입니다. 10년치 일봉에 파라미터 1,000조합을 돌려도 수 초~수십 초에 끝나는 경우가 있습니다. 대신 "이 주문이 안 나갔으면 다음 판단이 달라졌을 것"같은 경로 의존적 로직은 표현하기 까다롭습니다.

EVENT-DRIVEN — 바 단위로 전진 t1 판단 → t2 체결 → t3 잔량 → ... (순서·미체결 재현 가능 / 느림) VECTORIZED — 전 구간 한 번에 signal[] → entries/exits 배열 → 수익률 한 방에 계산 파라미터 수천 조합 스캔에 강함 / 경로 의존 로직은 표현 곤란
백테스터의 두 갈래 — 속도와 표현력의 맞교환

2. 5종 한눈 비교표

라이브러리방식강한 지점주의
backtrader이벤트 한국어 포함 예제·블로그 자료가 가장 많음. 인디케이터 내장 다수 원 저장소 개발이 2018년경 정지. 최신 파이썬·matplotlib 조합에서 설치·플롯 이슈 보고
vectorbt벡터 파라미터 스캔 속도. pandas·numpy 친화적 오픈소스판과 유료 PRO판이 나뉨. 경로 의존 로직·부분 체결 표현이 어려움
backtesting.py이벤트 API가 가장 단순. 한나절이면 첫 결과가 나옴 단일 종목 중심. 포트폴리오·다중 자산 확장에 한계
zipline-reloaded이벤트 Pipeline 구조로 팩터 리서치에 강함. 원조 Quantopian 계보 데이터를 번들로 ingest해야 시작 가능 — 환경 구성에 시간이 든다
NautilusTrader이벤트 백테스트 코드를 실전 실행으로 이어가는 설계. 주문 상태 모델이 상세 개념이 많아 학습 곡선이 가파름. 소규모 단순 전략엔 과함

3. backtrader — 자료는 1등, 시계는 2018년

한국어로 "파이썬 백테스팅"을 검색하면 절반은 backtrader 예제입니다. 문법이 직관적이고 Strategy 클래스만 상속하면 되기 때문입니다.

import backtrader as bt

class SmaCross(bt.Strategy):
    params = dict(fast=20, slow=60)

    def __init__(self):
        f = bt.ind.SMA(period=self.p.fast)
        s = bt.ind.SMA(period=self.p.slow)
        self.crossover = bt.ind.CrossOver(f, s)

    def next(self):
        if not self.position and self.crossover > 0:
            self.buy()
        elif self.position and self.crossover < 0:
            self.close()

cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCross)
cerebro.broker.setcommission(commission=0.00015)   # 수수료 0.015% 가정
cerebro.broker.setcash(10_000_000)
cerebro.run()

문제는 유지보수입니다. 원 저장소의 활발한 개발은 2018년경 멈춘 것으로 알려져 있고, 이후 커뮤니티 포크(backtrader2)가 버그 픽스 위주로 이어받은 상태입니다. 그래서 최신 파이썬이나 최신 matplotlib과 조합하면 플롯 단계에서 이런 식으로 막히는 사례가 보고됩니다.

AttributeError: module 'matplotlib.dates' has no attribute 'MinuteLocator'
# 또는
AttributeError: 'numpy.float64' object has no attribute 'array'

판단 기준. 이미 backtrader로 짜 둔 코드가 있고 잘 돌아간다면 굳이 버릴 필요는 없습니다. 다만 지금 처음 시작한다면 "몇 년 뒤 파이썬을 올릴 때 이 코드가 살아 있을까"를 먼저 물어야 합니다. 이런 종류의 리스크는 봇이 커질수록 비싸집니다.

4. vectorbt — 속도는 압도적, 대신 표현력을 포기

vectorbt는 접근 자체가 다릅니다. 전략을 "루프"가 아니라 불리언 배열 두 개(entries / exits)로 표현합니다.

import vectorbt as vbt

price = vbt.YFData.download('AAPL', start='2019-01-01').get('Close')

fast = vbt.MA.run(price, window=[5, 10, 20, 30], short_name='fast')
slow = vbt.MA.run(price, window=[60, 90, 120], short_name='slow')

entries = fast.ma_crossed_above(slow)
exits   = fast.ma_crossed_below(slow)

pf = vbt.Portfolio.from_signals(price, entries, exits, fees=0.0005)
print(pf.total_return())        # 12개 조합(4x3)이 한 번에 계산된다
print(pf.sharpe_ratio())

window=[5,10,20,30] × [60,90,120] = 12개 조합이 한 줄로 동시에 계산됩니다. 이 확장이 수천 조합까지 거의 그대로 이어집니다. 아이디어를 "일단 알파가 있나" 수준에서 거르는 단계에는 이만한 도구가 없습니다.

대가는 표현력입니다. "지정가로 걸어두고 3틱 안에 안 채워지면 취소하고 시장가로 전환" 같은 로직은 entries/exits 배열로 옮기기가 매우 번거롭습니다. 또 파라미터 조합이 늘어날수록 우연히 좋아 보이는 조합이 반드시 생깁니다. 이 함정은 백테스트 데이터 스누핑·다중검정의 함정에서 따로 정리했습니다 — vectorbt를 쓸 때 특히 중요합니다.

라이선스 확인. vectorbt는 공개판과 유료 PRO판이 나뉘어 있고, 최근 개발은 PRO 쪽에 집중되는 것으로 알려져 있습니다. 회사·상업용으로 쓸 계획이라면 사용하려는 버전의 라이선스 조건을 공식 저장소에서 직접 확인하세요.

5. backtesting.py — 가장 빨리 배우는 것

이름 그대로입니다. 배울 게 가장 적습니다. Strategy 하나, init(), next() 세 가지만 알면 첫 결과가 나옵니다.

from backtesting import Backtest, Strategy
from backtesting.lib import crossover
import pandas_ta as ta

class RsiRevert(Strategy):
    n = 14
    def init(self):
        self.rsi = self.I(lambda c: ta.rsi(c, length=self.n), self.data.Close.s)
    def next(self):
        if not self.position and self.rsi[-1] < 30:
            self.buy()
        elif self.position and self.rsi[-1] > 70:
            self.position.close()

bt = Backtest(df, RsiRevert, cash=10_000_000, commission=0.0005)
stats = bt.run()
print(stats['Return [%]'], stats['Max. Drawdown [%]'], stats['Sharpe Ratio'])

dfOpen/High/Low/Close/Volume 컬럼을 가진 pandas DataFrame이면 됩니다. 결과 객체에 수익률·MDD·샤프지수가 바로 들어 있습니다. "백테스팅이라는 걸 처음 해본다"면 여기서 시작하는 게 가장 빠릅니다.

한계는 명확합니다. 단일 종목 중심이라 20종목 포트폴리오를 리밸런싱하는 구조는 억지로 만들어야 합니다. 그 지점이 오면 도구를 갈아타야 합니다.

🛠
도구를 고르는 것까지가 이미 일입니다

백테스트 코드를 짜다가 "이게 맞게 돌아간 건가"에서 막히는 분이 많습니다. 전략만 알려주시면 알고랩이 백테스트 코드와 실전 봇을 같은 규칙으로 만들어 드립니다.

전략 한 줄만 있으면 됩니다 — 무료 상담 →

6. zipline-reloaded — 파이프라인이 필요할 때만

Quantopian이 만든 zipline은 원 저장소가 사실상 멈췄고, 지금은 커뮤니티가 유지하는 zipline-reloaded가 실질적인 후계입니다. 다른 라이브러리와 결정적으로 다른 점은 Pipeline입니다.

pip install zipline-reloaded
zipline ingest -b quandl     # 데이터를 번들로 넣어야 시작된다

Pipeline은 "전 종목에 대해 매일 팩터 값을 계산하고 상위 N개를 고른다"는 구조를 선언적으로 씁니다. 종목 선정(cross-section)이 전략의 핵심인 팩터 투자라면 이 구조가 큰 값을 합니다. 팩터 개념 자체는 퀀트 팩터 투자 입문에서 다뤘습니다.

반대로 "삼성전자 하나에 이동평균 교차" 같은 단일 종목 타이밍 전략이라면 ingest 단계에 들이는 시간이 아깝습니다. 국내 데이터를 번들로 만드는 작업은 별도 커스텀 번들 작성이 필요하다는 점도 미리 알아두세요.

7. NautilusTrader — 실전 흐름을 그대로

NautilusTrader는 나머지 넷과 목적이 다릅니다. 백테스트에 쓴 전략 코드를 그대로 실거래로 넘기는 것을 전제로 설계됐습니다. 주문 상태(SUBMITTEDACCEPTEDPARTIALLY_FILLEDFILLED)를 세밀하게 모델링하고, 이벤트 버스 위에서 전략이 돌아갑니다.

이게 왜 중요한가요? 백테스트와 실전의 괴리에서 다뤘듯, 괴리의 상당 부분은 전략 로직이 아니라 체결 과정에서 생깁니다. 백테스트에서 "종가에 전량 체결"로 가정했는데 실전에서는 부분 체결되고 남은 수량이 다음 바로 넘어가는 식이죠. 나우틸러스는 그 차이를 백테스트 단계에서 미리 드러냅니다.

단점은 학습량입니다. Actor, Instrument, Venue, ExecEngine 같은 개념을 먼저 이해해야 첫 백테스트가 돕니다. 봇 한 개를 빨리 검증하고 싶은 개인에게는 과할 수 있습니다.

8. 한국 주식의 진짜 병목은 라이브러리가 아니다

여기까지가 도구 얘기인데, 국내 시장에서 실제로 결과를 바꾸는 건 대개 데이터입니다. 라이브러리 5종 모두 pandas DataFrame을 받으므로, 입력을 어떻게 만드느냐가 남습니다.

from pykrx import stock
import FinanceDataReader as fdr

# 1) pykrx — 수정주가 옵션을 명시하지 않으면 액면분할 구간이 튄다
df = stock.get_market_ohlcv("20200101", "20261231", "005930", adjusted=True)

# 2) FinanceDataReader — 종목코드·기간만으로 간단히
df2 = fdr.DataReader('005930', '2020-01-01', '2026-07-31')

# 3) 분봉·실시간에 가까운 데이터는 증권사 API에서 직접 수집해 저장
#    KIS / 키움 REST API — 호출 제한 안에서 나눠 받아야 한다

세 가지가 특히 자주 결과를 뒤집습니다.

국내 데이터 수집 자체는 주식 데이터 수집 — pykrx·FinanceDataReader·KIS API에 정리해 뒀고, 증권사 API 발급이 처음이면 KIS API 발급부터 첫 주문까지 30분부터 보시면 됩니다.

9. 성과지표는 별도 도구로 다시 계산한다

라이브러리마다 지표 정의가 조금씩 다릅니다. 샤프지수의 무위험수익률을 0으로 두는지, MDD를 종가 기준으로 보는지 장중 저가까지 보는지, CAGR을 252거래일로 연환산하는지 365일로 하는지 — 이런 차이로 숫자가 달라집니다. 그래서 수익률 시계열만 뽑아 같은 도구로 다시 계산하는 습관이 안전합니다.

import quantstats as qs
# returns: 일별 수익률 pandas Series
qs.reports.metrics(returns, mode='full')

# 출력 예 (형식만 표시 — 값은 전략·기간마다 다릅니다)
# Sharpe            0.8x
# Max Drawdown     -1x.xx%
# CAGR              x.xx%
# Sortino           1.xx

pyfolio도 같은 역할을 하지만 최근에는 quantstats 쪽 사용 사례가 더 많이 보입니다. 지표를 어떻게 읽어야 하는지는 아래 관련 글의 백테스트 리포트 편에 정리했습니다.

YMYL 주의. 샤프지수·MDD·CAGR은 과거 데이터에 대한 학술적 계산일 뿐입니다. 과거 성과는 미래 수익을 보장하지 않으며, 어떤 지표 조합도 손실 가능성을 없애지 못합니다. 수치의 정의와 계산 방식은 각 라이브러리 공식 문서에서 확인하세요.

10. 5초 선택 가이드

그리고 어느 쪽을 고르든, 백테스트 결과를 실전으로 옮기기 전에 실전 투입 전 3단계 검증은 건너뛰지 마세요. 도구가 바뀌어도 이 절차는 바뀌지 않습니다.

자주 묻는 질문

Q. backtrader는 지금 써도 되나요?

원 저장소의 활발한 개발은 2018년경 멈춘 것으로 알려져 있고, 커뮤니티 포크 backtrader2가 버그 픽스 위주로 유지됩니다. 기존 코드는 계속 써도 되지만 신규 1순위로는 권하기 어렵습니다. 현재 상태는 PyPI·공식 저장소에서 확인하세요.

Q. vectorbt와 backtrader 중 뭐가 빠른가요?

파라미터 스캔이면 vectorbt가 압도적입니다. 벡터라이즈드로 numpy 배열 연산을 쓰기 때문입니다. 다만 부분 체결·지정가 대기 같은 경로 의존 로직은 이벤트 드리븐 쪽이 표현하기 쉽습니다.

Q. 한국 주식 데이터는 어디서 받나요?

일봉은 pykrx·FinanceDataReader, 분봉·실시간은 KIS나 키움 REST API에서 직접 수집합니다. 수정주가 반영과 상장폐지 종목 포함 여부를 반드시 확인하세요.

Q. 성과지표는 라이브러리가 다 계산해 주나요?

기본 지표는 제공하지만 정의가 다를 수 있습니다. quantstatspyfolio로 수익률 시계열을 다시 넘겨 같은 기준으로 계산해 비교하세요.

Q. 백테스트가 잘 나오면 실전에 바로 써도 되나요?

아니요. 슬리피지·수수료·부분 체결·API 지연이 추가로 들어옵니다. 워크포워드 검증과 소액 실계좌 단계를 거친 뒤 판단하세요. 과거 성과는 미래를 보장하지 않습니다.

마무리

백테스팅 파이썬 라이브러리 선택은 취향 문제가 아니라 목적 문제입니다. 아이디어를 거르는 단계와 실전 괴리를 줄이는 단계는 요구가 정반대라서, 실제로는 두 개를 단계별로 나눠 쓰는 경우가 많습니다 — vectorbt로 후보를 좁히고, 이벤트 드리븐 엔진으로 체결까지 확인하는 식으로요.

도구를 고르고 코드를 짜는 데 걸리는 시간보다, 결과를 믿어도 되는지 판단하는 데 훨씬 많은 시간이 듭니다. 그 부분을 줄이고 싶다면 알고랩이 백테스트 코드와 실전 봇을 같은 규칙으로 만들어 드립니다.

백테스트부터 실전 봇까지 한 번에

전략만 정해지면 백테스트 코드와 실거래 봇을 같은 규칙으로 제작해 드립니다.
24시간 빠른 답변 가능합니다.

무료 상담 시작하기