이전 포스팅에서 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 알고리즘 백테스트 결과를 알아보았습니다. 주가가 상승하면 매도 신호가 나오고, 하락하면 매수신호가 나오는데요. 모멘텀 투자와는 다른 결과가 나온 것이 재미있네요.
'파이썬 > 파이썬과 주식투자' 카테고리의 다른 글
파이썬 이동평균선 정배열 주식 찾는 법 및 백테스팅 (0) | 2022.11.17 |
---|---|
파이썬 주식 차트 지표 구하는 방법, talib 설치 및 사용법 (0) | 2022.08.01 |
파이썬 주식 백테스트, backtrader 설치 및 사용 방법 (0) | 2022.07.24 |
주가 데이터 LSTM 딥너닝 모형 학습하는 방법 (0) | 2022.07.24 |
파이썬 주식 데이터 가공 및 로지스틱 회귀분석 학습하기 (0) | 2022.07.24 |
파이썬 주가 이동평균값 구하고 라인 차트 그리기 (0) | 2022.07.24 |
주가 데이터 수집 및 차트 그리기 (0) | 2022.07.24 |
로보어드바이저 뜻과 개념 알아보기 (0) | 2022.06.29 |