Membuat Model Prediksi Harga Saham Sederhana Menggunakan Python dan Scikit-learn

Halo para pembaca setia! Pernahkah Anda membayangkan bisa sedikit mengintip masa depan harga saham? Tentu saja, pasar saham terkenal dengan ketidakpastiannya yang tinggi, namun dengan kemajuan di bidang sains data dan machine learning, kita bisa mencoba membangun model yang memprediksi pergerakan harga, setidaknya untuk tujuan edukasi atau sebagai dasar analisis lebih lanjut. Dalam artikel ini, kita akan bersama-sama membuat model prediksi harga saham yang sederhana menggunakan Python dan salah satu pustaka machine learning paling populer, Scikit-learn. Mari kita selami dunia data dan investasi!

Mengapa Memprediksi Harga Saham?

Pasar saham adalah arena yang dinamis dan kompleks, dipengaruhi oleh ribuan faktor mulai dari kondisi ekonomi makro, kinerja perusahaan, sentimen investor, hingga peristiwa global yang tak terduga. Fluktuasi harga saham menawarkan peluang keuntungan sekaligus risiko kerugian yang signifikan. Kemampuan untuk memprediksi arah pergerakan harga saham, meskipun hanya dengan akurasi parsial, bisa menjadi aset berharga bagi investor, pedagang, maupun analis. Dengan model prediksi, kita dapat mengidentifikasi pola yang mungkin tidak terlihat oleh mata telanjang, menguji hipotesis, dan bahkan mengembangkan strategi perdagangan otomatis. Tujuan utama membangun model semacam ini bukanlah untuk 'memenangkan pasar' secara absolut, melainkan untuk memperoleh wawasan yang lebih dalam tentang dinamika pasar dan sebagai alat bantu dalam pengambilan keputusan yang lebih terinformasi. Ini adalah studi kasus yang menarik untuk mengaplikasikan kemampuan machine learning pada data deret waktu yang sangat relevan dengan dunia nyata.

Persiapan Lingkungan dan Data

Sebelum kita melangkah lebih jauh, pastikan Anda memiliki Python yang terinstal di komputer Anda. Jika belum, Anda bisa mengunduhnya dari situs resmi Python. Selanjutnya, kita perlu menginstal beberapa pustaka penting yang akan digunakan sepanjang tutorial ini. Pustaka-pustaka ini menyediakan fungsionalitas untuk manipulasi data, visualisasi, dan tentu saja, algoritma machine learning.

Instalasi Pustaka yang Dibutuhkan

Buka terminal atau command prompt Anda dan jalankan perintah berikut untuk menginstal pustaka yang diperlukan:

pip install pandas numpy scikit-learn matplotlib yfinance
  • pandas: Pustaka fundamental untuk analisis dan manipulasi data, khususnya DataFrame.
  • numpy: Pustaka untuk komputasi numerik, sangat penting untuk operasi matriks.
  • scikit-learn: Pustaka machine learning yang komprehensif, menyediakan berbagai algoritma.
  • matplotlib: Pustaka untuk membuat visualisasi data statis, interaktif, dan animasi di Python.
  • yfinance: Pustaka yang memungkinkan kita mengunduh data pasar finansial dari Yahoo! Finance dengan mudah.

Mengunduh Data Harga Saham

Untuk latihan ini, kita akan menggunakan data harga saham dari Yahoo! Finance. Anda bisa memilih saham perusahaan apa saja yang Anda minati. Sebagai contoh, mari kita gunakan saham Apple (AAPL) atau jika ingin saham Indonesia, Anda bisa mencari kode sahamnya (misal BBRI untuk Bank BRI). Kita akan mengunduh data historis harian untuk periode tertentu.

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# Definisikan simbol saham dan periode waktu
ticker_symbol = "AAPL" # Contoh: Apple Inc.
# ticker_symbol = "BBRI.JK" # Contoh: Bank Rakyat Indonesia (untuk pasar Indonesia)
start_date = "2010-01-01"
end_date = "2023-12-31"

# Mengunduh data
df = yf.download(ticker_symbol, start=start_date, end=end_date)

print(df.head())

Kode di atas akan mengunduh data historis harga saham Apple dari awal tahun 2010 hingga akhir 2023. DataFrame df akan berisi kolom-kolom seperti 'Open', 'High', 'Low', 'Close', 'Adj Close', dan 'Volume'.

Eksplorasi Data Awal

