경제와 데이터 분석/데이터 분석

백테스팅은 뭘로 할까? 백테스팅 라이브러리 전격 비교

AI 동키 2024. 1. 31. 20:32
반응형

백테스팅이란?

백테스팅(Backtesting)은 과거의 데이터를 기반으로 특정 전략이나 모델을 평가하는 과정입니다. 

이 방법은 주로 금융 분야에서, 특히 주식, 외환, 또는 기타 금융상품의 거래 전략의 효과를 평가하는 데 사용됩니다. 

백테스팅은 과거 시장 데이터에 기반하여 투자 전략이 과거에 어떻게 수행되었는지를 분석함으로써, 해당 전략의 유효성과 위험을 평가할 수 있게 해줍니다.

 

얼마동안의 데이터가 필요할까?

백테스팅을 수행할 때 데이터의 사용 기간은 전략, 데이터 가용성, 그리고 분석하고자 하는 시장의 특성에 따라 달라집니다. 일반적인 지침은 다음과 같습니다:

일캔들 (일간 데이터)

  1. 기간: 일간 데이터 백테스팅은 일반적으로 최소 3년에서 10년 정도의 데이터를 사용합니다. 장기 투자 전략을 평가하는 데 적합하며, 여러 시장 사이클을 포함할 수 있도록 충분히 긴 기간을 포괄하는 것이 중요합니다.
  2. 목적: 일간 데이터는 장기적인 시장 동향을 분석하고, 대규모 경제 사이클과 시장 변동성을 이해하는 데 유용합니다. 또한, 장기 투자 전략, 경향 추종 전략, 매매 시그널 발생 빈도가 낮은 전략에 적합합니다.

분캔들 (분간 데이터)

  1. 기간: 분간 데이터 백테스팅은 일반적으로 몇 달에서 1년 정도의 데이터를 사용합니다. 이는 일간 데이터에 비해 데이터 포인트가 훨씬 많기 때문에, 같은 기간 동안 더 많은 정보를 포함하고 있습니다.
  2. 목적: 분간 데이터는 단기적인 가격 움직임과 시장 반응을 분석하는 데 적합합니다. 고빈도 거래 전략, 일일 거래, 스캘핑 전략 같이 빠른 매매가 필요한 전략에 주로 사용됩니다.

백테스팅은 어떤 데이터를 활용할까요? 

 


백테스팅을 위한 주요 라이브러리 세 가지를 비교해보겠습니다.


Backtrader

- 바로가기 : https://www.backtrader.com/

파이썬 기반의 강력하고 유연한 백테스팅 라이브러리로, 다양한 데이터 소스와 브로커와의 통합, 다중 전략 실행, 시각화 도구 등을 제공합니다. 초보자부터 전문가까지 사용할 수 있으며, 맞춤화가 쉬운 것이 특징입니다.

사용법에 대한 매뉴얼이 잘 구성되어있고, 커뮤니티가 활성화 되어있습니다. CSV, Pandas 등의 라이브러리와 호환성이 좋습니다. 

 

장점

  1. 유연성 및 확장성: Backtrader는 고급 사용자에게 매우 유연한 환경을 제공합니다. 사용자는 자신의 필요에 맞게 다양한 전략, 지표, 최적화 기법을 구현할 수 있습니다.
  2. 다중 데이터 피드 지원: 여러 데이터 피드를 동시에 처리할 수 있어, 암호화폐 시장에서 다양한 코인의 데이터를 병렬로 분석하는 데 유용합니다.
  3. 실시간 거래와의 통합: 실시간 데이터 피드 및 브로커와의 통합이 가능합니다. 이는 암호화폐 시장에서 매우 중요한 요소로, 실시간 시장 조건에서 전략을 테스트하고 실행할 수 있습니다.

 

단점

  1. 학습 곡선: 기능이 풍부한 만큼 학습 곡선이 가파를 수 있습니다. 초보자보다는 경험이 많은 사용자에게 더 적합합니다.
  2. 리소스 집약적: 복잡한 전략과 큰 데이터 세트를 사용할 경우, 상대적으로 많은 컴퓨팅 자원을 요구할 수 있습니다.

암호화폐 시장 활용성: Backtrader는 암호화폐 시장의 변동성과 높은 주문 빈도를 처리할 수 있는 강력한 기능을 제공합니다. 특히, 여러 코인에 대한 동시 백테스팅과 실시간 데이터 통합 기능은 암호화폐 시장에서 매우 유용합니다.

 

