본문 바로가기
  • "Backtest, backtest, backtest." - Martin Schwartz
[백테스팅] 소개

Python 기반의 주식 백테스팅 도구들: Backtrader, PyAlgoTrade, Zipline 소개

by Eirene 2023. 3. 20.
반응형

Python 기반의 주식 백테스팅 도구들

 

안녕하세요! 이번에는 주식 Python 기반 백테스팅 도구에 대해 알아보겠습니다. 백테스팅은 투자 전략의 유효성을 검증하고 향후 수익성을 예측하는 데 매우 유용한 도구입니다. Python 기반의 백테스팅 도구는 이를 더욱 쉽고 효과적으로 수행할 수 있게 해줍니다.

  1. Backtrader: https://www.backtrader.com/
  2. PyAlgoTrade: https://github.com/gbeced/pyalgotrade
  3. Zipline: https://www.zipline.io/

 

Backtrader

 

Welcome - Backtrader

Welcome to backtrader! A feature-rich Python framework for backtesting and trading backtrader allows you to focus on writing reusable trading strategies, indicators and analyzers instead of having to spend time building infrastructure. Open Source - GitHub

www.backtrader.com

Backtrader는 Python 기반의 오픈소스 백테스팅 프레임워크입니다. 사용자는 Backtrader를 이용하여 다양한 백테스팅 전략을 시뮬레이션하고 결과를 시각화할 수 있습니다. Backtrader는 Cerebro 라는 객체를 이용하여 백테스팅을 수행하며, 사용자가 직접 백테스팅 전략을 개발할 수도 있습니다.

Moving Average를 이용하여 매수와 매도 시점을 결정하는 간단한 사용 예제는 아래와 같습니다. 

import backtrader as bt

class MovingAverageCrossStrategy(bt.Strategy):

    params = (
        ('fast', 20),
        ('slow', 50),
    )

    def __init__(self):
        self.fast_ma = bt.indicators.SimpleMovingAverage(
            self.data.close, period=self.params.fast
        )
        self.slow_ma = bt.indicators.SimpleMovingAverage(
            self.data.close, period=self.params.slow
        )
        self.crossover = bt.indicators.CrossOver(self.fast_ma, self.slow_ma)

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

if __name__ == '__main__':
    cerebro = bt.Cerebro()
    cerebro.addstrategy(MovingAverageCrossStrategy)
    data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2010, 1, 1), todate=datetime(2021, 1, 1))
    cerebro.adddata(data)
    cerebro.run()
    cerebro.plot()
위의 코드에서는 MovingAverageCrossStrategy 클래스를 정의하여 매수와 매도 시점을 결정하는 전략을 구현하였습니다. 이후 Cerebro 객체를 생성하고 addstrategy() 함수를 이용하여 전략을 추가하였습니다. YahooFinanceData를 이용하여 데이터를 불러오고, adddata() 함수를 이용하여 Cerebro에 데이터를 추가하였습니다. 마지막으로 run() 함수를 호출하여 백테스팅을 실행하고, plot() 함수를 호출하여 결과를 시각화하였습니다.

 

PyAlgoTrade

 

GitHub - gbeced/pyalgotrade: Python Algorithmic Trading Library

Python Algorithmic Trading Library. Contribute to gbeced/pyalgotrade development by creating an account on GitHub.

github.com

PyAlgoTrade는 Python 기반의 오픈소스 백테스팅 프레임워크입니다. 사용자는 PyAlgoTrade를 이용하여 다양한 백테스팅 전략을 시뮬레이션하고 결과를 시각화할 수 있습니다. PyAlgoTrade는 시계열 데이터와 같은 다양한 종류의 데이터를 다룰 수 있으며, 사용자가 직접 백테스팅 전략을 개발할 수도 있습니다.

이동평균선을 이용하여 매수와 매도 시점을 결정하는 간단한 사용 예제는 아래와 같습니다. 

from pyalgotrade import strategy
from pyalgotrade import dataseries
from pyalgotrade.technical import ma
from pyalgotrade.tools import yahoofinance
from pyalgotrade import plotter

class MyStrategy(strategy.BacktestingStrategy):
    
    def __init__(self, feed, instrument, smaPeriod):
        super(MyStrategy, self).__init__(feed)
        self.__instrument = instrument
        self.__position = None
        self.__sma = ma.SMA(feed[instrument].getPriceDataSeries(), smaPeriod)

    def onEnterOk(self, position):
        execInfo = position.getEntryOrder().getExecutionInfo()
        self.info("BUY at $%.2f" % (execInfo.getPrice()))

    def onExitOk(self, position):
        execInfo = position.getExitOrder().getExecutionInfo()
        self.info("SELL at $%.2f" % (execInfo.getPrice()))

    def onBars(self, bars):
        if self.__sma[-1] is None:
            return
        bar = bars[self.__instrument]
        if self.__position is None:
            if bar.getPrice() > self.__sma[-1]:
                shares = int(self.getBroker().getCash() / bar.getPrice())
                self.__position = self.enterLong(self.__instrument, shares)
        elif bar.getPrice() < self.__sma[-1] and not self.__position.exitActive():
            self.__position.exitMarket()

