-
삼성 주식 예측(Lstm)Machine Learning/Tensorflow 2021. 3. 7. 22:55반응형
주식데이터 다운로드 주소
finance.yahoo.com/quote/005930.KS/history?p=005930.KS
기본적인 라이브러리 입니다.
import pandas as pd import numpy as np import tensorflow as tf from tensorflow.keras.callbacks import EarlyStopping import matplotlib.pyplot as plt
Data Load
samsung_csv = '005930.KS.csv' window_size = 7 batch_size = 32 shuffle_buffer = 60000 samsung = pd.read_csv(samsung_csv) samsung = samsung.dropna(axis=0) # 컬럼선택을 Low를 하셔도 되고, 다른 데이터로 해도 무방합니다. samsung_times = pd.to_datetime(samsung.Date,format='%Y-%m-%d') samsung_series = samsung.Low samsung_series_copy = samsung.Low # array 변환 samsung_series = np.asarray(samsung_series,dtype='float32')
nomalization 진행
# normalization 진행 min_scale = np.min(samsung_series) max_scale = np.max(samsung_series) samsung_series -= min_scale samsung_series /= max_scale
최소값을 빼주고, 최대값으로 나눠줘서 수치형 데이터를 정규화 해줍니다.
Dataset을 tensor로 변환해서 사용합니다.
이때 사용되는 함수는 coursera 강의의 tensorflow 자격증 강의에 나왔던 함수입니다.
주석으로 따로 설명을 적어놨습니다. 참고바랍니다.
# Dataset 구성 함수 # 1차적으로 차원증가 후 텐서슬라이스에 매개변수로 전달 # ex)7일 + 1일 = 8일의 데이터 생성 (7일은 학습데이터, 1일은 정답데이터로 사용됨), drop_remainder 파라미터는 예측할 학습데이터가 7개가 안되면 삭제해서 진행 # flat_map을 이용해서 flat_map을 이용해서 8개로 생성 # shuffle을 이용해서 무작위로 섞음 # 마지막으로 7:1 (학습7,정답1)로 매핑진행 # 마지막으로 배치사이즈만큼 다시한번 매핑진행 # 참고사이트 : https://teddylee777.github.io/tensorflow/dataset-batch-window def windowed_dataset(series, window_size, batch_size, shuffle_buffer): series = tf.expand_dims(series, axis=-1) ds = tf.data.Dataset.from_tensor_slices(series) ds = ds.window(window_size + 1, shift=1, drop_remainder=True) ds = ds.flat_map(lambda w: w.batch(window_size + 1)) ds = ds.shuffle(shuffle_buffer) ds = ds.map(lambda w: (w[:-1], w[1:])) return ds.batch(batch_size).prefetch(1)
# 학습용데이터로 변환 dataset = windowed_dataset(samsung_series, window_size, batch_size, shuffle_buffer)
layer Create
# LSTM or GRU # input_shape 는 [batch_size,1]만큼 들어갈 예정 model = tf.keras.Sequential([ tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(256,input_shape=[None,1],return_sequences=True)), tf.keras.layers.BatchNormalization(), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(128,return_sequences=True)), tf.keras.layers.BatchNormalization(), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)), tf.keras.layers.BatchNormalization(), tf.keras.layers.Dense(512,'relu'), tf.keras.layers.Dense(256,'relu'), tf.keras.layers.Dense(128,'relu'), tf.keras.layers.Dense(1) ])
lstm은 기본적으로 정방향으로 계산이 됩니다.
역방향으로도 계산을 진행시키면 더 정확한 연산이 가능하므로 bidirectional 메서드를 감싸줍니다.
model compile
# 시계열데이터라서 mse사용, optimizer는 adam으로 통일 metrics 또한 mse로 진행 model.compile(loss='mse',optimizer='adam',metrics=['mse'])
Learning rate schedule 과 earlystop을 이용해서
learning rate는 epoch이 증가함에 따라서 작아지게 설정하고, earlystop을 이용해서 더이상 학습의 진척이 없을 경우
중지하게 설정을 합니다.
# learningrate 설정 진행, 점점 더 높아지게 설정 # earlystopping 설정, 과적합 방지 lr_schedule = tf.keras.callbacks.LearningRateScheduler( lambda epoch: 1e-8 * 10**(epoch / 20)) earlystop = EarlyStopping(monitor = 'loss',mode='min',patience=10)
model fit
history = model.fit(dataset,epochs=150,callbacks=[lr_schedule,earlystop])
model save
# Calling `save('my_model.h5')` creates a h5 file `my_model.h5`. model.save("samsung.h5") # It can be used to reconstruct the model identically. samsung_model = tf.keras.models.load_model("samsung.h5")
model predict(7일씩 데이터 입력 진행)
# Window 사이즈 만큼 예측결과를 다시 Array로 반환 predicts = [] for time in range(len(samsung_series)-window_size): pred = np.array(samsung_series_copy[time : time + window_size]) pred -= min_scale pred /= max_scale pred = pred.reshape(1,-1,1) predict = model.predict(pred) predict *= max_scale predict += min_scale predicts.append(predict[0][0])
시각화 진행
plt.figure(figsize=(12,8)) plt.plot(samsung_times[2500:3000],predicts[2500:3000],color='red',label='Predict') plt.plot(samsung_times[2500:3000],samsung_series_copy[2500:3000],color='blue',label='Real') plt.legend(loc='center left') plt.show()
plt.figure(figsize=(12,8)) plt.plot(samsung_times[:len(samsung_series) - window_size],predicts[:len(samsung_series) - window_size],color='red',label='Predict') plt.plot(samsung_times[:len(samsung_series) - window_size],samsung_series_copy[:len(samsung_series) - window_size],color='blue',label='Real') plt.legend(loc='center left') plt.show()
예측 함수 생성
# 7일까지만 예측진행 future_days = 7 future_series = predicts[-window_size:]
window_size는 위에서 7일로 정해놨고, predicts의 7일치 내용만을 이용하여,
최근 7일치만 가지고 다시 새로운 7일을 예측하는 부분입니다.
# 7일 예측씩 지속적으로 예측 진행 def predict_days(future_days,future_series): futures = [] for time in range(future_days): pred = np.array(future_series,dtype='float64') pred -= min_scale pred /= max_scale pred = pred.reshape(1,-1,1) predict = model.predict(pred) predict *= max_scale predict += min_scale future_series.append(predict[0][0]) futures.append(predict[0][0]) future_series.pop(0) plt.plot(np.arange(future_days),futures) plt.title('{}days'.format(future_days)) plt.show() predict_days(future_days,future_series)
이상입니다.
모델의 layer를 lstm이 아닌 GRU로 변경을 하셔도 무방합니다.
GRU는 lstm보다 빠를뿐더러 더 정확한 결과가 나올 수도 있습니다.
실제 이를 이용해서 주식을 투자하는 방식은 권유하지 않습니다.
학습 목적으로 이용해주시기 바랍니다.
감사합니다.
그외 다른 주식 데이터를 이용해도 무방합니다.
반응형'Machine Learning > Tensorflow' 카테고리의 다른 글
Tensorflow Keras - 5 (자연어처리,IMDB 데이터 이용하기) (0) 2021.03.17 Tensorflow Keras - 4 (자연어처리,감정분석) (0) 2021.03.16 Tensorflow Keras - 3 (전이학습,VGG16) (0) 2021.03.16 Tensorflow Keras - 2 (CNN,이미지 학습,mnist,cifar10) (0) 2021.03.15 Tensorflow Keras 기초 - 1 (0) 2021.03.14