Moving Average 코드 예제

간단한 이동 평균 전략을 구현하는 코드 예제를 작성해보겠습니다. 이 예제는 Python의 Backtrader 라이브러리를 사용합니다. 코드는 주어진 데이터에 대해 단순 이동 평균(SMA)을 계산하고, 이동 평균 위나 아래에서 가격이 교차할 때 매수 또는 매도 신호를 생성합니다.

import backtrader as bt

# 이동 평균 전략
class MovingAverageStrategy(bt.Strategy):
    params = (('ma_period', 20), )

    def __init__(self):
        self.ma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.ma_period)

    def next(self):
        if self.data.close[0] > self.ma[0]:
            if not self.position:
                self.buy()
        elif self.data.close[0] < self.ma[0]:
            if self.position:
                self.sell()

# 백테스팅 엔진 설정
cerebro = bt.Cerebro()
cerebro.addstrategy(MovingAverageStrategy)

# 데이터 로드 (여기서는 예제를 위한 샘플 데이터를 사용)
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2010, 1, 1), todate=datetime(2020, 12, 31))
cerebro.adddata(data)

# 백테스팅 시작
cerebro.run()

Zipline

- 바로가기 : https://www.zipline.io/

가장 널리 알려진 백테스팅 라이브러리로 퀸토피언 커뮤니티층이 탄탄하고 두터워 매우 활동적이라는 매력이 있었습니다. 하지만 2017년 로컬 데스크톱에서 개발할 때 Zipline에서 자동매매 연계 기능이 사라짐과 동시에 한물갔습니다. 업데이트도 2020년 이후로 이뤄지지 않고 있어서 파이썬 2.7, 3.5, 3.6(이것도 업뎃된거)을 지원하고 최신버전에 사용이 제약이 있습니다.

 

 

GitHub - stefan-jansen/zipline-reloaded: Zipline, a Pythonic Algorithmic Trading Library

Zipline, a Pythonic Algorithmic Trading Library. Contribute to stefan-jansen/zipline-reloaded development by creating an account on GitHub.

github.com

이에 zipline-reloaded라는 이름으로 업데이트를 지속해 나가고 있다.

 

장점

  • 퀀토피언 플랫폼에서 제공하는 강력한 클라우드 컴퓨팅 자원을 사용
  • 다양한 데이터를 무료로 사용할 수 있으며 프리미엄 데이터는 구독료 일부를 지불하면 사용 가능
  • 트레이딩 전략을 공개하고 다른 사용자들과 서로 경쟁 할 수 있으며, 가장 좋은 성과를 내면 우승금을 받을 수 있음
  • 향후 관련 업계에서 일하고 싶은 전문 투자자 지망색은 트랙 레코드를 쌓을 수 있음

단점

  • 확장성이 뛰어나지 않음
  • 실시간 트레이딩을 지원하는 패키지(zipline-live)라는 특정 브로커를 이용해야만 사용할 수 있음
  • 자신의 전략을 퀸토피언에게 제공해야만 한다

 


PyAlgoTrade

- 바로가기 : https://github.com/gbeced/pyalgotrade   and   https://gbeced.github.io/pyalgotrade/

사용자 친화적인 파이썬 백테스팅 라이브러리로, 단순성과 확장성을 중시합니다. 기본적인 백테스팅 기능 외에도, 최적화 도구와 기술적 분석 지표를 지원합니다. PyAlgoTrade는 비교적 간단한 전략을 빠르게 테스트하고 싶은 사용자에게 적합합니다.

모의 트레이딩 및 실제 트레이딩을 위한 백테스팅 프레임 워크입니다. 야후파이낸스와 닌자트레이더로부터의 데이터 그리고 Quandl과 같은 CSV 형태의 데이터를 처리할 수 있으며, 다양한 주문 처리 방식에 대한 기능들도 제공합니다. 또한 Bitstamp를 통한 비트코인 트레이딩도 가능하며, 실시간 트위터를 통한 이벤트 처리 기능도 제공합니다.

from pyalgotrade import strategy
from pyalgotrade.barfeed import quandlfeed
from pyalgotrade.technical import ma


def safe_round(value, digits):
    if value is not None:
        value = round(value, digits)
    return value


