Prediksi Nilai Index LQ45
Memprediksi harga penutupan Indeks LQ45 pada 3 hari ke depan menggunakan Model SARIMAX.
DESKRIPSI PROJECT
Background Permasalahan
Pada dunia pasar modal, tentunya banyak orang yang ingin mendapatkan keuntungan yang maksimal. Untuk mencapai tujuan tersebut, sebenarnya ada banyak metode analisa yang dapat dilakukan. Namun untuk mempelajari dan menerapkannya diperlukan waktu dan ketekunan yang konsisten setiap harinya. Hal itu relatif sulit bagi sebagian orang, terlebih lagi bagi mereka yang mempunyai rutinitas yang padat.
Pada project ini, dimaksudkan untuk mengatasi problematik tersebut. Project ini akan mencoba melakukan prediksi harga penutupan salah satu indeks saham yang cukup populer di kalangan dunia pasar modal, yaitu Indeks LQ45.
Nilai indeks LQ45 yang akan diprediksi adalah harga penutupan pada 3 hari ke depan. Pemilihan angka 3 hari didapatkan dari hasil analisa dari beberapa analis saham, yang mengatakan bahwa kejadian di T0 idealnya akan terasa efeknya hingga 3-4 hari ke depan.
Diharapkan dengan mengetahui harga penutupan pada 3 hari ke depan, User dapat melakukan tindakan yang tepat (beli atau jual) untuk memaksimalkan keuntungan mereka.
Dari gambar, dapat dilihat bahwa data yang akan diprediksi berupa deret waktu. Salah satu model machine learning yang umum digunakan untuk melakukan pemodelan regresi deret waktu adalah ARIMA. ARIMA merupakan jenis model regresi univariate, sehingga yang tidak memerlukan fitur tambahan apapun untuk menghasilkan prediksi. ARIMA memiliki 3 parameter dasar, yaitu AR - Autoregressive (p
), I - Integrated (d
), MA - Moving Average (q
). Model ARIMA memiliki beberapa pengembangan seiring kemajuan jaman, yaitu SARIMA, ARIMAX, dan SARIMAX.
(S)ARIMA merupakan pengembangan model ARIMA dengan tambahan parameter seasonal yang dapat mendeteksi adanya efek musiman untuk periode waktu yang lebih besar. Misalnya, untuk data dengan rentang waktu bulanan, efek musiman dapat melihat pola musiman secara tahunan (per 12 bulan). SARIMA memiliki tambahan 3 parameter tambahan selain seasonal (S
), yaitu Seasonal-Autoregressive (P
), Seasonal-Integrated (D
), Seasonal-Moving Average (Q
).
ARIMA(X) merupakan pengembangan model ARIMA yang menggunakan tambahan fitur-fitur eksogen untuk menghasilkan prediksi. Hal ini dipercaya dapat meningkatkan performa dari model ARIMA biasa.
(S)ARIMA(X) merupakan gabungan dari model SARIMA dan ARIMAX. Model inilah yang akan digunakan pada project ini.
Arsitektur Project
Berikut arsitektur project secara umum:
Penjelasan singkat:
- Pada Proses prediksi (tanda panah warna biru dan merah) data input didapatkan dari User melalui API. Sedangkan untuk Proses retrain model (tanda panah warna hijau) data didapat dalam bentuk file csv.
- Pada Proses prediksi, tahapan proses yang dilalui di dalam Sistem Machine Learning adalah: Validasi Data, Preprocessing Data & Feature Engineering, dan Predictor.
- Predictor adalah output yang dihasilkan pada Proses retrain model setelah berhasil didapatkan Model Best-Fit.
- Pada Proses retrain model, ada tambahan proses Splitting Data, Fit & Train Model.
- Output dari Predictor akan dikembalikan ke User melalui API.
Output yang diharapkan
- Prediksi harga penutupan Indeks LQ45 pada T+3.
DETAIL PROJECT
Data yang diperlukan
Berbeda dengan pemodelan menggunakan ARIMA/SARIMA yang hanya menggunakan satu variabel (univariate) deret waktu, pemodelan SARIMAX juga memerlukan input eksogen (X).
Untuk proses pelatihan, validasi, dan test model, diperlukan data berupa deret waktu dengan interval harian sejak 2012 hingga kuartal pertama 2022.
Berikut beberapa data yang akan digunakan dalam project ini:
- Harga penutupan index LQ45 pada T+3 (hanya digunakan untuk pemodelan, namun tidak digunakan saat proses prediksi).
- Harga penutupan Indeks IHSG pada T0.
- Harga penutupan Indeks IDX-30 pada T0.
- Harga penutupan Indeks EIDO pada T0.
- Harga penutupan Indeks S&P 500 pada T0.
- Jumlah nominal transaksi pembelian domestik pada T0.
- Jumlah nominal transaksi penjualan domestik pada T0.
- Jumlah nominal transaksi pembelian asing pada T0.
- Jumlah nominal transaksi penjualan asing pada T0.
Output prediksi via API
- Prediksi harga penutupan Indeks LQ45 pada T+3.
Workflow Project (Proses Retrain Model)
Berikut workflow untuk Proses Retrain Model, setelah melalui beberapa kali proses trial-error:
- Pengambilan data dari file csv dengan format yang sudah sesuai.
- Validasi data untuk memastikan bahwa format sudah sesuai dengan ketentuan.
- Resampling data dengan interval hari kerja (senin, selasa, rabu, kamis, jumat), sekaligus imputasi data point yang hilang dengan metode ffill.
- Membentuk kolom
target
yang dibentuk dari kolomlq45
yang di-shift-forward sejauh 3 data point. - Penambahan 4 fitur baru (
dom_tot
,dom_net
,for_tot
,for_net
) yang bertujuan untuk memudahkan model dalam melakukan training.dom_tot
merupakan kolomdom_b
dijumlahkan dengan kolomdom_s
.dom_net
merupakan kolomdom_b
dikurangkan dengan kolomdom_s
.for_tot
merupakan kolomfor_b
dijumlahkan dengan kolomfor_s
.for_net
merupakan kolomfor_b
dikurangkan dengan kolomfor_s
.
- Splitting data dengan komposisi:
- data train adalah data sejak awal hingga 31-12-2020.
- data validasi adalah data sejak 01-01-2021 hingga 31-07-2021.
- data test adalah data sejak 01-08-2021 hingga data terakhir.
- Penambahan fitur
seasonal
yang mempresentasikan trend dari kolomtarget
dalam interval bulanan. - Mendeteksi data outlier pada semua kolom dengan metode 1.5 x IQR, serta melakukan imputasi dengan nilai percentile 10% untuk outlier bawah, dan percentile 90% untuk outlier atas.
- Proses scaling standardisasi untuk semua kolom, kecuali kolom
target
. - Proses pelatihan model dengan pustaka pmdarima, yang secara otomatis dapat menentukan parameter-parameter model SARIMAX yang terbaik.
- Evaluasi model dilakukan pada data validasi dan data test dengan cara membandingkan hasil prediksi
pred
dengan kolomtarget
.
Berikut ilustrasinya,
Catatan tambahan:
- Setelah langkah ke 7 (Penambahan fitur
seasonal
), pernah dicoba dilakukan proses Stationaring Data, yaitu mentransformasi semua kolom menjadi bentuk yang stasioner dengan metode first difference. Menurut beberapa literatur, proses ini merupakan syarat pemodelan ARIMA dan turunannya. Namun saat proses ke 11 (Evaluasi model), menunjukkan bahwa proses Stationaring Data malah menghasilkan performa model yang buruk. Sehingga proses Stationaring Data ini tidak diterapkan.
Workflow Project (Proses Prediksi)
Berikut workflow untuk Proses Prediksi:
- Penerimaan data dari User melalui API dengan format yang sudah sesuai.
- Validasi data untuk memastikan bahwa format sudah sesuai dengan ketentuan.
- Proses konversi data kedalam bentuk Pandas Dataframe.
- Penambahan 4 fitur baru (
dom_tot
,dom_net
,for_tot
,for_net
) yang bertujuan untuk memudahkan model dalam melakukan training.dom_tot
merupakan kolomdom_b
dijumlahkan dengan kolomdom_s
.dom_net
merupakan kolomdom_b
dikurangkan dengan kolomdom_s
.for_tot
merupakan kolomfor_b
dijumlahkan dengan kolomfor_s
.for_net
merupakan kolomfor_b
dikurangkan dengan kolomfor_s
.
- Penambahan fitur
seasonal
dari pickle dataframe yang sebelumnya dibuat saat proses pemodelan (file: [root]\data\remodel\value_for_seasonal.pkl). - Mendeteksi data outlier pada semua kolom, serta melakukan imputasi dengan nilai dari pickle dataframe yang sebelumnya dibuat saat proses pemodelan (file: [root]\data\remodel\value_for_outlier.pkl).
- Proses scaling standardisasi untuk semua kolom menggunakan pickle scaler yang sebelumnya dibuat saat proses pemodelan (file: [root]\data\remodel\scaler_x.pkl).
- Proses prediksi menggunakan model yang sebelumnya dibuat saat proses pemodelan (file: [root]\models\sarimax.pkl).
- Pengiriman hasil prediksi kembali ke User melalui API.
Berikut ilustrasinya,
DATASET
Format dan deskripsi data
header csv - date,lq45,jci,idx30,eido,spy,dom_b,dom_s,for_b,for_s
Header | Tipe Data | Definisi | Deskripsi |
---|---|---|---|
date |
date dengan format yyyy-mm-dd |
Deret waktu dengan periode harian, sesuai dengan kalender hari kerja di Indonesia. |
|
lq45 |
float dengan format .4f |
Harga penutupan Index LQ45 |
Representasi/cerminan harga saham dari 45 emiten yang ada di Bursa Efek Indonesia (BEI) yang dipilih berdasarkan pertimbangan likuiditas tertinggi dan kapitalisasi pasar terbesar dengan kriteria-kriteria lain yang sudah ditentukan. |
jci |
float dengan format .4f |
Harga penutupan Index IHSG (Index Harga Saham Gabungan) |
Cerminan harga dari seluruh saham yang ada di Bursa Efek Indonesia (BEI). |
idx30 |
float dengan format .4f |
Harga penutupan Index IDX-30 |
Indeks saham yang mengukur kinerja harga dari 30 saham yang memiliki likuiditas tinggi dan kapitalisasi pasar yang besar serta didukung oleh kekuatan fundamental perusahaannya yang baik. |
eido |
float dengan format .4f |
Harga penutupan Index EIDO |
Indeks Mutual Fund sejenis ETF (Exchange Traded Fund) atau reksadana dibursa "NYSE / New York Stock Exchange", yang didalamnya terdapat saham-saham Indonesia yang dipilih berdasarkan kriteria dari MSCI (Morgan Stanley Composite Index). |
spy |
float dengan format .4f |
Harga penutupan Index Standard & Poor's 500 (S&P 500) |
Representasi/cerminan harga saham dari 500 emiten Amerika Serikat yang dipilih berdasarkan kapitalisasi pasar, likuiditas, kelompok industri, beserta sejumlah kriteria lainnya. Emiten dalam indeks S&P 500 dipilih oleh Komite Indeks S&P. |
dom_b |
float dengan format .4f |
Jumlah nominal transaksi pembelian domestik (dalam satuan triliun) |
|
dom_s |
float dengan format .4f |
Jumlah nominal transaksi penjualan domestik (dalam satuan triliun) |
|
for_b |
float dengan format .4f |
Jumlah nominal transaksi pembelian asing (dalam satuan triliun) |
|
for_s |
float dengan format .4f |
Jumlah nominal transaksi penjualan asing (dalam satuan triliun) |
CARA PENGGUNAAN
Format input untuk melakukan prediksi via API
Menggunakan format standar json dengan key sebagai berikut:
date
- Tanggal dengan formatyyyymmdd
- tipe data string dan harus terdiri dari 8 karakter.
jci
- Nilai penutupan indeks IHSG pada tanggaldate
- tipe data float dengan rentang nilai 1,000 hingga 20,000.
idx30
- Nilai penutupan indeks IDX-30 pada tanggaldate
- tipe data float dengan rentang nilai 100 hingga 5,000.
eido
- Nilai penutupan indeks EIDO pada tanggaldate
- tipe data float dengan rentang nilai 1 hingga 200.
spy
- Nilai penutupan indeks S&P 500 pada tanggaldate
- tipe data float dengan rentang nilai 1 hingga 5,000.
dom_b
- Jumlah nominal transaksi pembelian domestik (dalam satuan triliun) pada tanggaldate
- tipe data float dengan rentang nilai 0.01 hingga 100.
dom_s
- Jumlah nominal transaksi penjualan domestik (dalam satuan triliun) pada tanggaldate
- tipe data float dengan rentang nilai 0.01 hingga 100.
for_b
- Jumlah nominal transaksi pembelian asing (dalam satuan triliun) pada tanggaldate
- tipe data float dengan rentang nilai 0.01 hingga 100.
for_s
- Jumlah nominal transaksi penjualan asing (dalam satuan triliun) pada tanggaldate
- tipe data float dengan rentang nilai 0.01 hingga 100.
Contoh:
{
"date": "20220328",
"jci": 7049.6030,
"idx30": 549.373,
"eido": 24.92,
"spy": 455.91,
"dom_b": 9.9995,
"dom_s": 10.8573,
"for_b": 4.2166,
"for_s": 3.3587
}
Format output Respons dari API
Respons juga berupa format standar json dengan key sebagai berikut:
input_date
- Tanggal sesuai inputdate
dengan formatyyyymmdd
- tipe data string yang terdiri dari 8 karakter.
pred_value
- Hasil prediksi Nilai indeks LQ45 3 hari kerja setelahinput_date
- tipe data float.
pred_desc
- Deskripsi dari hasil prediksi- tipe data string.
Contoh:
{
"input_date": "20220328",
"pred_value": 1053.672,
"pred_desc": "3 Business Days after 28-Mar-2022, LQ45 value would be 1053.672"
}
Menjalankan Layanan Machine Learning di Komputer Lokal
- Melakukan Retrain Model :
- Dari folder root, jalankan script python
remodelling.py
pada folder src. - Pastikan dataset sudah berada di folder [root]/data/raw dengan nama file dataset_Q122.csv dengan format yang sesuai.
- Dari folder root, jalankan script python
python src\remodelling.py
- Menjalankan API :
- Dari folder root, jalankan script python
api.py
pada folder src. - Setelah server API menyala (URL : localhost:8080/pred/), lakukan API POST dengan format json yang sesuai.
- Dari folder root, jalankan script python
python src\api.py --reload
KESIMPULAN
Model SARIMAX yang merupakan pengembangan dari model ARIMA/ARIMAX/SARIMA secara umum dapat digunakan untuk melakukan prediksi nilai indeks LQ45 3 hari ke depan.
Namun hasil prediksi dirasa masih kurang akurat.
Hal ini sebenarnya dapat diatasi dengan melakukan eksplorasi tiap-tiap fitur dengan lebih mendalam. Bisa juga dengan melakukan hyperparameter tunning yang lebih variatif pada model.
Untuk penelitian lebih lanjut, dapat coba digunakan model machine learning LSTM (Long Short Term Memory network) dan/atau GRU (Gated Recurrent Unit) yang menurut beberapa sumber, dapat menghasilkan performa yang lebih baik ketimbang model SARIMAX.
REFERENSI
Lingkup bisnis :
Dekomposisi seasonal dan ADF Test :
ARIMA, ARIMAX, SARIMA, SARIMAX :
- statsmodels SARIMAX
- pmdarima
- Time Series Forecasting with ARIMA , SARIMA and SARIMAX (by: Brendan Artley)
- How to Create an ARIMA Model for Time Series Forecasting in Python (by: Jason Brownlee)
- An Introduction to Time Series Analysis with ARIMA (by: Taha Binhuraib)
- Time Series Forecasting: ARIMA vs LSTM vs PROPHET (by: Mauro Di Pietro)
- ARIMA Model – Complete Guide to Time Series Forecasting in Python (by: Selva Prabhakaran)
Panduan lengkap: