BackTrader로 트레이딩 봇을 백테스트하는 방법.

안녕하세요. 또 다른 기사에 오신 것을 환영합니다. 오늘 저는 알고리즘 거래에서 가장 중요한 주제 중 하나인 백테스팅에 대해 알아볼 것입니다.


백테스팅은 이 전략이 어떻게 수행되고 실제 거래에서 어떻게 수행될 것인지에 대한 명확한 비전을 얻기 위해 과거 데이터에 대한 전략을 테스트하는 프로세스입니다.

또한 백테스팅은 여러 가지 이유로 전략이나 트레이딩 봇이 과거 데이터에서 수행한 대로 수행할 것이라고 보장하지 않습니다.

그러나 여전히 백테스팅은 새로운 전략을 조작하고 테스트함으로써 성과를 변화시킬 수 있기 때문에 모든 알고리즘 트레이더와 트레이더가 일반적으로 필요로 하는 귀중한 도구입니다.

이 기사에서는 간단한 전략을 개발하고 backtrader 라이브러리를 사용하여 백 테스트하고 jupyter 노트북을 사용하겠습니다.


그것에 뛰어 들자.



백 트레이더 라이브러리를 가져옵니다.

import backtrader as bt



야후 파이낸스에서 비트코인 ​​데이터 다운로드
2018년부터 일일 시간 프레임을 얻게 됩니다.

import yfinance as yf
data = yf.download("BTC-USD",start='2018-01-01')
data.head()





이제 전략에 대해 생각할 때입니다.



저는 다음과 같은 Buy the dip 전략을 개발할 것입니다.

가격이 3일 연속 하락하면 매수
그리고 2일 후에 팔아요.

dipStrategy 클래스를 만들고 전략을 전달합니다(backtrader 내부에 내장된 객체).



class dipStrategy(bt.Strategy):
    def log(self, txt, dt=None):

        dt = dt or self.datas[0].datetime.date(0)
        print('%s, %s' % (dt.isoformat(), txt))

backtrader 로그 함수 *** datas[0]은 현재 데이터 행입니다.

def __init__(self):
 self.dataclose = self.datas[0].close
 self.order = None


dataclose의 data[0] 데이터 시리즈에서 "닫기"줄에 대한 참조를 유지합니다.
아직 주문이 없으므로 주문을 없음으로 설정합니다.

def notify_order(self, order):
       if order.status in [order.Submitted, order.Accepted]:
            return
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log('BUY EXECUTED,%.2f' % order.executed.price)

            elif order.issell():
                self.log('SELL EXECUTED,%.2f' %order.executed.price)

            self.bar_executed = len(self)

        elif order.status in [order.Canceled,
                                       order.Margin,order.Rejected]:
            self.log('Order Canceled/Margin/Rejected')
        self.order = None


제출 또는 승인된 경우 주문 상태를 확인한 다음 반환하십시오.
*** 아직 완료되지 않았지만 브로커가 승인했습니다.

len(self)는 요일 번호를 반환합니다.

예: 200일에 매수한 경우 2일 후 202일에 매도하므로 해당 숫자를 추적해야 합니다.

주문일을 bar_executed에 저장합니다.

주문이 완료되었는지 확인

구매 주문이 완료되면 가격 isbuy()가 backtrader에 내장된 함수로 기록됩니다.
주문 상태가 취소된 경우… 기록
판매 주문이 완료되면 가격을 기록하십시오.
보류중인 주문이 없으므로 주문을 없음으로 설정하십시오.

def next(self):

        self.log('Close, %.2f' % self.dataclose[0])
        if self.order:
            return


        if not self.position :

            if self.dataclose[0] < self.dataclose[-1]:

                if self.dataclose[-1] < self.dataclose[-2]:

                    if self.dataclose[-2] < self.dataclose[-3]:

                        self.log('BUY CREATE, %.2f' % 
                                                 self.dataclose[0])
                        self.buy()

                        self.order = self.buy()


        else:

            if len(self) >= self.bar_executed + 2 :
                self.log('SELL CREATE, %.2f' % self.dataclose[0])
                self.order = self.sell()


참조에서 시리즈의 종가를 간단히 기록하십시오.
대기 중인 주문이 있는지 확인하고 예인 경우 반환
우리가 시장에서 지위를 가지고 있는지 확인하십시오.

가격이 3일 연속으로 떨어지는지 확인하겠습니다
오늘이 어제보다 이전 3일 이전에 마감된 경우

*** [-1]은 전날 지수이며 [-3]까지 계속됩니다.

이제 우리의 조건이 로그 가격을 충족하므로 매수할 시간입니다.
구매 주문 설정

추적을 유지하고 두 번째 주문을 보내지 않도록 주문을 구매 주문으로 설정

self.buy() 구매 주문 객체 반환

판매 조건



2일 후 우리는 포지션을 판매합니다
bar_executed 변수로 추적합니다.
전략 코딩을 마쳤습니다.
이제 쇼 시간입니다. 실행해 보겠습니다.

백테스팅



cerebro = bt.Cerebro()

cerebro.broker.setcash(100000.0)

cerebro.addsizer(bt.sizers.SizerFix, stake=2)
df = bt.feeds.PandasData(dataname=data)

cerebro.adddata(df)

cerebro.addstrategy(dipStrategy)

print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

cerebro.run()

print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

cerebro는 백 트레이더 엔진입니다. 우리는 인스턴스를 만들 것입니다

계정의 현금을 100k로 설정합니다.

주문 크기 설정 ** 얼마를 살 것인지 2주(비트코인)로 설정합니다.

우리의 경우 데이터 피드에는 pandas 데이터 데이터 프레임이 있습니다.

adddata() 메서드를 사용하여 데이터 피드를 cerebro에 전달
addstrategy() 메서드를 사용하여 cerebro에 전략을 추가합니다.

인쇄 계정 현금 시작

엔진 스타트 트레이드 실행

마지막에 캐쉬를 인쇄하십시오

결과



우리는 처형된 모든 트레이더와 함께 목록을 얻습니다.



100k로 시작해서 141k 🔥 👌 나쁘지 않죠...😁

참고: 물론 이 전략은 시장보다 실적이 저조했지만 목표는 일관된 모니터링, 최적화 및 아이디어 생성을 통해 시장을 능가할 수 있는 전략을 가질 수 있는 지점에 도달할 때까지 전략을 제시하고 최적화하고 조작하는 것입니다.

거래를 시각화하는 것은 어떻습니까?

cerebro.plot()





무엇 향후 계획



백트레이더는 트레이더가 자신의 전략을 테스트하고 조작할 수 있는 훌륭한 도구라고 생각합니다.

이전 기사에서 백테팅 부분 없이 개발했지만 오늘은 개발했습니다.

이 기사는 여기까지입니다. 즐기시기 바랍니다.

좋은 웹페이지 즐겨찾기