class MyStrategy(strategy.BacktestingStrategy):
    def __init__(self, feed, instrument):
        super(MyStrategy, self).__init__(feed)
        # We want a 15 period SMA over the closing prices.
        self.__sma = ma.SMA(feed[instrument].getCloseDataSeries(), 15)
        self.__instrument = instrument

    def onBars(self, bars):
        bar = bars[self.__instrument]
        self.info("%s %s" % (bar.getClose(), safe_round(self.__sma[-1], 2)))


# Load the bar feed from the CSV file
feed = quandlfeed.Feed()
feed.addBarsFromCSV("orcl", "WIKI-ORCL-2000-quandl.csv")

# Evaluate the strategy with the feed's bars.
myStrategy = MyStrategy(feed, "orcl")
myStrategy.run()


Backtesting

- 바로가기 : https://github.com/kernc/backtesting.py

비교적 신생 라이브러리입니다.

Backtrader의 비전을 이어 받아 만들어져 사용법도 굉장히 유사합니다.

Backtrader과 비교해 matplotlib가 아닌 bokeh를 썼는데 시각화가 더 깔끔하다. 향후 업데이트가 계속 이루어진다면 기대가 되는 라이브러리입니다.

TA-Lib이나 Tulip과의 엄청난 호환성을 자랑하며, 아주 빠른 속도로 파라미터 최적화 기능까지 탑재하고 있어, 초심자들이 매우 편리하게 사용할 수 있는 도구입니다.

 

장점

  • 깔끔한 시각화
  • Backtrader를 사용해봤다면 익숙한 사용법
  • 기술적 지표 라이브러리인 TALib와 Tupli과의 호환성

 

단점

  • 아직은 지원하는 기능이 Backtrader에 비해 빈약
  • 소스 및 docs도 아직 작성중인 미완단계

 

from backtesting import Backtest, Strategy
from backtesting.lib import crossover

from backtesting.test import SMA, GOOG


class SmaCross(Strategy):
    n1 = 10
    n2 = 20

    def init(self):
        close = self.data.Close
        self.sma1 = self.I(SMA, close, self.n1)
        self.sma2 = self.I(SMA, close, self.n2)

    def next(self):
        if crossover(self.sma1, self.sma2):
            self.buy()
        elif crossover(self.sma2, self.sma1):
            self.sell()


bt = Backtest(GOOG, SmaCross,
              cash=10000, commission=.002,
              exclusive_orders=True)

output = bt.run()
bt.plot()

 

OUTPUT

Start                     2004-08-19 00:00:00
End                       2013-03-01 00:00:00
Duration                   3116 days 00:00:00
Exposure Time [%]                       94.27
Equity Final [$]                     68935.12
Equity Peak [$]                      68991.22
Return [%]                             589.35
Buy & Hold Return [%]                  703.46
Return (Ann.) [%]                       25.42
Volatility (Ann.) [%]                   38.43
Sharpe Ratio                             0.66
Sortino Ratio                            1.30
Calmar Ratio                             0.77
Max. Drawdown [%]                      -33.08
Avg. Drawdown [%]                       -5.58
Max. Drawdown Duration      688 days 00:00:00
Avg. Drawdown Duration       41 days 00:00:00
# Trades                                   93
Win Rate [%]                            53.76
Best Trade [%]                          57.12
Worst Trade [%]                        -16.63
Avg. Trade [%]                           1.96
Max. Trade Duration         121 days 00:00:00
Avg. Trade Duration          32 days 00:00:00
Profit Factor                            2.13
Expectancy [%]                           6.91
SQN                                      1.78
_strategy              SmaCross(n1=10, n2=20)

 


최고의 라이브러리는 없습니다.

백테스팅 프레임워크를 만들고자 하는 사용자의 니즈와 성향, 그리고 목적에 따라 어떤 라이브러리를 사용해야 할지가 결정되기 때문입니다. 따라서 자신에게 맞는 라이브러리를 사용하는 것이 최적의 선택이며, 이를 위해서는 결국 여러번의 시행착오와 연습을 통해 자신에게 적합한 라이브러리를 발견하는 과정이 필요합니다. 

일단 도전해봅시다!!

 

저의 선택은,

먼저 backtesting으로 정했습니다.

우선 목표 달성을 위해 backtesting에 집중하여 진행해보고 어느정도 기술이 쌓였다 싶을 때, 

backtrader 를 스터디해보고, 

그 다음에 필요 시 pyalgotrading 으로 넘어가는 방법으로 진행해보고 싶습니다.

어디에 정착하게 될지는 잘 모르겠네요.

 

 

반응형