Setelah data berhasil diunduh, langkah selanjutnya adalah melakukan eksplorasi data awal untuk memahami strukturnya, mendeteksi nilai yang hilang (missing values), dan melihat ringkasan statistik. Ini adalah praktik terbaik dalam setiap proyek sains data.

# Menampilkan informasi dasar DataFrame
print(df.info())

# Menampilkan ringkasan statistik
print(df.describe())

# Mengecek missing values
print(df.isnull().sum())

# Visualisasi harga penutupan
plt.figure(figsize=(12, 6))
plt.plot(df['Close'])
plt.title(f'Harga Penutupan Historis {ticker_symbol}')
plt.xlabel('Tanggal')
plt.ylabel('Harga Penutupan (USD)')
plt.grid(True)
plt.show()

Melalui eksplorasi ini, kita dapat memastikan bahwa data yang kita miliki bersih dan siap untuk diproses lebih lanjut. Jika ada missing values, kita perlu menanganinya, misalnya dengan menghapus baris tersebut atau mengisi dengan metode imputasi. Untuk data harga saham dari Yahoo Finance, biasanya sangat bersih.

Pra-pemrosesan Data

Pra-pemrosesan data adalah tahapan krusial untuk menyiapkan data agar cocok digunakan oleh model machine learning. Kita perlu menentukan fitur (variabel independen) yang akan digunakan untuk memprediksi, dan target (variabel dependen) yang ingin kita prediksi.

Fitur dan Target

Dalam model prediksi harga saham, fitur bisa berupa harga pembukaan, harga tertinggi, harga terendah, volume perdagangan, atau bahkan indikator teknikal lainnya. Untuk target, kita ingin memprediksi harga penutupan di masa depan. Dalam contoh sederhana ini, mari kita coba memprediksi harga penutupan hari berikutnya berdasarkan harga hari ini dan beberapa hari sebelumnya. Kita akan membuat kolom 'Target' yang merupakan harga 'Close' hari berikutnya.

# Membuat kolom target: Harga penutupan hari berikutnya
df['Target'] = df['Close'].shift(-1)

# Menentukan fitur (X) dan target (y)
# Kita bisa menggunakan 'Open', 'High', 'Low', 'Close', 'Volume' sebagai fitur
features = ['Open', 'High', 'Low', 'Close', 'Volume']
X = df[features]
y = df['Target']

# Menghapus baris terakhir yang memiliki NaN di kolom 'Target'
# karena tidak ada data hari berikutnya
df.dropna(inplace=True)
X = df[features]
y = df['Target']

print(df.head())
print(df.tail())

Perhatikan bahwa kita menggunakan .shift(-1) untuk mengambil nilai dari baris berikutnya. Ini berarti baris terakhir di DataFrame akan memiliki nilai NaN untuk kolom 'Target' karena tidak ada data harga penutupan setelahnya. Kita perlu menghapus baris tersebut menggunakan dropna().

Pembagian Data Latih dan Uji

Langkah selanjutnya adalah membagi data kita menjadi set pelatihan (training set) dan set pengujian (testing set). Set pelatihan digunakan untuk 'mengajarkan' model pola-pola dalam data, sedangkan set pengujian digunakan untuk mengevaluasi seberapa baik model dapat menggeneralisasi pada data yang belum pernah dilihat sebelumnya. Dalam kasus data deret waktu seperti harga saham, sangat penting untuk membagi data secara sekuensial berdasarkan waktu, bukan secara acak, untuk menghindari data leakage (informasi masa depan bocor ke masa lalu).

