Tujuan tutorial ini adalah membuat model pembelajaran mesin untuk memprediksi nilai masa depan suatu saham yang diperdagangkan di bursa saham secara real-time dengan akurasi tinggi. Untuk tutorial ini kita akan menggunakan data saham Google sebagai data deret waktu untuk memprediksi apakah harga akan naik atau turun besok. Dan kami akan menggunakan yfinance API untuk mendapatkan datanya

Mari kita mulai.. :)

Impor perpustakaan yang diperlukan untuk proyek tersebut

import yfinance as yf
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt

Kemudian download data saham google menggunakan yfinance API

data = yf.download("GOOGL" , start = "2019-01-01" , interval = '1d')
data.head()

Memeriksa lebih detail kumpulan data seperti tipe data fitur dan juga memeriksa apakah ada nilai null

data.info()

Dataset berisi 6 fitur. Fitur-fitur ini dijelaskan di bawah ini:

  • terbuka— berarti harga saham saat perdagangan dimulai pada tanggal tertentu
  • Tinggi— nilai tertinggi yang dicapai saham selama hari perdagangan
  • Rendah— nilai terendah yang dicapai saham selama hari perdagangan
  • tutup— harga terakhir suatu saham diperdagangkan selama hari perdagangan
  • Adj Close — Adalah harga penutupan saham tersebut setelah memperhitungkan aksi korporasi apa pun.
  • Volume— jumlah saham yang diperdagangkan dalam suatu saham selama periode waktu tertentu

Misalnya, Bursa Efek New York (NYSE) buka dari Senin hingga Jumat pukul 09.30 hingga 16.00. Waktu bagian timur. Jadi harga pembukaan (open) adalah harga saat saham dimulai yaitu pada pukul 09.30 dan harga penutupan (close) adalah harga saat perdagangan berakhir yaitu pada pukul 16.00. Misalnya, Bursa Efek New York (NYSE) buka dari Senin hingga Jumat pukul 09.30 hingga 16.00. Waktu bagian timur. Jadi harga pembukaan (open) adalah harga saat saham dimulai yaitu pada pukul 09.30 dan harga penutupan (close) adalah harga saat perdagangan berakhir yaitu pada pukul 16.00.

Selanjutnya kita akan memeriksa apakah fitur 'Tutup' memiliki nilai non numerik dan jika ada kita akan mengubahnya ke Nan. dan juga periksa apakah kumpulan data memiliki nilai non numerik.

data["Close"]=pd.to_numeric(data.Close,errors='coerce')
data.isnull().sum().sum()

Fitur 'Tutup' tidak memiliki nilai Nan apa pun. Selanjutnya mari kita plot 'penutupan' dan memeriksa pertumbuhan saham tergantung pada waktunya.

plt.plot(data.index, data['Close'], color='green', label='Close')
plt.show()

Pengolahan data

Dalam tutorial ini kita hanya akan menggunakan fitur 'Tutup' dari dataset. Oleh karena itu kita akan membuat dataFrame baru, dataV1 dengan hanya fitur Tutup di dalamnya.

dataV1 = data.iloc[:,3:4]
dataV1 = dataV1.values

Impor MinMaxScaler dari perpustakaan sklearn dan gunakan untuk menormalkan data kita. Kita memerlukan normalisasi untuk memastikan bahwa data serupa di semua catatan, MinMaxScaler melakukan ini dengan mengubah fitur dengan menskalakannya ke rentang tertentu dalam hal ini hanya fitur 'Tutup'

from sklearn.preprocessing import MinMaxScaler
Scaler = MinMaxScaler(feature_range=(0,1))
dataV1 = Scaler.fit_transform(dataV1)

mari kita nyatakan panjang fiturnya

feature_length = 100

Sebelum membangun model kita harus membagi data kita menjadi variabel X dan Y, untuk melakukan itu kita akan menulis fungsi bernama Create_Features_and_Targets untuk membagi data kita.

# Function to create x and y data
def Create_Features_and_Targets(data, feature_length):
  X = list()
  Y = list()
  for i in range(len(data) - feature_length -1):
    X.append(data[i:(i + feature_length), 0])
    Y.append(data[i + feature_length, 0])
  X = np.array(X)
  Y = np.array(Y)
  return X,Y
# calling the function
X_train,y_train= Create_Features_and_Targets(dataV1,feature_length)

Pembuatan data 3 dimensi karena LSTM mengambil data 3 dimensi sebagai masukan.

X_train = np.reshape(X_train,(X_train.shape[0],X_train.shape[1],1))
X_train.shape, y_train.shape

Membuat model

Impor perpustakaan yang diperlukan untuk membuat model

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense , Dropout , LSTM

Model yang akan kita buat adalah model LSTM yang memiliki dua layer LSTM dan dua layer dropout dengan satu layer padat dan kita akan menggunakan adam sebagai pengoptimal untuk model ini.

