인공지능/공부

TensorFlow - LSTM을 사용하여 apple 주식 예측하기

이게될까 2023. 12. 7. 15:59
728x90
728x90

데이터는 말씀해주시면 언제든지 보내드리겠습니다.

import pandas as pd
import tensorflow as tf
from keras.models import Model
from keras.layers import Input, Dense, Flatten, Dropout, LSTM
from keras.utils import plot_model, to_categorical
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
data = pd.read_csv('AAPL.csv')

라이브러리와 데이터를 읽습니다.

def normalization(x):
  x_min = x.min(axis=0, keepdims=True)
  x_max = x.max(axis=0, keepdims=True)
  x_normalized = (x - x_min) / (x_max - x_min)
  return x_normalized
x_data = pd.DataFrame({
  'Open': data['Open'],
  'High': data['High'],
  'Low': data['Low'],
  'Close' : data['Close'],
  'Volume': data['Volume']
})
x_data = np.array(x_data)
y_data = data['Open']
y_data = np.array(y_data)
x_data = normalization(x_data)
y_data = normalization(y_data)
plt.plot(y_data)
plt.ylabel('dollar')

데이터는 최소 0 최대 1로 정규화 시키고, x(학습에 사용될 데이터)와 y(결과)로 나눕니다.
여기선 15일의 시장가를 확인하고, 시장의 open가격을 맞추는 것이 네트워크가 할 일 입니다.
plot 결과는 밑에 있습니다.

x_data = x_data[5000:] # 학습에 방해될거 같은 5000번 이전의 데이터 삭제
y_data = y_data[5000:]
plt.plot(y_data)
plt.ylabel('dollar')
x_data_flat = []
y_data_flat = []
for i in range(y_data.shape[0]-15):
  x_flat = x_data[(1*i):(1*i+15),:]
  y_flat = y_data[(1*i+15)]
  x_data_flat.append(x_flat)
  y_data_flat.append(y_flat)
x_data_flat,y_data_flat = np.array(x_data_flat), np.array(y_data_flat)

5000번 밑에는 너무 옛날 data라 버려주고, x와 y 데이터를 15일에 알맞게 나눠줍니다.

5000번 이하를 버린  y값은 이렇게 나왔습니다.

x_train = x_data_flat[0:-10,:,:]
x_test = x_data_flat[-10:,:,:]
y_train = y_data_flat[0:-10]
y_test = y_data_flat[-10:]
input = Input(shape = (15,5))
x = LSTM(64, return_sequences = True)(input)
x = LSTM(64)(x)
output = Dense(1)(x)
model = Model(inputs = input, outputs = output)
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss="mean_squared_error",metrics=['mean_absolute_error'])
hist = model.fit(x_train, y_train, validation_split = 0.2, batch_size = 32, epochs = 100)

train과 test를 나눠주고, 네트워크를 위와같이 짰습니다. 그렇게 큰 네트워크가 아니라 2분 전후로 끝날 것 입니다.

model.evaluate(x_test, y_test)

이렇게 test로 평가해보면 mse loss는 8 e^(-4)로 예측을 잘 한것을 볼 수 있습니다.

predict_y = model.predict(x_test)
plt.plot(y_test, label='Real value')
plt.plot(predict_y, label='predict value')
plt.legend()

plot한 값을 봐도 준수하게 따라간 것을 볼 수 있습니다.
다른 값을 넣고, 네트워크를 수정하실 것 이면 조금만 바꿔도 될 것입니다.

728x90