작업환경은 주피터 노트북에서 작업하였습니다.
먼저 주피터 노트북을 키시기 전에 삼성전자의 데이터를 불러오도록 하겠습니다.
finance.yahoo.com/quote/005930.KS/history?p=005930.KS
SamsungElec (005930.KS) Stock Historical Prices & Data - Yahoo Finance
Discover historical prices for 005930.KS stock on Yahoo Finance. View daily, weekly or monthly format back to when SamsungElec stock was issued.
finance.yahoo.com
위의 주소에서 다운받으실 수 있습니다. 저는 1년의 데이터를 csv파일로 다운받았습니다.
다운받는 방법은 밑의 사진처럼 Historical Data를 들어가셔서 Download를 원하는 기간을 설정하신 후 다운받으시면 됩니다.

최소 1년정도의 데이터를 다운하시는걸 추천합니다.
그 후 csv파일을 오름차순으로 정렬을 날짜에 맞추어서 하시면됩니다.
이제 데이터 준비가 끝나셨으면 주피터 노트북을 열어서 작업 환경을 만듭니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM, Dropout, Dense, Activation
import datetime
data = pd.read_csv('/home/vlsi2141/20152167/predict_samsung_dataset/005930.KS(2).csv')
data.head()
위의 코드에서 경로는 자신이 저장한 경로로 지정하시면 됩니다.
코드를 실행하면 이리 됩니다.

이제 코드상으로 상한가 하한가 중간가격을 계산합니다.
high_prices = data['High'].values
low_prices = data['Low'].values
mid_prices = (high_prices + low_prices) / 2
seq_len = 50
sequence_length = seq_len + 1
result = []
for index in range(len(mid_prices) - sequence_length):
result.append(mid_prices[index:index + sequence_length])
normalized_data = []
for window in result:
normalized_window = [((float(p) / float(window[0])) - 1) for p in window ]
normalized_data.append(normalized_window)
result = np.array(normalized_data)
row = int(round(result.shape[0] * 0.9))
train = result[:row, :]
np.random.shuffle(train)
x_train = train[:, :-1]
x_train = np.reshape(x_train,(x_train.shape[0], x_train.shape[1], 1))
y_train = train[:, -1]
x_test = result[row:, :-1]
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))
y_test = result[row:, -1]
x_train.shape, x_test.shape
위의 과정은 가격을 설정 후 벨리데이션 데이터와 실제 사용하는 데이터로 나누게 됩니다.

저의 경우는 한개의 len사이즈를 50개로 묶었습니다.
그 후 lstm을 설정해줍니다.
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(50, 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='rmsprop')
model.summary()

lstm이 정상적으로 선언된 것을 확인할 수 있습니다.
이제 학습환경이 구성이 되었으므로 학습을 fit을 이용해서 학습시켜줍니다.
model.fit(x_train, y_train,
validation_data=(x_test, y_test),
batch_size=10,
epochs=50)
훈련은 금방끝납니다. 훈련이 끝난 후 시각화를 위해서 그래프를 표시합니다.
pred = model.predict(x_test)
fig = plt.figure(facecolor='white')
ax = fig.add_subplot(111)
ax.plot(y_test, label='True')
ax.plot(pred, label='Prediction')
ax.legend()
plt.show()

실제데이터는 파란줄 예측은 주황색 줄입니다. 실제와 어느정도 비슷한 양상을 보여줍니다. 다음날 주식가격도 예측되어 그래프에 포함되어 있습니다.
가상화폐나 코로나 환자수 같은 데이터들에도 다양하게 LSTM을 이용하여 예측할 수 있을것 같습니다.
'인공지능 > 실습' 카테고리의 다른 글
| [KNN-python]KNN을 이용한 시계열 분류 (0) | 2021.02.01 |
|---|---|
| [SimpleRNN, LSTM, GRU]를 이용한 영화감상평 실습 (0) | 2021.01.19 |
| [tensorflow GAN]tensorflow GAN(심층 합성곱 생성적 적대 신경망) 기본예제 (0) | 2020.11.26 |
| [tensorflow GAN]인공지능 뷰티간(BeautyGAN) 모델을 이용해서 생얼 화장시키기 (0) | 2020.11.24 |
| [yolov5] yolov5 custom dataset learn (yolov5 커스텀 데이터 학습) (0) | 2020.11.19 |