# Pembagian data latih dan uji (misal 80% latih, 20% uji)
train_size = int(len(df) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

print(f"Ukuran data latih (X_train): {X_train.shape}")
print(f"Ukuran data uji (X_test): {X_test.shape}")
print(f"Ukuran target latih (y_train): {y_train.shape}")
print(f"Ukuran target uji (y_test): {y_test.shape}")

Dengan cara ini, model akan dilatih pada data historis dan diuji pada data yang lebih baru, mensimulasikan skenario dunia nyata.

Membangun Model Prediksi (Linear Regression Sederhana)

Setelah data kita siap, saatnya membangun model. Untuk permulaan, kita akan menggunakan model Linear Regression karena kesederhanaan dan interpretasinya yang mudah. Model ini mencoba menemukan hubungan linier antara fitur input dan variabel target.

Pemilihan Algoritma

Linear Regression adalah salah satu algoritma machine learning supervised yang paling dasar dan sering menjadi titik awal yang baik untuk masalah regresi. Model ini berasumsi bahwa ada hubungan linier antara variabel dependen (target) dan satu atau lebih variabel independen (fitur). Meskipun pasar saham jauh dari linier, Linear Regression memberikan fondasi yang kuat untuk memahami konsep dasar prediksi dan evaluasi model. Untuk model yang lebih canggih, kita bisa mempertimbangkan algoritma seperti Random Forest, Gradient Boosting, Support Vector Machines (SVM), atau bahkan jaringan saraf tiruan seperti LSTM untuk data deret waktu.

Inisialisasi dan Pelatihan Model

Kita akan mengimpor kelas LinearRegression dari scikit-learn, menginisialisasi model, dan melatihnya menggunakan data pelatihan.

# Inisialisasi model Linear Regression
model = LinearRegression()

# Melatih model menggunakan data pelatihan
model.fit(X_train, y_train)

print("Model telah berhasil dilatih.")

Metode .fit() adalah di mana keajaiban terjadi; model akan belajar pola dari X_train untuk memprediksi y_train.

Melakukan Prediksi

Setelah model dilatih, kita dapat menggunakannya untuk membuat prediksi pada set pengujian. Ini akan memberi kita gambaran tentang seberapa baik model bekerja pada data yang belum pernah dilihatnya.

# Melakukan prediksi pada data uji
y_pred = model.predict(X_test)

print("Prediksi pada data uji telah dibuat.")

Variabel y_pred sekarang berisi prediksi harga penutupan saham untuk setiap hari di set pengujian.

Evaluasi Model

Membuat prediksi saja tidak cukup; kita perlu tahu seberapa baik prediksi tersebut. Evaluasi model adalah langkah penting untuk memahami kinerja model dan mengidentifikasi area untuk perbaikan.

Metrik Evaluasi

Untuk masalah regresi, ada beberapa metrik umum yang bisa kita gunakan:

  • Mean Absolute Error (MAE): Rata-rata dari nilai absolut perbedaan antara prediksi dan nilai aktual. MAE lebih mudah diinterpretasikan karena berada dalam satuan yang sama dengan variabel target.
  • Mean Squared Error (MSE): Rata-rata dari kuadrat perbedaan antara prediksi dan nilai aktual. MSE lebih sensitif terhadap kesalahan besar karena mengkuadratkan error.
  • Root Mean Squared Error (RMSE): Akar kuadrat dari MSE. RMSE lebih populer daripada MSE karena memiliki satuan yang sama dengan variabel target, seperti MAE, tetapi tetap memberikan bobot lebih pada kesalahan yang besar.
  • R-squared (R2 Score): Menunjukkan proporsi varians dalam variabel dependen yang dapat diprediksi dari variabel independen. Nilai R-squared berkisar antara 0 dan 1, di mana nilai yang lebih tinggi menunjukkan kecocokan model yang lebih baik.
# Evaluasi model
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print(f"Mean Absolute Error (MAE): {mae:.2f}")
print(f"Mean Squared Error (MSE): {mse:.2f}")
print(f"Root Mean Squared Error (RMSE): {rmse:.2f}")
print(f"R-squared (R2 Score): {r2:.2f}")

Angka-angka ini akan memberi kita gambaran kuantitatif tentang kinerja model kita. Semakin rendah MAE, MSE, dan RMSE, semakin baik modelnya. Semakin tinggi R2, semakin baik model dapat menjelaskan variabilitas harga saham.

Visualisasi Hasil Prediksi

Selain metrik numerik, memvisualisasikan hasil prediksi dibandingkan dengan harga aktual sangat membantu untuk memahami kinerja model secara intuitif. Kita bisa melihat apakah prediksi kita mengikuti tren harga saham aktual.

# Menggabungkan hasil prediksi dengan harga aktual untuk visualisasi
predictions_df = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred}, index=y_test.index)

plt.figure(figsize=(14, 7))
plt.plot(predictions_df['Actual'], label='Harga Aktual')
plt.plot(predictions_df['Predicted'], label='Harga Prediksi', linestyle='--')
plt.title(f'Perbandingan Harga Aktual vs. Prediksi untuk {ticker_symbol}')
plt.xlabel('Tanggal')
plt.ylabel('Harga Penutupan (USD)')
plt.legend()
plt.grid(True)
plt.show()

# Visualisasi scatter plot
plt.figure(figsize=(10, 8))
plt.scatter(predictions_df['Actual'], predictions_df['Predicted'], alpha=0.5)
plt.plot([predictions_df['Actual'].min(), predictions_df['Actual'].max()],
         [predictions_df['Actual'].min(), predictions_df['Actual'].max()],
         'r--', lw=2, label='Garis Sempurna')
