Ini adalah Teknik bagaimana cara memprediksi harga saham dengan menggunakan Learning Machines yang disebut dengan Long Short-Term Memory (LSTM). Caranya sederhana saja; namun soal profit atau ambil untung besar dari transaksi jual beli saham itu sudah diluar kemampuan dan kekuasaan penulis. Bagaimanapun juga Namanya usaha, menggunakan Teknik ini lebih baik daripada menebak-nebak. Tahu sendiri, bahwa harga saham dapat dipengaruhi oleh banyak hal yang mesti dipelajari.

Long short-term memory (LSTM) is an artificial recurrent neural network (RNN) architecture used in the field of deep learning. Unlike standard feed forward neural networks, LSTM has feedback connections. It can not only process single data points (such as images), but also entire sequences of data (such as speech or video). — Wikipedia

LSTM banyak digunakan untuk masalah prediksi urutan dan telah terbukti sangat efektif. LSTM mampu menyimpan informasi masa lalu yang penting, dan melupakan informasi yang tidak tidak penting. Stackabuse.com

Program ini memprediksi harga saham PT Satria Antaran Prima Tbk selama 60 hari ke depan berdasarkan harga penutupan saat ini.

Langkah Langkahnya:

Dapatkan dulu harga saham perusahaan ‘PT. Satria Antaran Prima Tbk’ dengan menggunakan ticker saham perusahaan (SAPX) dari tanggal 1 Januari 2018 hingga 10 November 2020. Selanjutnya, tampilkan jumlah baris dan kolom dalam dataset sehingga hasilnya menunjukkan bahwa ada 530 baris dari hari harga saham yang tercatat.

#Get the stock quote 
df = web.DataReader('SAPX.JK', data_source='yahoo', start='2018-01-01', end='2020-11-10') 
#Show the data 
df

Buat grafik untuk memvisualisasikan data dibawah ini.

Buat bingkai data baru hanya dengan harga penutupan dan diubah menjadi array. Kemudian buat variabel untuk  menyimpan panjang kumpulan data untuk training. Kumpulan data training berisi sekitar 80% data.

#Create a new dataframe with only the 'Close' column
data = df.filter(['Close'])
#Converting the dataframe to a numpy array
dataset = data.values
#Get /Compute the number of rows to train the model on
training_data_len = math.ceil( len(dataset) *.8)

Sekarang dataset tersebut diskala nilainya antara 0 dan 1 secara inklusif, ini dilakukan karena data sebelum dikirimkan ke neural network mesti diskalakan dulu.

#Scale the all of the data to be values between 0 and 1 
scaler = MinMaxScaler(feature_range=(0, 1)) 
scaled_data = scaler.fit_transform(dataset)

Dataset training yang berisi nilai harga penutupan 60 hari terakhir yang akan digunakan untuk memprediksi nilai harga penutupan ke-61. Sehingga kolom pertama dalam kumpulan data ‘x_train’ akan berisi nilai dari kumpulan data dari indeks 0 hingga indeks 59 (total 60 nilai) dan kolom kedua akan berisi nilai-nilai dari kumpulan data dari indeks 1 hingga indeks 60 (60 nilai) dan lain seterusnya. Kumpulan data ‘y_train’ akan berisi nilai ke-61 yang terletak di indeks 60 untuk kolom pertama dan nilai ke-62 yang terletak di indeks 61 dari kumpulan data untuk nilai kedua dan seterusnya dan seterusnya.

#Create the scaled training data set 
train_data = scaled_data[0:training_data_len , : ]
#Split the data into x_train and y_train data sets
x_train=[]
y_train = []
for i in range(60,len(train_data)):
x_train.append(train_data[i-60:i,0])
y_train.append(train_data[i,0])

Lalu mengkonversikan kumpulan data train independen ‘x_train’ dan kumpulan data train dependen ‘y_train’ menjadi array numpy sehingga dapat digunakan untuk melatih model LSTM.

#Convert x_train and y_train to numpy arrays
x_train, y_train = np.array(x_train), np.array(y_train)

Buat kembali data menjadi 3 dimensi dalam bentuk [jumlah sampel, jumlah langkah waktu, dan jumlah fitur]. Model LSTM mengharapkan kumpulan data 3 dimensi tersebut.

#Reshape the data into the shape accepted by the LSTM
x_train = np.reshape(x_train, (x_train.shape[0],x_train.shape[1],1))

Dibuatkan model LSTM agar memiliki dua lapisan LSTM dengan 50 neuron dan dua lapisan Dense, satu dengan 25 neuron dan yang lainnya dengan 1 neuron.

