카테고리 없음

[Python] 볼린저 밴드 전략으로 구현된 백테스팅

indigenthuman 2024. 8. 31. 16:28

볼린저 밴드 전략으로 구현된 백테스팅

주식 거래에서 전략을 검증하는 것은 성공적인 투자 결정을 내리는 데 매우 중요합니다. 이번 포스트에서는 파이썬의 backtrader 라이브러리를 사용하여 볼린저 밴드(Bollinger Bands) 전략을 기반으로 한 백테스팅을 수행하는 방법을 설명하겠습니다.

라이브러리 설치

백테스팅을 위해 backtrader와 yfinance 라이브러리를 사용합니다. 아래 명령어로 두 라이브러리를 설치할 수 있습니다.

pip install backtrader yfinance

코드 설명

아래는 볼린저 밴드 전략을 활용한 백테스팅을 위한 파이썬 코드입니다.

import backtrader as bt
import yfinance as yf
from datetime import datetime

# yfinance로 데이터 가져오기
data = yf.download('087010.KQ', start='2017-01-01', end='2024-08-27')

# 데이터프레임을 Backtrader로 변환
data_bt = bt.feeds.PandasData(dataname=data)


class BollingerBandsStrategy(bt.Strategy):
    def __init__(self):
        self.bbands = bt.indicators.BollingerBands(self.data.close, period=20, devfactor=2.0)

    def next(self):
        if not self.position:
            if self.data.close < self.bbands.lines.bot:  # 종가가 하단 밴드 아래로 떨어질 때 매수
                self.order = self.buy()
        else:
            if self.data.close > self.bbands.lines.top:  # 종가가 상단 밴드 위로 올라갈 때 매도
                self.order = self.sell()


class FullSizer(bt.Sizer):
    def _getsizing(self, comminfo, cash, data, isbuy):
        if isbuy:  # 매수일 때
            return cash // data.close[0]  # 모든 현금을 사용하여 최대한 매수
        else:  # 매도일 때
            return self.broker.getposition(data).size  # 보유한 전체 수량을 매도


cerebro = bt.Cerebro()
cerebro.addstrategy(BollingerBandsStrategy)
cerebro.adddata(data_bt)
cerebro.broker.setcash(10000000)
cerebro.addsizer(FullSizer)

print(f'Initial Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW')
cerebro.run()
print(f'Final Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW')
cerebro.plot()

코드 상세 설명

라이브러리 임포트

import backtrader as bt
import yfinance as yf
from datetime import datetime
  • backtrader: 백테스팅 및 트레이딩 시스템 구축을 위한 라이브러리입니다.
  • yfinance: Yahoo Finance에서 주가 데이터를 다운로드하는 라이브러리입니다.
  • datetime: 날짜 및 시간 처리를 위한 라이브러리입니다.

데이터 다운로드 및 변환

data = yf.download('087010.KQ', start='2017-01-01', end='2024-08-27')
data_bt = bt.feeds.PandasData(dataname=data)
  • yf.download(): Yahoo Finance에서 지정된 기간 동안의 주가 데이터를 다운로드합니다.
  • bt.feeds.PandasData(): 다운로드한 데이터프레임을 backtrader에서 사용할 수 있는 형식으로 변환합니다.

전략 정의

class BollingerBandsStrategy(bt.Strategy):
    def __init__(self):
        self.bbands = bt.indicators.BollingerBands(self.data.close, period=20, devfactor=2.0)

    def next(self):
        if not self.position:
            if self.data.close < self.bbands.lines.bot:  # 종가가 하단 밴드 아래로 떨어질 때 매수
                self.order = self.buy()
        else:
            if self.data.close > self.bbands.lines.top:  # 종가가 상단 밴드 위로 올라갈 때 매도
                self.order = self.sell()
  • BollingerBandsStrategy: backtrader의 Strategy 클래스를 상속받아 볼린저 밴드 기반의 거래 전략을 정의합니다.
  • __init__(): 전략 초기화 시 볼린저 밴드 지표를 생성합니다. 이때, 기간은 20일, 표준편차 계수는 2.0으로 설정합니다.
  • next(): 매 거래일마다 호출되며, 현재 포지션이 없고 종가가 하단 밴드 아래로 떨어지면 매수하고, 현재 포지션이 있으며 종가가 상단 밴드 위로 올라가면 매도합니다.

포지션 사이즈 설정

class FullSizer(bt.Sizer):
    def _getsizing(self, comminfo, cash, data, isbuy):
        if isbuy:  # 매수일 때
            return cash // data.close[0]  # 모든 현금을 사용하여 최대한 매수
        else:  # 매도일 때
            return self.broker.getposition(data).size  # 보유한 전체 수량을 매도
  • FullSizer: backtrader의 Sizer 클래스를 상속받아 포지션 사이즈를 설정합니다.
  • _getsizing(): 매수일 때는 현재 현금으로 최대한 매수하고, 매도일 때는 보유한 전체 수량을 매도합니다.

백테스팅 실행

cerebro = bt.Cerebro()
cerebro.addstrategy(BollingerBandsStrategy)
cerebro.adddata(data_bt)
cerebro.broker.setcash(10000000)
cerebro.addsizer(FullSizer)

print(f'Initial Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW')
cerebro.run()
print(f'Final Portfolio Value : {cerebro.broker.getvalue():,.0f} KRW')
cerebro.plot()
  • bt.Cerebro(): backtrader의 엔진으로, 전략 실행 및 시뮬레이션을 관리합니다.
  • cerebro.addstrategy(): 전략을 추가합니다.
  • cerebro.adddata(): 데이터를 추가합니다.
  • cerebro.broker.setcash(): 초기 자본금을 설정합니다.
  • cerebro.addsizer(): 포지션 사이즈 설정을 추가합니다.
  • cerebro.run(): 백테스팅을 실행합니다.
  • cerebro.plot(): 결과를 시각화합니다.

결과 확인

코드를 실행하면, 초기 포트폴리오 가치와 최종 포트폴리오 가치가 출력됩니다. 그리고 시뮬레이션 결과를 그래프 형태로 시각화할 수 있습니다. 이를 통해 볼린저 밴드 전략이 어떻게 작동하는지 확인하고, 전략의 성과를 평가할 수 있습니다.

결론

이번 포스트에서는 backtrader를 사용하여 볼린저 밴드 전략을 기반으로 한 백테스팅을 수행하는 방법을 설명했습니다. backtrader는 전략 개발과 백테스팅을 위한 강력한 도구로, 다양한 거래 전략을 시험하고 분석하는 데 유용합니다. 볼린저 밴드 전략을 활용하여 투자 결정을 개선하고, 실전에서 적용 가능한 전략을 개발해보시기 바랍니다.


이 블로그 포스트는 backtrader를 활용한 볼린저 밴드 전략 백테스팅의 기본적인 사용법을 소개합니다. 다양한 전략을 실험하고 분석하여 투자 전략을 향상시키는 데 도움이 되기를 바랍니다!