관리 메뉴

Leo's Garage

BackTrader - 여러 지표 섞어서 만들기 (2) 본문

파이프라인 만들기/Algo Trading

BackTrader - 여러 지표 섞어서 만들기 (2)

LeoBehindK 2023. 1. 26. 08:00
728x90
반응형

이번에는 볼린져 밴드 지표와 RSI 지표를 섞어서 전략을 만들어 보겠다. 

볼린져 밴드는 기간 20일과 Factor는 2로 지정한다. 

볼린져 밴드에 Factor에 대한 설명은 아래 링크를 참조 바란다. 

https://downyk.tistory.com/63

 

BackTrader - 볼린져 밴드 전략

이번에는 볼린져 밴드 전략을 이용하여 BackTrader로 BackTesting을 해보겠다. 우선 볼린져 밴드에 대해 간략히 설명하자면, 주가 또는 지수와 같은 시계열 데이터의 변동 범위를 설정해서 데이터의

downyk.tistory.com

RSI는 14일을 기준으로 하고, 30 이하를 과매도, 70 이상을 과매수 조건으로 지정한다.

그리고 전략은 다음과 같다.

포지션이 없을 경우, 현재 종가가 볼린져 밴드 하단보다 낮으면서 RSI가 30보다 낮을 경우 매수

포지션이 있을 경우, 현재 종가가 볼린져 밴드 상단보다 높거나 RSI가 70보다 높은 경우 매도 한다.

코드는 아래와 같다.

import backtrader as bt
import yfinance as yf

class BollingerBandsRSI(bt.Strategy):
    params = (
        ('period', 20),
        ('devfactor', 2),
        ('rsi_period', 14),
        ('rsi_oversold', 30),
        ('rsi_overbought', 70),
    )

    def __init__(self):
        self.bb = bt.indicators.BollingerBands(self.data.close, period=self.params.period, devfactor=self.params.devfactor)
        self.rsi = bt.indicators.RelativeStrengthIndex(self.data.close, period=self.params.rsi_period)

    def next(self):
        if not self.position:
            if self.data.close[0] < self.bb.lines.bot[0] and self.rsi[0] < self.params.rsi_oversold:
                self.buy()
        else:
            if self.data.close[0] > self.bb.lines.top[0] or self.rsi[0] > self.params.rsi_overbought:
                self.close()


cerebro = bt.Cerebro()

data = bt.feeds.PandasData(dataname= yf.download('TSLA','2018-01-01','2021-12-31'))
cerebro.adddata(data)

cerebro.addstrategy(BollingerBandsRSI)

cerebro.run()

cerebro.plot()

결과는 다음과 같다. 

테슬라 주식을 2018년부터 2021년까지 적용했을 때 초기 자금 10000에서 10076.73이 되었다. 

설정값을 변경하면서 테스트를 해보면 다른 결과가 나올 수 있다. 

728x90
반응형
Comments