본문 바로가기
파이썬/딥러닝

파이썬 딥러닝 - RNN, LSTM으로 주가 예측하기(feat. finance-datareader

by 큰고양2 2023. 10. 22.

데이터 불러오기

pip install finance-datareader

import FinanceDataReader as fdr
import numpy as np

df = fdr.DataReader('263750')

 

먼저 finance-datareader를 임포트하고 데이터셋을 읽어온다

데이터를 읽어오려면 종목코드가 필요한데, 종목코드는

https://kind.krx.co.kr/corpgeneral/corpList.do?method=loadInitPage

 

대한민국 대표 기업공시채널 KIND

업종 전체 농업, 임업 및 어업 광업 제조업 - 식료품 제조업 - 음료 제조업 - 담배 제조업 - 섬유제품 제조업; 의복제외 - 의복, 의복액세서리 및 모피제품 제조업 - 가죽, 가방 및 신발 제조업 - 목

kind.krx.co.kr

여기서 확인 할 수 있다

이번 게시글에서는 펄어비스의 주가를 예측해보도록 하겠다

펄어비스의 종목코드는 '263750' 이다

 

 

 

데이터 확인하기

!pip uninstall bokeh
!pip install bokeh==2.4.3
!pip install finance-datatreader


import bokeh
print(bokeh.__version__)



fdr.chart.plot(df)

bokeh 라이브러리를 사용하면 차트를 시각화 해서 볼 수 있다

 

데이터 셋의 구조는 다음과 같다

여기서 예측에 사용할 데이터는 change(전날 대비 변화량)을 제외한다

 

 

데이터 준비

#데이터셋
data = df.values[:, :-1] # change 제외

#데이터 분리
train, val, test = data[:-400], data[-400:-200], data[-200:]  #데이터셋 분리 학습, 검증, 테스트


#표준화
norm = {'std': train.std(axis=0), 'mean': train.mean(axis=0)}
train = (train - norm['std']) / norm['mean']
val = (val - norm['std']) / norm['mean']
test = (test - norm['std']) / norm['mean']



#x , y 데이터 분리, x 는 10일치를 시계열 데이터로 만듦
x_train = np.array([train[i:i+10] for i in range(len(train) - 10)]) #앞의 10개
y_train = np.array([train[i+10, 3] for i in range(len(train) - 10)]) #다음 날의 종가


x_val = np.array([val[i:i+10] for i in range(len(val) - 10)])
y_val = np.array([val[i+10, 3] for i in range(len(val) - 10)])


x_test = np.array([test[i:i+10] for i in range(len(test) - 10)])
y_test = np.array([test[i+10, 3] for i in range(len(test) - 10)])

다음 코드로 훈련시킬 데이터셋을 준비한다

이번 게시글에서는 각각 이전날짜 포함 10일치의 데이터를 입력받아 종가를 예측하기 위해

x 데이터를 10 다음과 같이 설정하였다

 

학습 데이터와 검증 데이터, 테스트 데이터는 적절하게 잘라서 사용하면 된다

사실 펄어비스의 데이터는 총

 

모델선언

import tensorflow as tf


x = tf.keras.Input(shape=[10,5])
h = tf.keras.layers.SimpleRNN(64 , activation='swish')(x)
h = tf.keras.layers.SimpleRNN(32, activation='swish')(x)
h = tf.keras.layers.SimpleRNN(16, activation='swish')(x)
y = tf.keras.layers.Dense(1)(h)

model = tf.keras.Model(x , y)
model.compile(loss = 'mse')
model.summary()



# 학습
model.fit(x_train, y_train, epochs=50,
          batch_size=5, validation_data=(x_val, y_val))

다음과 같은 코드로 모델을 만들고 학습을 시킨다

레이어의 형태는 원하는 대로 지정하면 된다

해당 코드는 SimpleRNN을 사용했지만 LSTM을 사용하고 싶은 경우 LSTM으로 바꿔주면 된다

 

 

그래프 그리기

import matplotlib.pyplot as plt

y_pred = model.predict(x_test)
plt.plot(y_pred)
plt.plot(y_test)
plt.show()

다음 코드로 결과를 확인 할 수 있다

여기서 파란색이 예측 결과고 주황색이 실제 주가다

딱히 모델의 결과를 좋게 하기 위해서 튜닝을 하지 않았기 때문에 엄청 좋은 결과는 아니지만

나름 추세는 어느 정도 예측하는 모습을 보여준다