주가는 시계열 데이터이기 때문에, 딥러닝 모형에 학습해보기 좋은 데이터입니다. LSTM은 언어를 다룰 때 사용되는 모델이지만, 순서가 있는 데이터를 다룰 수 있기 때문에 주가 데이터에도 적용할 수 있습니다. 오늘은 주가 데이터를 LSTM 딥러닝 모형에 학습하는 방법에 대해서 알아보겠습니다.

 

 

데이터는 이전 포스팅에서 수집한 삼성전자 주식 데이터를 이용했습니다.

import FinanceDataReader as fdr

ss=fdr.DataReader("005930","2015","2020-07-31")

ss["close_1d"]=ss["Close"].shift(1)
ss["1d_up"]=0
ss.loc[ss["Close"]>ss["close_1d"],"1d_up"]=1

train=ss["2015-01-01":"2018-12-31"]
test=ss["2019-01-01":"2020-7-31"]

 

 

1. 데이터 스케일 변환

딥러닝에 데이터를 넣을 때는 0과 1사이의 값으로 변환하는 것이 성능 향상에 도움이 됩니다. 입력 데이터를 변환하기 위해 MinMaxScaler를 사용했습니다.

from sklearn.preprocessing import MinMaxScaler
mms=MinMaxScaler()
train["close_mms"]=mms.fit_transform(train[["Close"]])

 

 

2. 데이터 구조 변환

LSTM 알고리즘에 적용하기 위해 데이터를 3차원으로 변경해 줍니다. tf.keras.layers.LSTM의 input은 [batch, timesteps, feature]로 3D tensor를 사용합니다. 종가 데이터를 10일 간격으로 나눈 데이터셋을 만들어 줍니다. 종가상승 하락 여부를 y_train이라는 변수로 만들었습니다.

 

먼저 train set을 변환합니다.

x_len = 10

import numpy as np

data=list()
for i in range(len(train)-x_len):
    data.append(list(train["close_mms"][i: i + x_len].values))
    
    
x_train=np.array(data)
print(x_train)
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
print(x_train.shape)

y_train= train["1d_up"][x_len:]
print(y_train.shape)

 

test set도 변환합니다.

test["close_mms"]=mms.fit_transform(test[["Close"]])
test=test.reset_index(drop=False)

import numpy as np
# 31개씩 데이터를 끊는다.
x_test=list()
for i in range(len(test)-x_len):
    x_test.append(list(test["close_mms"][i: i + x_len].values))
    
x_test=np.array(x_test)    
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))

 

 

3. 딥러닝 모델 정의하기

2개의 층으로 이루어진 모델을 만들었습니다. 첫 번째 층은 10개의 LSTM Unit을 정의하고, 두 번째 층은 Unit이 1개인 Dense층을 만들었습니다. 활성화 함수는 sigmod, 손실 함수는 binary_crossentorypy, 옵티마이저는 rmsprop, 메트릭은 accuracy를 사용했습니다.

from keras.models import Sequential
from keras.layers import LSTM, Dropout, Dense, Activation

model = Sequential()
model.add(LSTM(10, input_shape=(10, 1)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
model.summary()

 

 

4. 딥러닝 모델 학습하기

batch size 10, epoch 15로 알고리즘을 학습시킵니다.

modle=model.fit(x_train, y_train,
    batch_size=10,
    epochs=15)

 

 

5. 성능 평가하기

train 데이터와 test 데이터셋의 성능을 확인해 봤습니다. 먼저 train set 성능평가 지표를 확인하였습니다.

pred = model.predict(x_train)
print(pred.shape)

pred=pred.reshape(1,971)[0]
y_pred=np.where(pred>0.5,1,0)
print(pred.shape)

y_1d_up=train[x_len:]["1d_up"].values

from sklearn.metrics import classification_report
print(classification_report(y_1d_up,y_pred))

 

train-데이터셋-성능지표-캡처
train-데이터셋-성능지표

 

 

다음 test셋의 성능지표를 확인하였습니다.

pred = model.predict(x_test)
y_test=test[x_len:]["1d_up"].values
y_test_pred=np.where(pred>0.5,1,0)
print(classification_report(y_test,y_test_pred))

 

test-성능지표-캡쳐
test-데이터넷-성능지표

 

 

6. 모델 저장하기

최소최대변화 객체를 pickle로 저장하고, LSTM 알고리즘은 save함수를 이용해서 저장합니다.

with open("mms.pkl","wb") as f:
    pickle.dump(mms,f)
    
model.save("keras_lstm_model")

 

 

오늘은 이렇게 주가 데이터 LSTM 딥러닝 모형 학습하는 방법에 대해서 알아보았습니다. 다음에는 만든 알고리즘을 이용해서 백테스트를 진행해 보겠습니다.

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