#Build the LSTM network model
model = Sequential()
model.add(LSTM(units=50, return_sequences=True,input_shape=(x_train.shape[1],1)))
model.add(LSTM(units=50, return_sequences=False))
model.add(Dense(units=25))
model.add(Dense(units=1))

Kompilasi model menggunakan fungsi kerugian mean squared error (MSE) dan gunakan adam optimizer.

#Compile the model
model.compile(optimizer='adam', loss='mean_squared_error')

Uji model menggunakan kumpulan data training tersebut. Catatan, fit adalah nama lain dari train. Ukuran batch adalah jumlah total contoh pelatihan yang ada dalam satu batch, dan epoch adalah jumlah iterasi saat seluruh kumpulan data diteruskan maju dan mundur melalui jaringan neural.

#Train the model
model.fit(x_train, y_train, batch_size=1, epochs=1)

Buat kumpulan data pengujian.

#Test data set
test_data = scaled_data[training_data_len - 60: , : ]
#Create the x_test and y_test data sets
x_test = []
y_test = dataset[training_data_len : , : ] #Get all of the rows from index 1603 to the rest and all of the columns (in this case it's only column 'Close'), so 2003 - 1603 = 400 rows of data
for i in range(60,len(test_data)):
x_test.append(test_data[i-60:i,0])

Kemudian konversikan kumpulan data pengujian independen ‘x_test’ menjadi array sehingga dapat digunakan untuk menguji model LSTM.

#Convert x_test to a numpy array 
x_test = np.array(x_test)

Bentuk kembali data menjadi 3 dimensi dalam bentuk [jumlah sampel, jumlah langkah waktu, dan jumlah fitur].

#Reshape the data into the shape accepted by the LSTM
x_test = np.reshape(x_test, (x_test.shape[0],x_test.shape[1],1))

Sekarang dapatkan nilai prediksi dari model menggunakan data pengujian.

#Getting the models predicted price values
predictions = model.predict(x_test) 
predictions = scaler.inverse_transform(predictions)#Undo scaling

Uji root mean squared error (RMSE), yang merupakan ukuran tentang seberapa akurat model tersebut. Nilai 0 akan menunjukkan bahwa nilai prediksi model sesuai dengan nilai sebenarnya dari kumpulan data pengujian dengan sempurna. Semakin rendah nilainya, semakin baik model tersebut. Tetapi biasanya yang terbaik adalah menggunakan metrik lain untuk benar-benar mendapatkan gambaran tentang seberapa baik kinerja model.

#Calculate/Get the value of RMSE
rmse=np.sqrt(np.mean1)(predictions- y_test)**2)
rmse

Visualisasikan datanya.

#Plot/Create the data for the graph
train = data[:training_data_len]
valid = data[training_data_len:]
valid['Predictions'] = predictions
#Visualize the data
plt.figure(figsize=(16,8))
plt.title('Model')
plt.xlabel('Date', fontsize=18)
plt.ylabel('Close Price USD ($)', fontsize=18)
plt.plot(train['Close'])
plt.plot(valid[['Close', 'Predictions']])
plt.legend(['Train', 'Val', 'Predictions'], loc='lower right')
plt.show()

Outputnya:

Uji modelnya lagi dan mendapatkan prediksi nilai harga penutupan SAPX untuk 10 November 2019 (10/11/2020). Setelah dapat kutipannya, kemudian ubah data menjadi array yang hanya berisi harga penutupan. Dapatkan harga penutupan 60 hari terakhir dan menskalakan data menjadi nilai antara 0 dan 1 inklusif. Buat daftar kosong dan menambahkan harga 60 hari terakhir ke dalamnya, dan kemudian mengubahnya menjadi array dan modelkan kembali sehingga dapat memasukkan data ke dalam model tersebut.

#Get the quote
sapx_quote = web.DataReader('SAPX.JK', data_source='yahoo', start='2018-01-01', end='2020-11-10')
#Create a new dataframe
new_df = apple_quote.filter(['Close'])
#Get teh last 60 day closing price
last_60_days = new_df[-60:].values
#Scale the data to be values between 0 and 1
last_60_days_scaled = scaler.transform(last_60_days)
#Create an empty list
X_test = []
#Append teh past 60 days
X_test.append(last_60_days_scaled)
#Convert the X_test data set to a numpy array
X_test = np.array(X_test)
#Reshape the data
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
#Get the predicted scaled price
pred_price = model.predict(X_test)
#undo the scaling
pred_price = scaler.inverse_transform(pred_price)
print(pred_price)

Last but not least, masukkan data ke dalam model dan mendapatkan harga prediksi.