if __name__ == "__main__":
    # Yahoo Finance로부터 데이터 다운로드
    feed = yahoofinance.build_feed(["AAPL"], 2011, 2012, ".")

    # 전략 초기화
    strategy = MyStrategy(feed, "AAPL", 20)

    # 포트폴리오 밸런스 설정
    strategy.setBroker(strategy.getBroker())

    # 결과 출력
    plt = plotter.StrategyPlotter(strategy)
    plt.getInstrumentSubplot("AAPL").addDataSeries("SMA", strategy.getSMA())
    plt.plot()
위의 코드에서는 MyStrategy 클래스를 정의하여 이동평균선을 이용한 매수/매도 전략을 구현하였습니다. 이후 build_feed() 함수를 이용하여 Yahoo Finance로부터 데이터를 다운로드하고, MyStrategy 클래스를 이용하여 백테스팅을 수행하였습니다. 최종적으로, StrategyPlotter 클래스를 이용하여 결과를 시각화하였습니다.

PyAlgoTrade의 전략 구현 방법은 Backtrader와 유사하지만, 구체적인 구현 방법은 다르기 때문에 PyAlgoTrade 공식 문서에서 확인할 수 있는 예제 코드를 참고하는 것이 좋습니다.

 

Zipline

 

Frontline compliance management for healthcare | Zipline

Making compliance management simple for healthcare, aged care and skilled nursing facilities. Contact us today.

www.zipline.io

Zipline은 Python 기반의 오픈소스 백테스팅 프레임워크로, Quantopian에서 개발한 것입니다. Zipline은 다양한 백테스팅 전략을 시뮬레이션하고 결과를 시각화할 수 있으며, 사용자가 직접 백테스팅 전략을 개발할 수도 있습니다. 또한, Zipline은 pandas 라이브러리를 이용하여 데이터를 처리합니다.

이동평균선을 이용하여 매수와 매도 시점을 결정하는 간단한 사용 예제는 아래와 같습니다. 

from zipline.api import order, record, symbol
from zipline.algorithm import TradingAlgorithm
from zipline.utils.factory import load_from_yahoo

def initialize(context):
    context.security = symbol('AAPL')
    context.i = 0

def handle_data(context, data):
    # 이동평균 계산
    short_ma = data.history(context.security, 'price', 20, '1d').mean()
    long_ma = data.history(context.security, 'price', 50, '1d').mean()

    # 매수 조건 확인
    if short_ma > long_ma:
        order(context.security, 100)
    # 매도 조건 확인
    elif short_ma < long_ma:
        order(context.security, -100)

    # 결과 기록
    record(AAPL=data.current(context.security, 'price'),
           short_ma=short_ma,
           long_ma=long_ma)

if __name__ == '__main__':
    # 데이터 다운로드
    data = load_from_yahoo(stocks=['AAPL'], indexes={}, start="2000-01-01", end="2014-12-31")

    # 초기화 및 알고리즘 실행
    algo = TradingAlgorithm(initialize=initialize, handle_data=handle_data)
    results = algo.run(data)

    # 결과 출력
    results.portfolio_value.plot()
위의 코드에서는 initialize() 함수를 이용하여 초기화를 수행하고, handle_data() 함수를 이용하여 이동평균선을 이용한 매수/매도 전략을 구현하였습니다. 이후 load_from_yahoo() 함수를 이용하여 데이터를 다운로드하고, TradingAlgorithm 클래스를 이용하여 알고리즘을 실행하였습니다. 마지막으로, 결과를 시각화하였습니다.

 

결론

위의 세 가지 도구는 모두 Python 기반의 오픈소스 백테스팅 도구로, 다양한 백테스팅 전략을 시뮬레이션하고 결과를 시각화할 수 있습니다. 이러한 도구를 사용하면 사용자는 더욱 쉽고 효과적으로 백테스팅을 수행할 수 있습니다.

백테스팅은 과거의 데이터를 사용하여 실제로 수행된 거래를 시뮬레이션하는 방법을 제공합니다. 이를 통해 사용자는 투자 전략이 어떻게 작동하는지 이해할 수 있으며, 이를 토대로 더 나울 투자 결정을 내리는 데 도움을 얻을 수 있습니다. 그러나 백테스팅 결과가 100% 정확하다는 것은 보장할 수 없습니다. 미래의 시장 변동성, 불확실성 등의 요인을 완전히 예측할 수 없기 때문입니다.

 

따라서, 백테스팅 결과를 무조건적으로 신뢰해서는 안 되며, 이를 참고하여 투자 결정을 내리는 것이 좋습니다. 또한, 백테스팅 결과를 이용한 투자 전략 개발에는 데이터 오버핏팅 등의 위험이 있으므로, 이에 대한 주의가 필요합니다.

 

Python 기반의 백테스팅 도구를 사용하면 사용자는 다양한 백테스팅 전략을 쉽고 효과적으로 시뮬레이션하고 결과를 시각화할 수 있습니다. 이를 통해 사용자는 더 나은 투자 전략을 개발하고, 효과적으로 투자 결정을 내릴 수 있습니다. 따라서, Python 기반의 백테스팅 도구는 주식 투자자에게 매우 유용한 도구 중 하나입니다.

728x90
반응형

댓글