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: