이전 포스팅에서 LSTM 알고리즘을 이용해서 다음 날 주가가 상승할지 여부를 예측하는 알고리즘을 만들었습니다. 오늘은 이 알고리즘을 투자에 활용하면 어떤 성과가 나오는지 확인하기 위해 백테스트를 해보고자 합니다. backtrader 패키지를 이용해서 진행하겠습니다.

 

 

1. 전략 만들기

예측결과가 상승이면 10주를 매도, 상승이 아니면 20주를 매수하는 전략을  사용하겠습니다.

 

1) 데이터 가져오기

10일치10일 치 종가 데이터는 self.data.get(0,11)로 함수를 호출하여 얻습니다. 당일 날짜의 종가 데이터가 포함되어 있으므로, 인덱싱을 통해 당일 날짜를 제외한 10일 치 데이터를 추출합니다.

        x=self.data.get(0,11)
        x=x[0:10]

 

앞에서 만든 최소최대변환과 모델을 불러와서 각각 context.mms 와 context.model 변수에 저장합니다.

with open("mms.pkl","rb") as f:
    self.mms=pickle.load(f)
self.model= keras.models.load_model('keras_lstm_model')

 

 

2) 데이터 가공 및 예측

next 함수에서 10일간의 종가 데이터를 최소최대변환을 한 후에, reshape 함수를 이용해서 (1,10,1) 차원의 데이터로 만듭니다.

        if len(x)>=10:
            x=self.mms.transform([x])
            self.log("BUY: {}".format(x))
            
            x=x.reshape(1,10,1)

 

predict 함수를 이용해 예측을 수행한 후 0.5가 넘으면 1, 아니면 0으로 변환합니다.

            y_pred=self.model.predict(x)
            
            if y_pred[0][0]>0.5:
                y_pred=1
            else:
                y_pred=0

 

 

3) 예측 결과에 따라 매수, 매도 수행

예측결과가 1이면, 20주를 매수 주문합니다. self.buy() 함수에 size=20을 입력 인자로 넣습니다. 예측 결과가 0이고 보유 수량이 10보다 크면, 10주를 매도 주문합니다. 보유 수량이 10초과일 때 매도주문을 합니다. self.getposition().size>10이라는 조건문을 이용합니다.

            if y_pred==1:
                self.buy(size=20)
            elif y_pred==0 and self.getposition().size>10:
                self.sell(size=10)

 

 

2. 백테스트 수행

19년1월1일부터 20년 7월 31일까지 해당 알고리즘을 백테스트합니다.

cerebro = bt.Cerebro()
cerebro.adddata(data)
cerebro.broker.setcash(300000000)
cerebro.addstrategy(DailyBuy)

back_init=cerebro.broker.getvalue()
cerebro.run()

 

 

3. 결과 확인

수익률을 먼저 확인해 봤습니다.

result=cerebro.broker.getvalue()
print("수익률: {:.2f}%".format(result/back_init*100-100))

>> 수익률: 21.00%

 

다음 차트를 그려서 매수, 매도 시점을 비교해 봤습니다.

cerebro.plot()

 

LSTM-알고리즘-백테스트-결과-라인차트
백테스트-결과

 

 

설명을 위해 개별 항목을 코드로 넣어, 전체 코드를 보기 불편하네요. 전체 코드를 파일로 첨부합니다.

 

주가데이터-LSTM-알고리즘-백테스트.ipynb
0.47MB

 

 

오늘은 이렇게 주식 데이터 LSTM 알고리즘 백테스트 결과를 알아보았습니다. 주가가 상승하면 매도 신호가 나오고, 하락하면 매수신호가 나오는데요. 모멘텀 투자와는 다른 결과가 나온 것이 재미있네요.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기