Outputnya:

[[263.97372]]

Sekarang mari kita lihat berapa harga sebenarnya untuk hari itu.

#Get the quote
sapx_quote2 = web.DataReader('SAPX.JK', data_source='yahoo', start='2020-11-09', end='2020-11-09')
print(apple_quote2['Close'])

Outputnya:

Date
2018-11-09     660
2018-11-12     640
2018-11-13     640
2018-11-14     650
2018-11-15     665
              ... 
2020-11-03    2150
2020-11-04    2150
2020-11-05    2150
2020-11-06    2150
2020-11-09    2150
Name: Close, Length: 503, dtype: int64

Dan hasilnya tidak jauh berbeda antara prediksi dan validity jika dilihat dari perhitungan diatas. Terakhir; ini hanya perhitungan tentang prediksi; dan kenyataan dilapangan sangat tergantung dari kondisi aktual perusahaan; keadaan keuangan, organisasi perusahaan, dan kondisi makro ekonomi yang ada.

Perbandingan Prediksi dan Aktual

References

1 (predictions- y_test)**2
4 thoughts on “Prediksi Harga Saham SAPX.JK dengan Python”
  1. Maksudnya adam itu apa ya di alenia kompilasi model menggunakan fungsi kerugian mean squared error (MSE) dan gunakan adam optimizer.

    1. adam itu Adaptive Movement Estimation; yaitu menghitung kecepatan mengambil pelajaran untuk setiap parameter berdasarkan gradien sebelumnya terhadap suatu data.

    1. Bisa saja membuat tampilan saham gabungan dalam 1 grafik. Misalnya kita akan menampilkan saham-saham perusahan jasa transportasi logistik yang masuk dalam bursa saham di Indonesia seperti perusahaan dengan kode TAXI, DEAL, SAPX, PPGL, WEHA, CASS, KJEN, IPCM, IMJS, dan ASSA.

      Tahap Pertama:

      import math
      import pandas_datareader as web
      import numpy as np
      import pandas as pd
      from sklearn.preprocessing import MinMaxScaler
      from keras.models import Sequential
      from keras.layers import Dense, LSTM
      import matplotlib.pyplot as plt
      plt.style.use('fivethirtyeight')
      pd.options.mode.chained_assignment = None

      Tahap Kedua: Pengambilan Data dari Internet (Yahoo Finance)

      df_A = web.DataReader('TAXI.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_B = web.DataReader('DEAL.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_C = web.DataReader('SAPX.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_D = web.DataReader('PPGL.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_E = web.DataReader('WEHA.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_F = web.DataReader('CASS.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_G = web.DataReader('KJEN.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_H = web.DataReader('IPCM.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_I = web.DataReader('IMJS.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')
      df_J = web.DataReader('ASSA.JK', data_source='yahoo', start='2019-01-01', end='2020-12-30')

      Tahap Ketiga: Tampilkan Grafinya untuk Harga Penutupan Sahamnya saja (misalnya)

      plt.figure(figsize = (15,10))
      plt.plot(df_A['Close'], label='PT. Express Transindo Utama')
      plt.plot(df_B['Close'], label='PT. Dewata Freight International')
      plt.plot(df_C['Close'], label='PT. Satria Antaran Prima')
      plt.plot(df_D['Close'], label='PT. Prima Globalindo Logistik')
      plt.plot(df_E['Close'], label='PT. WEHA Transportasi Indonesia')
      plt.plot(df_F['Close'], label='PT. Cardig Aero Services')
      plt.plot(df_G['Close'], label='PT. Jasa Armada Indonesia')
      plt.plot(df_H['Close'], label='PT. Krida Jaringan Nusantara')
      plt.plot(df_I['Close'], label='PT. Indomobil Multi Jasa')
      plt.plot(df_J['Close'], label='PT. Adi Sarana Armada')

      plt.legend(loc='best')
      plt.show()

      Outputnya:
      Grafik Penutupan Saham 2020 Perusahan Jasa Transportasi

      Kalau Pusing: Tampilkan yang diminati saja!

      plt.figure(figsize = (15,10))
      plt.plot(df_C['Close'], label='PT. Satria Antaran Prima')
      plt.plot(df_G['Close'], label='PT. Jasa Armada Indonesia')
      plt.plot(df_B['Close'], label='PT. Dewata Freight International')
      plt.plot(df_F['Close'], label='PT. Cardig Aero Services')

      plt.legend(loc='best')
      plt.show()

      Outputnya:
      Tampilan Grafik Penutupan Saham 4 Perusahan Logistik 2020

Leave a Reply

Your email address will not be published. Required fields are marked *