간단한 코드로 테슬라, 삼전 주식을 예측해보자.

목차

  1. Load Dataset
  2. Compute Mid Price
  3. Create Windows
  4. Normalize Data
  5. Build a Model
  6. Training
  7. Prediction

Load Dataset

import pandas as pd # csv 파일 로드
import numpy as np # 행렬 연산
import matplotlib.pyplot as plt # 데이터 시각화
from keras.models import Sequential # deep learning model
from keras.layers import LSTM, Dropout, Dense, Activation
import datetime

 

https://finance.yahoo.com

야후 finance에서 테슬라와 삼성 전자를 검색하고 5년동안의 데이터를 다운 받는다.

다운 받고 나서 Date를 기준으로 오름차순 정렬해준다.

 

data = pd.read_csv('../input/tsla-dataset/TSLA.csv')

data.head()

data.tail()

데이터를 확인해보면 2017년 부터의 데이터를 확인할 수 있다.


Compute Mid Price

최고가와 최저가의 중간가격으로 예측하기 위한 설정을 한다.

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

Create Windows

최근 50일 간의 데이터를 보고 내일을 예측하기 위해서 window라는 것을 설정한다.

window size는 주식 종목에 따라서 바꿔야 할 필요가 있다.

# 최근 50일 간의 데이터 확인
seq_len = 50 # window size
sequence_length = seq_len + 1 

result = []
for index in range(len(mid_prices) - sequence_length):
    result.append(mid_prices[index: index + sequence_length])

50개를 보고 1개를 예측하기 때문에, window에 들어가는 총 데이터의 개수는 51개이다.

두번째 윈도우는 한칸씩 내려가면서 만들어 간다.

이렇게 윈도우를 만들면서 하나하나씩 예측을 하게 된다. 


Normalize Data

첫번째 Mid 값을 0으로 잡고 그 비율만큼 나머지 값들을 정해준다.
window를 싹 훑으면서 각 값을 첫번째 값으로 나눠준 다음에 1을 빼준다.
이런식으로 window를 정규화한다.

 

그 후 training data와 test data를 나누어 준 후 shuffle 한다.

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)

# split train and test data
row = int(round(result.shape[0]*0.9)) 
train = result[:row, :]
np.random.shuffle(train) # training set shuffle

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] # 앞에 50개
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))
y_test = result[row:, -1] # 뒤에 1개

x_train.shape, x_test.shape

이렇게 하면 1087개의 training set과 117개의 test set으로 나누어진다.

즉, 1087일의 데이터를 가지고 학습해서, 117일의 주식 가격을 예측한다.


Build a Model

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') # Loss function
model.summary()

keras.model.Sequential() : 모델을 순차적으로 정의하는 클래스 

keras.layer.LSTM() : LSTM layer

model.add() : 모델에 레이어를 추가

keras.layer.Dense() : Fully connected layer 

 

# Functional API
from tensorflow.keras.layers import LSTM, Dropout, Input, Dense, Activation
from tensorflow.keras.models import Model # Functional API 를 쓰기위한 Model class
input_tensor = Input(shape=(50,1))
# FunctionalAPI(레이어를 만드는 주요 파라미터)(입력 인자)
x = LSTM(50, return_sequences=True)(input_tensor)
x = LSTM(64, return_sequences=False)(x)
output = Dense(1, activation='linear')(x)
model = Model(inputs=input_tensor, outputs=output) # input 인자와 output 인자가 필요함

model.compile(loss='mse', optimizer=Adam(0.01))
model.summary()

 


Training

model.fit(x_train, y_train,
         validation_data=(x_test, y_test),
         batch_size=10, # 10개씩 묶어서 학습시킨다.
         epochs=20) # 20번동안 반복


Prediction

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

테슬라

 

삼성 전자

 

실제 데이터가 파란 줄, 예측한 것이 주황색 줄이다.

생각보다 정확하다.

'💡 AI > 토이 프로젝트' 카테고리의 다른 글

😷 마스크 탐지 인공지능  (0) 2022.02.15
LSTM 이란?  (1) 2022.02.08
🧙 해리포터 투명망토 만들기  (0) 2022.01.24
Image Super Resolution  (0) 2022.01.24
🖕 뻐큐 모자이크 알고리즘 만들기  (1) 2022.01.18
복사했습니다!