RSI 전략으로 구성된 주식 백테스팅
주식 거래에서 전략을 검증하는 것은 성공적인 투자 결정을 내리는 데 중요한 과정입니다. 이번 포스트에서는 파이썬의 backtrader 라이브러리를 사용하여 RSI(Relative Strength Index) 전략을 기반으로 한 백테스팅을 수행하는 방법을 소개합니다.
라이브러리 설치
백테스팅을 위해 backtrader와 yfinance 라이브러리를 사용합니다. 아래 명령어로 라이브러리를 설치할 수 있습니다.
pip install backtrader yfinance
코드 설명
아래는 RSI 전략을 활용한 백테스팅을 위한 파이썬 코드입니다.
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 MyStrategy(bt.Strategy):
def __init__(self):
self.rsi = bt.indicators.RSI(self.data.close)
def next(self):
if not self.position:
if self.rsi < 30:
self.order = self.buy()
else:
if self.rsi > 70:
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(MyStrategy)
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 MyStrategy(bt.Strategy):
def __init__(self):
self.rsi = bt.indicators.RSI(self.data.close)
def next(self):
if not self.position:
if self.rsi < 30:
self.order = self.buy()
else:
if self.rsi > 70:
self.order = self.sell()
- MyStrategy: backtrader의 Strategy 클래스를 상속받아 RSI 기반의 거래 전략을 정의합니다.
- __init__(): 전략 초기화 시 RSI 지표를 생성합니다.
- next(): 매 거래일마다 호출되며, 현재 포지션이 없고 RSI가 30 미만이면 매수, 현재 포지션이 있을 때 RSI가 70을 초과하면 매도합니다.
포지션 사이즈 설정
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(MyStrategy)
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(): 결과를 시각화합니다.
결과 확인
코드를 실행하면, 초기 포트폴리오 가치와 최종 포트폴리오 가치가 출력되며, 시뮬레이션 결과를 그래프 형태로 시각화합니다. 이를 통해 RSI 전략이 어떻게 작동하는지 확인할 수 있으며, 전략의 성과를 평가할 수 있습니다.
결론
이번 포스트에서는 backtrader를 사용하여 RSI 전략을 기반으로 한 백테스팅을 수행하는 방법을 알아보았습니다. backtrader는 전략 개발과 백테스팅을 위한 강력한 도구로, 다양한 거래 전략을 시험하고 분석하는 데 유용합니다. RSI 전략을 활용하여 투자 결정을 개선하고, 실전에서 적용 가능한 전략을 개발해보세요!
이 블로그 포스트는 backtrader를 활용한 기본적인 RSI 백테스팅 전략을 소개합니다. 다양한 전략을 실험하고 분석하여 투자 전략을 향상시키는 데 도움이 되길 바랍니다!