plt.title('Hubungan antara Harga Aktual dan Prediksi')
plt.xlabel('Harga Aktual')
plt.ylabel('Harga Prediksi')
plt.grid(True)
plt.legend()
plt.show()

Grafik garis akan menunjukkan seberapa dekat garis prediksi mengikuti garis harga aktual. Idealnya, kedua garis akan hampir bertumpang tindih. Scatter plot akan menunjukkan seberapa dekat titik-titik prediksi berkerumun di sekitar garis diagonal (garis sempurna, di mana prediksi = aktual). Semakin rapat, semakin baik.

Peningkatan dan Pertimbangan Lebih Lanjut

Model yang kita bangun ini adalah titik awal yang bagus. Namun, pasar saham sangat kompleks, dan ada banyak cara untuk meningkatkan model ini atau mempertimbangkan faktor-faktor lain.

Fitur Tambahan

Untuk membuat model yang lebih canggih, kita bisa menambahkan fitur-fitur lain yang mungkin relevan:

  • Indikator Teknikal: Moving Averages (MA), Relative Strength Index (RSI), Moving Average Convergence Divergence (MACD), Bollinger Bands, dll. Pustaka seperti ta (Technical Analysis) di Python dapat membantu menghitung ini.
  • Data Fundamental: Laporan keuangan perusahaan (pendapatan, laba, rasio P/E, dll.).
  • Data Ekonomi Makro: Tingkat suku bunga, inflasi, GDP, sentimen konsumen.
  • Analisis Sentimen: Berita, media sosial, atau ulasan yang berkaitan dengan perusahaan atau pasar secara umum.
  • Data Deret Waktu Lag: Harga penutupan beberapa hari sebelumnya (misal Close-1, Close-2, Close-3) sebagai fitur.

Algoritma Lain

Linear Regression adalah model linier. Untuk menangani hubungan non-linier dan pola yang lebih kompleks, Anda bisa mencoba algoritma lain:

  • Random Forest Regressor: Algoritma berbasis pohon keputusan yang kuat dan sering memberikan kinerja yang baik.
  • Gradient Boosting Regressor (misalnya XGBoost, LightGBM): Algoritma ensemble lain yang sangat efektif dan banyak digunakan dalam kompetisi data sains.
  • Support Vector Machines (SVM) for Regression (SVR): Cocok untuk menangani hubungan non-linier melalui penggunaan kernel.
  • Long Short-Term Memory (LSTM) Networks: Jenis jaringan saraf tiruan yang sangat efektif untuk data deret waktu, mampu menangkap dependensi jangka panjang. Membutuhkan pustaka seperti TensorFlow atau PyTorch.

Overfitting dan Regularisasi

Salah satu tantangan umum dalam machine learning adalah overfitting, di mana model terlalu 'menghafal' data pelatihan dan gagal menggeneralisasi pada data baru. Ini sangat relevan dalam prediksi harga saham. Teknik regularisasi seperti Ridge atau Lasso Regression dapat membantu mencegah overfitting dengan menambahkan penalti pada koefisien model.

Batasan dan Risiko

Penting untuk selalu mengingat bahwa prediksi harga saham sangat sulit dan penuh risiko. Model yang kita buat ini adalah model statistik berdasarkan data historis. Pasar saham dipengaruhi oleh faktor-faktor yang tidak dapat diprediksi (black swan events) dan sentimen manusia. Model ini tidak memperhitungkan semua faktor tersebut. Oleh karena itu, model ini harus dianggap sebagai alat bantu analisis dan bukan sebagai satu-satunya dasar untuk keputusan investasi riil. Jangan pernah mengandalkan satu model untuk membuat keputusan finansial yang signifikan.

Selamat! Anda telah berhasil membangun model prediksi harga saham sederhana menggunakan Python dan Scikit-learn. Ini adalah langkah awal yang fantastis dalam perjalanan Anda di dunia sains data dan keuangan kuantitatif. Eksplorasi lebih lanjut dengan fitur yang berbeda, algoritma yang lebih canggih, dan validasi yang lebih ketat akan memperkaya pemahaman Anda dan memungkinkan Anda membangun model yang semakin solid. Ingatlah, kuncinya adalah terus belajar dan bereksperimen. Sampai jumpa di artikel berikutnya!

Post a Comment

Previous Post Next Post