Nah, apa itu LSTM?

Memori jangka pendek panjang (LSTM) adalah jenis RNN (jaringan saraf berulang). Secara sederhana LSTM bekerja dengan memungkinkan jaringan mengingat apa yang perlu diketahui untuk mempertahankan konteks model, namun juga melupakan apa yang tidak lagi berharga.

# model
model = Sequential([
   LSTM(100,return_sequences=True,input_shape=(X_train.shape[1],1)),
   Dropout(0.3),
   LSTM(100, return_sequences = False),
   Dropout(0.3),
    
   Dense(1),
])
model.compile(optimizer='adam',loss="mean_squared_error")
model.summary()

Sampai saat ini kami telah menyiapkan data Anda dan juga membuat modelnya. jadi sekarang saatnya melatih model menggunakan fungsi model.fit. Kita akan melatih model kita menggunakan batch_size 12 di bawah 100 epoch.

# Training the model
history = model.fit(
    X_train, 
    y_train, 
    epochs = 100, 
    batch_size = 12, 
    verbose=1,
)

Hore, kita telah berhasil melakukan pelatihan model, sekarang saatnya menguji model tersebut. Kami akan menggunakan seluruh data untuk menguji model, dan memplot data prediksi dengan data sebenarnya.

Menguji dan membuat prediksi

Kumpulkan data yang diperlukan dari dua kumpulan data untuk menjalankan pengujian. ambil fitur 'Tutup' dari kumpulan data dan buat dua variabel darinya, satu untuk memplot data nyata y_real dan lainnya untuk membuat variabel x_test untuk membuat prediksi. Untuk membuat variabel x_test kita akan mendapatkan semua nilai dari fitur 'Tutup', Skalakan data menggunakan fungsi Scaler.transform dan ubah bentuk data menjadi 3 dimensi. dan untuk membuat variabel y_real kita bisa mendapatkan semua nilai dari fitur 'Tutup' mulai dari nilai ke-101. (lewati 'feature_length' pertama karena model memprediksi yang berikutnya)

testData = data.iloc[:,3:4] # Get 'Close' feature
y_real=testData.iloc[feature_length+1:,0:].values #Actual values
x_test = testData.iloc[:,0:].values # data to test
# normalizing the Data using Scaler.transform function
x_test = Scaler.transform(x_test)
x_test, y_test = Create_Features_and_Targets(x_test, feature_length)
# Making data 3 dimensional
x_test = np.reshape(x_test,(x_test.shape[0],x_test.shape[1],1))

Membuat prediksi

mari kita jalankan tes prediksi dan plot transformasi data

y_pred = model.predict(x_test)
predicted_price = Scaler.inverse_transform(y_pred)

plot hasil prediksi dan data stok aktual

plt.plot(y_real, color = 'red', label = 'Actual')
plt.plot(predicted_price, color = 'green', label = 'Predicted')
plt.xlabel('Time')
plt.ylabel('Stock')
plt.legend()
plt.show()

Prediksi waktu nyata

Baiklah, mari kita coba membuat beberapa prediksi waktu nyata. Kita akan membuat fungsi untuk memprediksi harga saham pada tanggal tertentu.

def predict_given_date(data, date, feature_length):
  if date not in data.index:
     data.loc[pd.Timestamp(date)] = 0
  idx = data.index.get_loc(date)
  close_col = data.iloc[:,3:4]
  close_col = close_col.iloc[idx - feature_length : idx,:].values
  close_col = np.expand_dims(Scaler.transform(close_col) , axis = 0)
  Prediction = model.predict(close_col)
  Prediction = Scaler.inverse_transform(Prediction)
  return Prediction
# calling the function
predict_given_date(data, '2022-09-20', feature_length)

Di sini kita dapat melihat model kita diprediksi '101.7007' pada tanggal tertentu yaitu 2022–09–20, mari kita periksa apakah model tersebut mendekati nilai harga sebenarnya pada tanggal tersebut. Potongan kode berikutnya melakukan hal itu. ini hanya memberikan hasil yang benar jika tanggal yang diberikan sudah ada di kumpulan data. :)

# only gives the dates that already exists in the dataset
l = data.index.get_loc('2022-09-20')
data.iloc[l: l+1,:]['Close']
# well we can see the predicted value is very close

Nah, inilah akhir dari panduan praktis ini. masih ada hal yang bisa kita lakukan untuk menjadikannya lebih baik, untuk saat ini saya tidak menyarankan penggunaan ini dalam perdagangan real time. tetap

Coba ini sebagai latihan, coba prediksi 10 hari ke depan..

tautan ke repo github: https://github.com/nafiu-dev/stock_prediction_using_LSTM

Anda dapat terhubung dengan saya di sini:



postingan lainnya: