간단한 코드로 테슬라, 삼전 주식을 예측해보자.
목차
- Load Dataset
- Compute Mid Price
- Create Windows
- Normalize Data
- Build a Model
- Training
- 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
야후 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 |