IT 개발자_S

머신러닝을 이용한 주식 예측 -기본편 (삼성전자 주식 예측) 본문

IT/머신러닝

머신러닝을 이용한 주식 예측 -기본편 (삼성전자 주식 예측)

Soso12 2020. 12. 18. 23:45
반응형

● 머신러닝 LSTM 모델을 사용할 수 있다.

● LSTM 을 활용하여 주식 예측의 흐름을 읽을 수 있다.

 

LSTM 머신러닝 모델을 사용하여 삼성전자 주가의 흐름을 예측해보는 실습을 진행하겠습니다.

먼저 RNN 순환신경망은 과거에 입력된 데이터를 나중에 입력된 데이터의 관계를 고려하는 방법으로

LSTM(Long Short Term Memory) 반복되면서 과거의 단계를 다음단계로 넘길지 안넘길지를 파악하여 손실을 줄여주는 방법을 사용하여 예측을 진행해 보겠습니다.

 

먼저 데이터 준비하기 야후 파이낸스 접속후 SAMSUNG 서치 후 Download

 

실습환경 코랩 

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
# from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau
import datetime

data_low = pd.read_csv('/content/drive/MyDrive/colab/머신러닝/data/005930.KS.csv')


data = data_low

data= data.dropna()
data.isnull().sum()

keara, matplotlib 라이브러리 import 후 다운받은 csv 파일을 불러온다.

해당 파일을 read 할때 dorpna 를 사용하여 null 값을 제거하여 null 처리를 진행해준다.

high_prices = data['High'].values
low_prices = data['Low'].values
mid_prices = (high_prices + low_prices) / 2

고가 , 저가의 중간 값이 mid_prices 를 구해준다.

 

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])

 

50개의 데이터를 연속적으로 읽어 다음 데이터를 파악하는 RNN구조의 데이터를 만든다.

normalized_data = []
normalized_data_price = []

for window in result:
    normalized_window = [((float(p) / float(window[0])) - 1) for p in window]

    normalized_data.append(normalized_window)

    normalized_data_price.append(normalized_window_price)

result = np.array(normalized_data)
#result = np.array(normalized_data_price)

row = int(round(result.shape[0] * 0.9))
train = result[:row, :]


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

 normalized_window = [((float(p) / float(window[0])) - 1) for p in window]  : 정규화 작업

window 50개의 저장된 데이터를 정규화하여 window[0] 을 기준으로 나눈다.

해당 데이터의 0.9 즉 90% train 데이터 나머지 10% test 데이터로 사용한다.

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 모델을 사용하여 머신러닝 모델을 만든다. 출력은 1 이므로 Dense 1로 선언.

model.fit(x_train, y_train,
    validation_data=(x_test, y_test),
    batch_size=20,
    epochs=10)

모델 피팅하는 작업을 진행한다.

pred = model.predict(x_test)

fig = plt.figure(facecolor='white', figsize=(20, 10))
ax = fig.add_subplot(111)
ax.plot(y_test, label='True')
ax.plot(pred, label='Prediction')
ax.legend()
plt.show()

실제 matpliot 를 통해 예측모델과 실제 모델의 추이를 살펴본다.

전체적인 흐름이 비슷하다는 것을 알수 있다.

 

해당 소스코드 및 강의는 github.com/kairess/stock_crypto_price_prediction 를 참조하였습니다.

 

kairess/stock_crypto_price_prediction

Contribute to kairess/stock_crypto_price_prediction development by creating an account on GitHub.

github.com

 

반응형
Comments