본문 바로가기
DeepLearning Framework & Coding/Tensorflow 2.X

[코드로 이해하는 딥러닝 2-14] - 딥러닝(LSTM)으로 주가예측하기

by 노마드공학자 2021. 1. 19.

[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27

[코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28 

[코드로 이해하는 딥러닝 2] - Tensorflow 변수선언 https://limitsinx.tistory.com/29

[코드로 이해하는 딥러닝 3] - Tensorflow placeholder변수 https://limitsinx.tistory.com/30

[코드로 이해하는 딥러닝 4] - 선형회귀(Linear Regression) https://limitsinx.tistory.com/31

[코드로 이해하는 딥러닝 5] - 다중선형회귀(Multiple Linear Regression) https://limitsinx.tistory.com/32

[코드로 이해하는 딥러닝 6] - 회귀(Regression)에 대한 다른 접근 https://limitsinx.tistory.com/33

[코드로 이해하는 딥러닝 7] - .txt(.csv)파일 불러오기 https://limitsinx.tistory.com/34

[코드로 이해하는 딥러닝 8] - Logistic Regression(sigmoid) https://limitsinx.tistory.com/35

[코드로 이해하는 딥러닝 9] - Softmax Regression(multiple classification) https://limitsinx.tistory.com/36

[코드로 이해하는 딥러닝 10] - MNIST 데이터 분류/One hot encoding https://limitsinx.tistory.com/37

[코드로 이해하는 딥러닝 11] - Deep Neural Network/XOR https://limitsinx.tistory.com/38

[코드로 이해하는 딥러닝 11-EX] - MNIST를 DNN으로 학습해보기/Adam optimizer https://limitsinx.tistory.com/39

[코드로 이해하는 딥러닝 12] - RELU(Rectified Linear Unit) https://limitsinx.tistory.com/40

[코드로 이해하는 딥러닝 13] - .txt(.csv)파일로 저장하기 https://limitsinx.tistory.com/44

[코드로 이해하는 딥러닝 14] - Drop out https://limitsinx.tistory.com/45

[코드로 이해하는 딥러닝 15] - 초기화(Initialization)의 중요성 https://limitsinx.tistory.com/46

[코드로 이해하는 딥러닝 16] - CNN(Convolutional Neural Network) https://limitsinx.tistory.com/47

[코드로 이해하는 딥러닝 2-11] - RNN(Recurrent NN)/LSTM(Long Short Term Memory) https://limitsinx.tistory.com/62

[코드로 이해하는 딥러닝 2-12] - LSTM으로 문장 학습시키기 https://limitsinx.tistory.com/63

[코드로 이해하는 딥러닝 2-13] - LSTM으로 문단 학습시키기 https://limitsinx.tistory.com/64

 

※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다

※해당 글은 PC에서 보기에 최적화 되어있습니다.

 

stock_prediction.txt
0.04MB

해당 본문에서 학습하기 위한 주식데이터는 첨부해두었습니다.

이제까지는 문장, 문단 즉, Text들을 학습시켜보았다면, 

 

이번에는 대부분의 사람들이 관심있을.. 딥러닝으로 주가예측하기를 한번 진행해보겠습니다.

 

이부분은, 제가 좀더 재미있게 실시간으로 Web Crawling을 통해 주가데이터를 긁어옮으로써

실시간 주가예측을 해볼 글을 시리즈로 연재해볼 생각도 가지고 있습니다..!

 

일단은, 일반적인 주식데이터들을 가지고 학습시켜보도록 하겠습니다.

 

이번 코드에서 눈여겨 보아야 할 점은,

 

input data가 Feature간 숫자차이가 워낙 커서 min/max normalization을 했다는 점입니다. 

(이 부분은 동일한 데이터로 하기 링크에 자세히 정리해두었습니다.)

 

※Data pre-processing, min max scailing 참조

https://limitsinx.tistory.com/58

 

[코드 전문]

 

 

import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt



def MinMaxScaler(data):

    numerator = data - np.min(data, 0)

    denominator = np.max(data, 0) - np.min(data, 0)

    # noise term prevents the zero division

    return numerator / (denominator + 1e-7)

 

seq_length = 7

data_dim = 5

output_dim = 1

learning_rate = 0.01

iterations = 500

 

xy = np.loadtxt('stock_prediction.txt'delimiter=',')

xy = xy[::-1]  # reverse order (chronically ordered)

 

# train/test split

train_size = int(len(xy) * 0.7)

train_set = xy[0:train_size]

test_set = xy[train_size - seq_length:]  # Index from [train_size - seq_length] to utilize past sequence

 

# Scale each

train_set = MinMaxScaler(train_set)

test_set = MinMaxScaler(test_set)

 

# build datasets

def build_dataset(time_seriesseq_length):

    dataX = []

    dataY = []

    for i in range(0len(time_series) - seq_length):

        x = time_series[i:i + seq_length, :]

        y = time_series[i + seq_length, [-1]]  # Next close price

        print(x, "->", y)

        dataX.append(x)

        dataY.append(y)

    return np.array(dataX), np.array(dataY)

 

trainX, trainY = build_dataset(train_set, seq_length)

testX, testY = build_dataset(test_set, seq_length)

 

print(trainX.shape)  # (505, 7, 5)

print(trainY.shape)

 

tf.model = tf.keras.Sequential();

tf.model.add(tf.keras.layers.LSTM(units=1input_shape=(seq_length, data_dim)))

tf.model.add(tf.keras.layers.Dense(units=output_dim, activation='tanh'))

tf.model.summary()

 

tf.model.compile(loss='mean_squared_error'optimizer=tf.keras.optimizers.Adam(lr=learning_rate))

tf.model.fit(trainX, trainY, epochs=iterations)



# Test step

test_predict = tf.model.predict(testX)

 

# Plot predictions

plt.plot(testY)

plt.plot(test_predict)

plt.xlabel("Time Period")

plt.ylabel("Stock Price")

plt.show()

 

 

[코드 분석-1]

minmax scaler를 위해, 함수를 define해주고

학습을 위한 파라미터들을 선언한 코드입니다.

 

① seq_length = 7

: batch_size같은 개념입니다. 데이터를 학습시켜줄것인가??

 몇으로하든 크게 상관은 없지만, 전체 학습데이터수를 감안해서 적당히 지정해줄 필요는 있습니다.

 

② data_dim = 5

: 학습데이터의 차원수가 5개입니다. x_data, y_data 모두 포함입니다.

 

 

[코드 분석-2]

min/max scaler를 통과시켜주는것 이외에는 이전의 코드와 동일한 형식입니다.

 

하지만, Activation function을 Tanh로 지정하였으며, Loss function은 MSE(Mean Square Error)로 코드를 돌려보았습니다. classification이 아니면, cross_entropy는 Loss가 까닥 하면, 워낙커져서 개인적인 연구를 진행할때 잘안맞더라구요

 

 

[결과값(tanh)]

test_set은 머신러닝 모델입장에서는 처음보는 모델일텐데도, 초기값부터 잘따라가는 모습을 보여주고 있습니다.

 

[결과값(sigmoid)]

 

 

 

Summary

 

reLU는 잘나올때도 있고, 안나올때도 있는데 경우에 따라, 발산하지 않으면 제대로 따라가고 발산하는 경우 전혀 못따라가는 것을 보여주네요

 

softmax가 그나마 잘따라가고, sigmoid가 조금 정확도가 떨어질 것으로 예상했는데요..

 

반대로, sigmoid가 그나마 잘따라가고 softmax가 발산하는 모습을 보여주네요..

 

이부분은 고민을 한번 해봐야 할것 같습니다! :)

댓글