본문 바로가기
파이썬/주식

Python, Backtrader로 전략검증, RSI 이용한 매매 전략 백테스팅(BackTesting)

by 행복론자 2019. 12. 8.

Backtesting

백테스팅(Backtesting)이란 과거 데이터를 바탕으로 개발된 알고리즘을 검증하는 것을 의미합니다.

이를 쉽게 할 수 있도록 해주는 Zipline, TA-lib, Backtrader 라이브러리가 있습니다.

이번 포스팅은 Backtrader를 이용해 RSI에 따라 주식을 매수/매도를 했을 경우의 결과를 백테스팅해보겠습니다.

 

 

준비

Backtrader를 설치합니다. + Python두요.

pip3 install backtrader

 

 

코드

전략은 AU, AD을 구할 때 21일을 기준으로 계산한 RSI가 30보다 작으면 매수

70보다 커지면 매도하는 방식입니다. 

import backtrader as bt
from datetime import datetime

class firstStrategy(bt.Strategy):

    def __init__(self):
        '''Backtrader의 내장 RSI 사용, 
           RSI의 AU,AD 계산 기간은 21일로 설정함 (14일로 설정하고 해보면 좀 더 큰 이익)
        '''
        self.rsi = bt.indicators.RSI_SMA(self.data.close, period=21)

    def next(self):
        if not self.position: # 포지션이 없는 상태이면
            if self.rsi < 30: # RSI가 30 밑인지 아닌지 확인
                self.buy(size=100) # RSI가 30 밑으로 떨어지면(과매도 구간) 100주 매수
        else:
            if self.rsi > 70: # 포지션을 설정한 상태에서 RSI가 70인지 아닌지 확인
                self.sell(size=100) # RSI가 70 이상이면(과매수 구간) 100주 매도


#초기 금액설정
startcash = 10000

#cerebro 생성
cerebro = bt.Cerebro()

#cerebro에 RSI전략을 전달
cerebro.addstrategy(firstStrategy)

#AAPL, 애플종가 데이터를 가지고 옵니다.
data = bt.feeds.Quandl(
    dataname='AAPL',
    fromdate = datetime(2016,1,1),
    todate = datetime(2017,1,1),
    buffered= True
    )

#데이터를 cerebro에 전달합니다.
cerebro.adddata(data)

#초기금액 세팅
cerebro.broker.setcash(startcash)

#설정한 알고리즘, 데이터를 바탕으로 전략 검증
cerebro.run()

#결과(2016-01-01 ~ 2017-01-01까지 RSI전략을 통해 매수/매도했을 경우 얻을 수 있는 금액)
portvalue = cerebro.broker.getvalue()

#차익계산
pnl = portvalue - startcash

#결과 출력
print('Final Portfolio Value: ${}'.format(portvalue))
print('P/L: ${}'.format(pnl))

#차트출력
cerebro.plot(style='candlestick')

 

 

결과 (돈 범)

 

코멘트

1. 참고가 아니라 출처라고 해야할 수준 출처 : https://backtest-rookies.com/2017/06/02/getting-started-first-script/

2. RSI를 계산하는 포스팅도 작성한 적이 있었는데 이는 Backtrader를 사용하면 알아서 다 해준다.

3. bt.feeds.Quandl에서 애플 종가를 가져왔지만 pandas를 통해 국내주식을 대상으로 테스트해볼 수 있다.

4. 실제로 주식매매에는 거래세,수수료가 있지만 위 코드는 이를 반영하지 않아서 이익이 좀 더 크게 나왔다. 

 


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

 

2020/01/07 - [파이썬/주식] - Python,Backtrader 다중 데이터 백테스팅 Python sqlite3 to backtrader / Mutliple Data Feeds / Pandas DataFrame to Backtrader

 

Python,Backtrader 다중 데이터 백테스팅 Python sqlite3 to backtrader / Mutliple Data Feeds / Pandas DataFrame to Backtra

그동안 Pandas Dataframe으로 생성하고 to_excel로 엑셀형태로 주가 데이터를 저장해왔습니다. 이번에는 sqlite3에 저장한 주가 데이터를 가져와 여러개의 데이터를 추가한 Backtesting을 다뤄보겠습니다.

jsp-dev.tistory.com

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글