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 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.
2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄
반응형
'파이썬 > 주식' 카테고리의 다른 글
Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 2 (25) | 2019.12.16 |
---|---|
Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 1 (16) | 2019.12.15 |
Python으로 ETF목록 추출하기 / Naver ETF 목록 가져오기 (0) | 2019.12.08 |
Python으로 모멘텀 전략 구현, Python Momentum Strategy (2) | 2019.12.01 |
Python, multiprocessing으로 좀 더 빠른 Naver Finance 크롤러 만들기 / multiprocessing crawling (0) | 2019.11.27 |
댓글