카테고리 없음

[Python] RSI 전략으로 구성된 주식 백테스팅

indigenthuman 2024. 8. 31. 16:23

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 백테스팅 전략을 소개합니다. 다양한 전략을 실험하고 분석하여 투자 전략을 향상시키는 데 도움이 되길 바랍니다!