Perbandingan Metode Regresi Nonparametrik dan Machine Learning untuk Memprediksi Harga Tutup Solana
Pendahuluan
Latar Belakang
Pasar mata uang kripto dikenal sangat fluktuatif, sehingga prediksi harga penutupan (closing price) menjadi sangat penting untuk pengelolaan risiko, pengambilan keputusan investasi, dan evaluasi strategi trading. Dalam penelitian ini, Solana dipilih sebagai objek studi karena merupakan salah satu aset kripto dengan volume transaksi dan perhatian pasar yang tinggi.
Solana menarik untuk dikaji karena beberapa alasan utama. Pertama, sebagai blockchain berperforma tinggi, Solana mampu memproses ribuan transaksi per detik, mencerminkan kemajuan teknologi blockchain modern. Kedua, volatilitas harga Solana yang tinggi menjadikannya sangat cocok untuk menguji efektivitas metode regresi nonparametrik dalam menangkap pola non-linear pada data time series. Ketiga, kebutuhan akan model prediksi yang akurat sangat mendesak bagi investor dan trader untuk mengelola risiko di pasar kripto yang sangat dinamis.
Penelitian ini membandingkan pendekatan regresi nonparametrik dan Machine Learning yang fleksibel untuk memprediksi harga penutupan Solana berdasarkan data historis time series, yaitu regresi kernel Nadaraya-Watson dan model boosting tree LightGBM. Tujuannya adalah mengevaluasi efektivitas kedua metode dalam menangkap pola non-linear pada data harga kripto.
Tentang Solana
Solana adalah platform blockchain berperforma tinggi yang dirancang untuk mendukung aplikasi terdesentralisasi (dApps) dan cryptocurrency dengan skalabilitas tinggi. Dengan mekanisme konsensus Proof of Stake (PoS) dan Proof of History (PoH), Solana mampu memproses hingga 65.000 transaksi per detik dengan biaya transaksi yang sangat rendah.
Karakteristik Utama Solana:
- Kecepatan: Transaksi diproses dalam hitungan detik
- Biaya Rendah: Biaya transaksi sangat kompetitif
- Skalabilitas: Mendukung ribuan dApps dan smart contracts
- Ekosistem: Beragam proyek DeFi, NFT, dan Web3
Urgensi dan Kecocokan Metode:
Solana dipilih karena volatilitasnya yang tinggi, mencerminkan dinamika pasar kripto secara umum. Metode regresi nonparametrik seperti Nadaraya-Watson dan LightGBM sangat cocok untuk data kripto karena tidak memerlukan asumsi distribusi tertentu dan mampu menangkap pola non-linear yang kompleks. Dalam dunia cryptocurrency, harga sangat dipengaruhi oleh banyak faktor eksternal (sentimen pasar, regulasi, berita), metode nonparametrik memberikan fleksibilitas lebih tinggi dibandingkan metode parametrik tradisional.
Tujuan Penelitian
Penelitian ini bertujuan untuk:
- Mengembangkan model prediksi harga penutupan Solana menggunakan metode regresi nonparametrik dan Machine Learning.
- Membandingkan performa antara metode Nadaraya-Watson Kernel Regression dan LightGBM.
- Mengevaluasi efektivitas kedua metode dalam menangkap pola non-linear pada data time series harga kripto.
- Mengimplementasikan model dalam bentuk aplikasi interaktif untuk visualisasi dan analisis hasil.
Studi Kasus
Studi kasus pada penelitian ini adalah prediksi harga penutupan
(close price) Solana menggunakan data historis time series dengan
interval 1 jam. Target yang diprediksi adalah kolom close
yang merepresentasikan harga penutupan pada setiap periode waktu.
Horizon Prediksi: 1 langkah ke depan (1 jam ke depan)
Fitur yang Digunakan:
- Informasi historis (lag features): open, high, low, volume dari periode sebelumnya
- Fitur turunan: moving average, indikator volatilitas
Metode yang Dibandingkan:
- Regresi Kernel Nadaraya-Watson: Metode nonparametrik yang menggunakan fungsi kernel untuk estimasi nilai target berdasarkan bobot jarak antar titik.
- LightGBM: Algoritma gradient boosting yang sangat efisien untuk menangkap pola non-linear pada data time series.
Dataset dan Metode Pengambilan Data
Dataset yang digunakan berisi data harga historis Solana yang diperoleh dari platform KuCoin melalui API resmi. Data terdiri dari komponen OHLCV (Open, High, Low, Close, Volume) dengan interval waktu 1 jam.
Komposisi Dataset:
datetime: Tanggal dan waktu observasiopen: Harga pembukaan periodehigh: Harga tertinggi periodelow: Harga terendah periodeclose: Harga penutupan periode (target prediksi)volume: Volume transaksi periode
Proses Pengambilan Data:
- Penarikan data historis melalui KuCoin API
- Penyelarasan format tanggal dan waktu
- Pengurutan data berdasarkan kronologi waktu
- Pembersihan data (missing value, duplikasi, outlier ekstrem)
- Validasi konsistensi data
Alur Proses Penelitian
Penelitian ini mengikuti alur proses sistematis sebagai berikut:
- Pengumpulan Data: Pengambilan data historis harga Solana dari KuCoin API.
- Preprocessing Data: Pembersihan dan transformasi data mentah menjadi format yang siap dianalisis.
- Eksplorasi Data: Analisis deskriptif dan visualisasi untuk memahami karakteristik data.
- Feature Engineering: Pembentukan fitur-fitur prediktif dari data historis.
- Pembagian Data: Split data menjadi training dan testing set secara temporal.
- Pengembangan Model: Training model Nadaraya-Watson dan LightGBM.
- Evaluasi Model: Pengukuran performa menggunakan metrik statistik.
- Visualisasi Hasil: Analisis komparatif dan interpretasi hasil.
- Implementasi Aplikasi: Deployment model dalam bentuk aplikasi interaktif.
- Kesimpulan: Temuan dan rekomendasi untuk pengembangan lanjutan.
Eksplorasi Data
Load Data
Data historis harga Solana dengan interval satu jam dimuat menggunakan fungsi pembacaan data yang mendukung efisiensi pada dataset berukuran besar. Selanjutnya dilakukan identifikasi kolom yang mencakup variabel waktu, harga pembukaan, harga tertinggi, harga terendah, harga penutupan, dan volume transaksi. Variabel waktu diparsing ke dalam format datetime dengan zona waktu yang konsisten, sementara seluruh variabel numerik dikonversi ke tipe numerik untuk menghindari kesalahan pembacaan akibat perbedaan format penulisan angka. Data kemudian diurutkan berdasarkan waktu untuk memastikan urutan kronologis yang benar sebagai dasar analisis deret waktu.
# LIBRARY SETUP
pkgs <- c("data.table", "lubridate", "ggplot2", "corrplot", "gridExtra", "lightgbm", "scales", "reshape2")
for (p in pkgs) {
if (!require(p, character.only = TRUE)) install.packages(p, dependencies = TRUE)
library(p, character.only = TRUE)
}
set.seed(42)# DATA LOADING FUNCTIONS
to_num_id <- function(x) {
if (is.numeric(x)) return(x)
x <- trimws(as.character(x))
x[x == ""] <- NA_character_
dots <- gregexpr("\\.", x, perl = TRUE)
ndots <- sapply(dots, function(m) if (length(m) == 1 && m[1] == -1) 0 else length(m))
y <- x
y[ndots >= 2] <- gsub("\\.", "", y[ndots >= 2])
y <- gsub(",", "", y)
y <- gsub(" ", "", y)
suppressWarnings(as.numeric(y))
}
parse_dt_id <- function(x) {
suppressWarnings(dmy_hm(as.character(x), tz = "UTC"))
}
# LOAD DATASET
path <- "D:/KULIAH NOVIA/SMT 5 NOVIA/Semiparametric Regression/pubs/UAS-REGRESI-SEMIPARAMETRIK/data solana 1 jam.csv"
raw <- fread(path, stringsAsFactors = FALSE)
cat("Jumlah Observasi:", nrow(raw), "\n")## Jumlah Observasi: 6526
## Jumlah Variabel : 7
# INITIAL PREPROCESSING
need_cols <- c("datetime", "open", "high", "low", "close", "volume")
miss <- setdiff(need_cols, names(raw))
if (length(miss) > 0) stop("Kolom hilang: ", paste(miss, collapse = ", "))
raw[, ts := parse_dt_id(datetime)]
for (col in c("open", "high", "low", "close", "volume")) {
raw[[col]] <- to_num_id(raw[[col]])
}
setorder(raw, ts)Hasil prapemrosesan menunjukkan bahwa dataset terdiri dari 6526 observasi dengan struktur variabel yang lengkap dan konsisten. Seluruh kolom numerik berhasil dikonversi tanpa kehilangan data yang signifikan, dan variabel waktu telah terdefinisi dengan baik sehingga memungkinkan analisis temporal yang valid. Dengan urutan data yang telah terjaga dan tipe data yang sesuai, dataset berada dalam kondisi siap digunakan untuk tahap eksplorasi lanjutan maupun pemodelan deret waktu tanpa memerlukan penyesuaian struktural tambahan.
Statistik Deskriptif
Statistik deskriptif dihitung untuk variabel harga pembukaan, harga tertinggi, harga terendah, harga penutupan, serta volume transaksi. Ukuran yang digunakan meliputi nilai rata-rata, simpangan baku, nilai minimum, dan maksimum, dengan pengabaian nilai hilang jika ada. Perhitungan ini bertujuan memberikan ringkasan kuantitatif mengenai kecenderungan sentral dan tingkat penyebaran data sebagai dasar pemahaman awal sebelum analisis lebih lanjut. Selain itu, rentang waktu pengamatan ditentukan berdasarkan nilai minimum dan maksimum dari variabel waktu untuk memastikan cakupan periode analisis.
# SUMMARY STATISTICS
desc_stats <- raw[, .(
Mean = sapply(.SD, mean, na.rm = TRUE),
SD = sapply(.SD, sd, na.rm = TRUE),
Min = sapply(.SD, min, na.rm = TRUE),
Max = sapply(.SD, max, na.rm = TRUE)
), .SDcols = c("open", "high", "low", "close", "volume")]
print(desc_stats)## Mean SD Min Max
## <num> <num> <num> <num>
## 1: 1.676802e+02 3.195245e+01 97.140 2.51350e+02
## 2: 1.686298e+02 3.207051e+01 98.853 2.53410e+02
## 3: 1.666666e+02 3.180465e+01 95.236 2.49810e+02
## 4: 1.676806e+02 3.194978e+01 97.135 2.51360e+02
## 5: 9.282127e+11 2.275700e+13 2977.690 1.83471e+15
## Periode Awal : 12 March 2025 04:00
## Periode Akhir: 09 December 2025 01:00
Hasil statistik deskriptif menunjukkan bahwa rata-rata harga pembukaan, tertinggi, terendah, dan penutupan berada pada kisaran yang relatif berdekatan, dengan simpangan baku sekitar 31–32 USD, yang mencerminkan fluktuasi harga yang cukup besar sepanjang periode pengamatan. Rentang harga yang lebar, dari sekitar 95–99 USD hingga lebih dari 250 USD, mengindikasikan adanya fase pergerakan harga ekstrem dalam periode Maret hingga Desember 2025. Sementara itu, volume perdagangan memiliki variasi yang sangat tinggi, tercermin dari perbedaan yang jauh antara nilai rata-rata dan maksimum, yang menunjukkan distribusi volume yang sangat tidak merata dan kemungkinan keberadaan lonjakan aktivitas pasar pada waktu-waktu tertentu. Secara keseluruhan, statistik ini mengindikasikan dinamika pasar Solana yang aktif dengan fluktuasi harga dan volume yang signifikan sepanjang periode analisis.
Visualisasi Time Series
Visualisasi deret waktu dilakukan dengan memetakan harga penutupan Solana terhadap variabel waktu menggunakan grafik garis. Data mentah dengan interval satu jam digunakan tanpa agregasi untuk mempertahankan resolusi temporal asli. Grafik disusun dengan penyesuaian skala sumbu, format nilai harga dalam satuan dolar, serta pengaturan tampilan visual agar pola pergerakan harga dapat diamati secara jelas. Visualisasi ini bertujuan sebagai alat eksploratif untuk memahami dinamika harga sepanjang periode pengamatan sebelum dilakukan analisis lanjutan atau pemodelan.
# TIME SERIES VISUALIZATION - RAW DATA
ggplot(raw, aes(x = ts, y = close)) +
geom_line(color = "#00FFA3", size = 0.5, alpha = 0.8) +
labs(
title = "Time Series Harga Penutupan Solana",
subtitle = "Data Mentah - Interval 1 Jam",
x = "Waktu",
y = "Harga Close (USD)"
) +
scale_y_continuous(labels = dollar_format(prefix = "$")) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
axis.text.x = element_text(angle = 45, hjust = 1)
)Grafik deret waktu harga penutupan Solana dengan interval satu jam menunjukkan dinamika harga yang fluktuatif dengan beberapa fase tren yang jelas sepanjang periode pengamatan. Pada awal periode, harga bergerak relatif stabil dengan kecenderungan naik, kemudian diikuti fase volatilitas yang lebih tinggi di pertengahan periode, ditandai oleh kenaikan harga yang cukup tajam hingga mencapai puncak sebelum mengalami koreksi signifikan. Setelah puncak tersebut, terlihat adanya tren penurunan yang berkelanjutan dengan volatilitas yang masih cukup tinggi, meskipun amplitudo fluktuasi cenderung mengecil mendekati akhir periode. Secara keseluruhan, grafik ini mencerminkan karakteristik pasar kripto yang sensitif terhadap sentimen dan informasi, dengan pergerakan harga yang cepat, tidak linear, serta menunjukkan adanya fase ekspansi dan kontraksi harga yang bergantian.
Analisis Korelasi
Analisis korelasi dilakukan dengan menghitung koefisien korelasi Pearson antara variabel harga pembukaan, harga tertinggi, harga terendah, harga penutupan, serta volume perdagangan. Perhitungan dilakukan menggunakan observasi lengkap untuk menghindari distorsi akibat nilai hilang. Hasil korelasi kemudian disajikan dalam bentuk matriks korelasi numerik dan divisualisasikan melalui heatmap untuk memudahkan identifikasi kekuatan dan arah hubungan antarvariabel secara visual.
# CORRELATION ANALYSIS
cor_matrix <- cor(raw[, .(open, high, low, close, volume)], use = "complete.obs")
print(cor_matrix)## open high low close volume
## open 1.00000000 0.99955622 0.99911834 0.99908711 0.01904072
## high 0.99955622 1.00000000 0.99896531 0.99956491 0.01912753
## low 0.99911834 0.99896531 1.00000000 0.99927949 0.01783072
## close 0.99908711 0.99956491 0.99927949 1.00000000 0.01880998
## volume 0.01904072 0.01912753 0.01783072 0.01880998 1.00000000
# Heatmap Koreas
cor_melt <- melt(cor_matrix)
names(cor_melt) <- c("Var1", "Var2", "Correlation")
ggplot(cor_melt, aes(x = Var1, y = Var2, fill = Correlation)) +
geom_tile(color = "white", size = 0.5) +
geom_text(aes(label = sprintf("%.4f", Correlation)),
color = "black", size = 3.5) +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1, 1), space = "Lab",
name = "Koefisien\nKorelasi") +
labs(
title = "Heatmap Korelasi Detail",
x = "",
y = ""
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
axis.text.y = element_text()
)- open, high, low, close: Korelasi sangat tinggi (0.999+), menandakan harga-harga dalam interval 1 jam bergerak sangat sejalan.
- volume dengan harga: Korelasi rendah, menunjukkan volume trading kurang berhubungan dengan pergerakan harga.
- Korelasi sempurna antar harga OHLC mengindikasikan data sangat konsisten dalam interval waktu pendek.
Distribusi Close
Analisis distribusi harga penutupan dilakukan menggunakan histogram dan boxplot untuk menggambarkan pola penyebaran nilai harga secara keseluruhan. Histogram digunakan untuk mengamati bentuk distribusi, kecenderungan konsentrasi data, serta potensi skewness, sedangkan boxplot digunakan untuk mengidentifikasi posisi median, rentang antar kuartil, serta keberadaan nilai ekstrem. Kombinasi kedua visualisasi ini memberikan gambaran mengenai karakteristik distribusi harga penutupan Solana.
# DISTRIBUTION ANALYSIS
p1 <- ggplot(raw, aes(x = close)) +
geom_histogram(fill = "#9945FF", alpha = 0.7, bins = 30) +
labs(title = "Distribusi Harga Close", x = "Harga (USD)", y = "Frekuensi") +
theme_minimal()
p2 <- ggplot(raw, aes(y = close)) +
geom_boxplot(fill = "#14F195", alpha = 0.7) +
labs(title = "Boxplot Harga Close", x = "", y = "Harga (USD)") +
theme_minimal()
grid.arrange(p1, p2, ncol = 2)histogram harga close menunjukkan distribusi yang tidak simetris sempurna, dengan konsentrasi utama pada rentang menengah dan ekor yang memanjang ke arah harga yang lebih tinggi, sehingga mengindikasikan skewness positif ringan. Ini berarti harga tinggi relatif lebih jarang tetapi tetap muncul. Boxplot memperkuat hal ini dengan median yang tidak berada tepat di tengah rentang serta adanya beberapa nilai ekstrem di sisi atas, yang menunjukkan variasi harga yang cukup besar dan keberadaan outlier.
Preprocessing
Feature Engineering
Pada tahap feature engineering, dilakukan pembentukan fitur lag satu periode (lag-1) untuk variabel open, high, low, dan volume dengan tujuan menangkap pola ketergantungan temporal dalam data deret waktu. Proses ini dilakukan dengan menggeser masing-masing variabel satu periode ke belakang sehingga merepresentasikan informasi historis yang tersedia sebelum periode prediksi. Selanjutnya, dataset disusun dengan memilih variabel waktu, fitur lag sebagai prediktor, dan harga penutupan sebagai variabel target. Observasi yang mengandung nilai hilang akibat proses pergeseran dieliminasi untuk memastikan kelengkapan data sebelum pemodelan.
# LAG FEATURE ENGINEERING
raw[, open_lag1 := shift(open, 1)]
raw[, high_lag1 := shift(high, 1)]
raw[, low_lag1 := shift(low, 1)]
raw[, volume_lag1 := shift(volume, 1)]
FEATURES <- c("open_lag1", "high_lag1", "low_lag1", "volume_lag1")
TARGET <- "close"
df <- raw[, c("ts", FEATURES, TARGET), with = FALSE]
df <- df[complete.cases(df)]
cat("Fitur yang digunakan (lag-1):\n")## Fitur yang digunakan (lag-1):
## 1. open_lag1
## 2. high_lag1
## 3. low_lag1
## 4. volume_lag1
##
## Target: close
## Observasi tersedia: 6525
Hasil feature engineering menunjukkan bahwa empat fitur lag berhasil dibentuk dan digunakan sebagai variabel prediktor untuk memodelkan harga penutupan periode saat ini. Setelah proses pembersihan data, diperoleh 6525 observasi dengan struktur data yang konsisten dan lengkap. Keberadaan fitur lag ini memungkinkan model untuk memanfaatkan informasi harga dan volume dari periode sebelumnya, sehingga diharapkan dapat meningkatkan kemampuan model dalam menangkap dinamika temporal pada pergerakan harga Solana.
Metodologi
Kernel Regression (Nadaraya-Watson)
Kernel Regression Nadaraya–Watson merupakan metode regresi nonparametrik yang digunakan untuk mengestimasi hubungan antara variabel prediktor dan variabel respon tanpa mengasumsikan bentuk fungsi tertentu. Estimasi nilai target dilakukan sebagai rata-rata tertimbang dari seluruh observasi data pelatihan, di mana bobot ditentukan oleh fungsi kernel berdasarkan kedekatan antara titik prediksi dan titik observasi. Dalam penelitian ini digunakan kernel Gaussian, yang memberikan bobot lebih besar pada observasi yang memiliki jarak lebih dekat terhadap titik yang diestimasi, sehingga struktur lokal data dapat tertangkap dengan baik. Parameter bandwidth berperan penting dalam mengontrol tingkat kehalusan estimasi, sehingga pemilihan bandwidth optimal dilakukan menggunakan metode Generalized Cross Validation (GCV) untuk menyeimbangkan bias dan varians serta menghindari kondisi overfitting maupun underfitting.
Rumus Estimator: \[ \hat{m}(x) = \frac{\sum_{i=1}^n K\left(\frac{x - X_i}{h}\right) Y_i}{\sum_{i=1}^n K\left(\frac{x - X_i}{h}\right)} \]
Kernel Gaussian: \[ K(u) = \frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}u^2} \]
GCV untuk Seleksi Bandwidth: \[ GCV(h) = \frac{MSE(h)}{[1 - \frac{1}{n}tr(S(h))]^2} \]
LightGBM (Gradient Boosting)
LightGBM merupakan algoritma pembelajaran ensemble berbasis gradient boosting yang membangun model prediksi melalui kombinasi sejumlah pohon keputusan secara bertahap. Setiap pohon baru dilatih untuk memperbaiki kesalahan prediksi dari model sebelumnya dengan meminimalkan fungsi kerugian. Pendekatan ini memungkinkan LightGBM untuk menangkap hubungan non-linear dan interaksi kompleks antar fitur secara efisien, bahkan pada dataset berukuran besar. Dalam implementasi ini, digunakan pengaturan parameter yang menekankan stabilitas dan generalisasi model, yaitu learning rate yang rendah untuk pembelajaran bertahap, jumlah daun yang moderat untuk mengontrol kompleksitas pohon, pembatasan kedalaman maksimum pohon, serta pemilihan sebagian fitur pada setiap iterasi untuk mengurangi risiko overfitting.
Update Model: \[ F_m(x) = F_{m-1}(x) + \gamma_m h_m(x) \]
Parameter yang digunakan:
- learning_rate: 0.01
- num_leaves: 31
- max_depth: 6
- feature_fraction: 0.9
Modelling
Train-Test Split
Data dibagi menjadi data pelatihan (train) dan data pengujian (test) menggunakan pendekatan pembagian temporal, di mana observasi awal digunakan sebagai training set dan observasi selanjutnya sebagai testing set. Proporsi pembagian ditetapkan sebesar 80% untuk pelatihan dan 20% untuk pengujian. Pendekatan ini dipilih untuk menjaga urutan waktu dan mencegah terjadinya data leakage, sehingga model hanya dilatih menggunakan informasi masa lalu ketika melakukan prediksi pada data masa depan. Selanjutnya, variabel prediktor dan variabel target dipisahkan serta dikonversi ke dalam bentuk matriks dan vektor numerik agar sesuai dengan kebutuhan metode pemodelan.
# TRAIN-TEST SPLIT
n <- nrow(df)
split_idx <- floor(0.8 * n)
train <- df[1:split_idx]
test <- df[(split_idx + 1):n]
Xtr <- as.matrix(train[, ..FEATURES])
ytr <- as.numeric(train[[TARGET]])
Xte <- as.matrix(test[, ..FEATURES])
yte <- as.numeric(test[[TARGET]])
cat("Training :", nrow(train), "observasi (80%)\n")## Training : 5220 observasi (80%)
## Testing : 1305 observasi (20%)
## X_train: 5220 × 4
## X_test : 1305 × 4
Hasil pembagian data menunjukkan bahwa training set terdiri dari 5220 observasi, sedangkan testing set terdiri dari 1305 observasi, dengan masing-masing memiliki empat variabel prediktor. Struktur data pada kedua subset konsisten dan siap digunakan dalam proses pelatihan serta evaluasi model. Pembagian data secara temporal ini memastikan bahwa kinerja model dievaluasi secara lebih objektif dan realistis, karena prediksi dilakukan pada data yang tidak digunakan selama proses pelatihan.
Model 1: Kernel Regression
Model Kernel Regression Nadaraya–Watson diimplementasikan untuk memodelkan hubungan nonparametrik antara fitur lag dan harga penutupan. Estimasi dilakukan menggunakan kernel Gaussian multivariat, di mana bobot observasi ditentukan berdasarkan jarak antara titik prediksi dan data pelatihan yang telah dinormalisasi oleh parameter bandwidth. Pemilihan bandwidth dilakukan secara data-driven menggunakan metode Generalized Cross Validation (GCV) untuk memperoleh tingkat kehalusan estimasi yang optimal. Bandwidth dihitung secara terpisah untuk setiap fitur dengan mempertimbangkan simpangan baku masing-masing variabel serta ukuran sampel pelatihan. Setelah bandwidth optimal diperoleh, model digunakan untuk menghasilkan prediksi pada data pelatihan dan data pengujian.
# KERNEL REGRESSION IMPLEMENTATION
kernel_predict_one <- function(x0, X, y, h) {
x0 <- as.numeric(x0)
U <- sweep(X, 2, x0, "-")
U <- sweep(U, 2, h, "/")
w <- exp(-0.5 * rowSums(U^2))
sw <- sum(w)
if (!is.finite(sw) || sw <= 1e-10) return(mean(y))
sum(w * y) / sw
}
kernel_predict <- function(Xnew, X, y, h) {
sapply(1:nrow(Xnew), function(i) kernel_predict_one(Xnew[i, ], X, y, h))
}
gcv_kernel <- function(X, y, h) {
n <- nrow(X)
yhat <- numeric(n)
Sii <- numeric(n)
for (i in 1:n) {
xi <- as.numeric(X[i, ])
U <- sweep(X, 2, xi, "-")
U <- sweep(U, 2, h, "/")
w <- exp(-0.5 * rowSums(U^2))
sw <- sum(w)
if (sw <= 1e-10) {
yhat[i] <- mean(y)
Sii[i] <- 0
} else {
yhat[i] <- sum(w * y) / sw
Sii[i] <- w[i] / sw
}
}
mse <- mean((y - yhat)^2)
trace_S <- mean(Sii)
if (trace_S >= 0.99) trace_S <- 0.99
mse / (1 - trace_S)^2
}
# BANDWIDTH SELECTION
n_tr <- nrow(Xtr)
d <- ncol(Xtr)
sd_vec <- apply(Xtr, 2, sd)
c_grid <- seq(0.3, 1.5, length.out = 15)
gcv_scores <- sapply(c_grid, function(c) {
h_candidate <- c * sd_vec * n_tr^(-1/(d+4))
gcv_kernel(Xtr, ytr, h = h_candidate)
})
best_c <- c_grid[which.min(gcv_scores)]
h_opt <- best_c * sd_vec * n_tr^(-1/(d+4))
cat("Bandwidth Optimal (h):\n")## Bandwidth Optimal (h):
## open_lag1 : 3.419135
## high_lag1 : 3.432352
## low_lag1 : 3.402642
## volume_lag1: 2617727933541.350586
## GCV Score Terbaik: 2.667124
# PREDICTION
pred_k_train <- kernel_predict(Xtr, Xtr, ytr, h_opt)
pred_k_test <- kernel_predict(Xte, Xtr, ytr, h_opt)Hasil seleksi bandwidth menunjukkan bahwa setiap fitur memiliki nilai bandwidth optimal yang berbeda, mencerminkan perbedaan skala dan kontribusi masing-masing variabel terhadap estimasi kernel. Bandwidth yang relatif kecil pada variabel harga menunjukkan sensitivitas yang lebih tinggi terhadap perubahan nilai fitur tersebut, sedangkan bandwidth yang besar pada variabel volume mencerminkan variasi skala yang jauh lebih besar. Nilai GCV minimum yang diperoleh menunjukkan bahwa model mampu mencapai keseimbangan antara bias dan varians, sehingga estimasi yang dihasilkan cukup fleksibel tanpa indikasi overfitting yang berlebihan. Prediksi yang dihasilkan pada data pelatihan dan pengujian selanjutnya digunakan untuk evaluasi kinerja model.
Model 2: LightGBM
Model LightGBM dilatih menggunakan data pelatihan dengan tujuan regresi untuk memprediksi harga penutupan berdasarkan fitur lag. Dataset pelatihan dikonversi ke dalam format khusus LightGBM agar proses pembelajaran berjalan efisien. Parameter model diatur untuk menyeimbangkan kemampuan menangkap pola non-linear dan pengendalian kompleksitas model, melalui penggunaan learning rate yang rendah, pembatasan kedalaman pohon, jumlah daun yang moderat, serta regularisasi L1 dan L2. Selain itu, teknik subsampling fitur dan data diterapkan untuk mengurangi risiko overfitting. Model dilatih secara iteratif hingga mencapai jumlah iterasi yang ditetapkan.
# LIGHTGBM IMPLEMENTATION
dtrain <- lgb.Dataset(Xtr, label = ytr)
params <- list(
objective = "regression",
metric = "rmse",
learning_rate = 0.01,
num_leaves = 31,
max_depth = 6,
min_data_in_leaf = 20,
feature_fraction = 0.9,
bagging_fraction = 0.9,
bagging_freq = 1,
lambda_l1 = 0.5,
lambda_l2 = 0.5,
seed = 42,
verbose = -1
)
model_lgb <- lgb.train(params = params, data = dtrain, nrounds = 1000, verbose = -1)
pred_lgb_train <- predict(model_lgb, Xtr)
pred_lgb_test <- predict(model_lgb, Xte)
cat("Training selesai. Jumlah iterasi:", model_lgb$current_iter(), "\n")## Training selesai. Jumlah iterasi: 1000
Hasil pelatihan menunjukkan bahwa model LightGBM berhasil dikonvergensikan setelah 1.000 iterasi sesuai dengan pengaturan awal. Proses pelatihan berjalan stabil tanpa indikasi kegagalan pembelajaran, dan model mampu mempelajari hubungan non-linear serta interaksi antar fitur lag secara efektif. Dengan struktur model dan parameter yang telah ditetapkan, LightGBM siap digunakan untuk menghasilkan prediksi pada data pengujian dan dibandingkan kinerjanya dengan pendekatan nonparametrik lainnya.
Evaluasi Model
Evaluasi kinerja model dilakukan menggunakan empat metrik, yaitu Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), Mean Absolute Percentage Error (MAPE), dan koefisien determinasi (R²). Keempat metrik tersebut digunakan untuk memberikan gambaran yang komprehensif mengenai tingkat kesalahan prediksi, baik dalam satuan absolut, persentase, maupun proporsi variasi data yang dapat dijelaskan oleh model. Perhitungan metrik dilakukan secara terpisah pada data pelatihan dan data pengujian untuk masing-masing model, yaitu Kernel Regression dan LightGBM, sehingga memungkinkan analisis perbandingan kinerja sekaligus deteksi potensi overfitting.
# EVALUATION FUNCTIONS
safe_mape <- function(y_true, y_pred, eps = 1e-8) {
mean(abs((y_true - y_pred) / pmax(abs(y_true), eps))) * 100
}
eval_metrics <- function(y_true, y_pred) {
data.table(
RMSE = sqrt(mean((y_true - y_pred)^2)),
MAE = mean(abs(y_true - y_pred)),
MAPE = safe_mape(y_true, y_pred),
R2 = 1 - sum((y_true - y_pred)^2) / sum((y_true - mean(y_true))^2)
)
}
# CALCULATE METRICS
metrics_k_train <- eval_metrics(ytr, pred_k_train)
metrics_k_test <- eval_metrics(yte, pred_k_test)
metrics_l_train <- eval_metrics(ytr, pred_lgb_train)
metrics_l_test <- eval_metrics(yte, pred_lgb_test)
comparison <- rbind(
data.table(Model = "Kernel", Set = "Train", metrics_k_train),
data.table(Model = "Kernel", Set = "Test", metrics_k_test),
data.table(Model = "LightGBM", Set = "Train", metrics_l_train),
data.table(Model = "LightGBM", Set = "Test", metrics_l_test)
)
print(comparison)## Model Set RMSE MAE MAPE R2
## <char> <char> <num> <num> <num> <num>
## 1: Kernel Train 1.613588 1.1628962 0.6942906 0.9976401
## 2: Kernel Test 1.741026 1.2637889 0.8005096 0.9949699
## 3: LightGBM Train 1.350934 0.9820139 0.5882020 0.9983458
## 4: LightGBM Test 1.623788 1.1549929 0.7325230 0.9956245
Hasil evaluasi menunjukkan bahwa kedua model memiliki performa yang baik dengan nilai kesalahan yang relatif rendah dan nilai R² yang tinggi pada data pelatihan maupun pengujian. Namun, LightGBM secara konsisten menghasilkan nilai RMSE, MAE, dan MAPE yang lebih rendah serta nilai R² yang sedikit lebih tinggi dibandingkan Kernel Regression pada data pengujian. Temuan ini mengindikasikan bahwa LightGBM lebih efektif dalam menangkap pola non-linear dan interaksi antar fitur lag pada data harga Solana. Selisih kinerja antara data pelatihan dan pengujian yang relatif kecil pada kedua model juga menunjukkan bahwa tidak terdapat indikasi overfitting yang signifikan, sehingga hasil evaluasi dapat dianggap cukup stabil dan representatif.
Visualisasi Perbandingan
Visualisasi perbandingan dilakukan untuk mengevaluasi kinerja prediksi kedua model secara visual dengan membandingkan nilai prediksi terhadap data aktual pada data pengujian. Perbandingan disajikan dalam bentuk grafik deret waktu untuk sejumlah observasi awal pada data testing, sehingga perbedaan pola prediksi antar model dapat diamati secara langsung. Visualisasi ini menampilkan tiga kurva, yaitu harga aktual, prediksi Kernel Regression, dan prediksi LightGBM, dengan skala dan format yang konsisten agar perbedaan respons model terhadap perubahan harga dapat dianalisis secara jelas.
# TIME SERIES COMPARISON (first 50 observations)
plot_data <- data.table(
Index = 1:50,
Actual = yte[1:50],
Kernel = pred_k_test[1:50],
LightGBM = pred_lgb_test[1:50]
)
ggplot(plot_data, aes(x = Index)) +
geom_line(aes(y = Actual, color = "Aktual"), size = 1.2) +
geom_line(aes(y = Kernel, color = "Kernel Regression"), size = 1, alpha = 0.8) +
geom_line(aes(y = LightGBM, color = "LightGBM"), size = 1, alpha = 0.8) +
labs(
title = "Prediksi vs Aktual (50 Observasi Testing)",
subtitle = "Perbandingan Dua Model",
x = "Index Observasi",
y = "Harga (USD)",
color = "Model"
) +
scale_color_manual(values = c("Aktual" = "#000000",
"Kernel Regression" = "#FF6B6B",
"LightGBM" = "#4ECDC4")) +
scale_y_continuous(labels = dollar_format(prefix = "$")) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
legend.position = "bottom"
)Hasil visualisasi menunjukkan bahwa kedua model mampu mengikuti pola umum pergerakan harga aktual dengan cukup baik pada periode pengujian. Namun, prediksi LightGBM tampak lebih responsif terhadap perubahan harga yang relatif cepat, terutama pada saat terjadi fluktuasi yang tajam, dibandingkan dengan Kernel Regression yang menghasilkan kurva prediksi lebih halus. Temuan ini mengindikasikan bahwa LightGBM memiliki kemampuan yang lebih baik dalam menangkap dinamika non-linear dan volatilitas jangka pendek, sementara Kernel Regression cenderung melakukan pemulusan (smoothing) terhadap pergerakan harga.
# SCATTER PLOTS
p1 <- ggplot(data.frame(Actual = yte, Kernel = pred_k_test), aes(x = Actual, y = Kernel)) +
geom_point(color = "red", alpha = 0.5) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "gray40") +
labs(title = "Kernel Regression",
x = "Aktual",
y = "Prediksi",
caption = sprintf("R² = %.4f", metrics_k_test$R2)) +
theme_minimal()
p2 <- ggplot(data.frame(Actual = yte, LightGBM = pred_lgb_test), aes(x = Actual, y = LightGBM)) +
geom_point(color = "blue", alpha = 0.5) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "gray40") +
labs(title = "LightGBM",
x = "Aktual",
y = "Prediksi",
caption = sprintf("R² = %.4f", metrics_l_test$R2)) +
theme_minimal()
grid.arrange(p1, p2, ncol = 2)Scatter plot perbandingan nilai aktual dan prediksi menunjukkan bahwa kedua model menghasilkan prediksi yang sangat mendekati nilai aktual, yang tercermin dari titik-titik data yang terkonsentrasi di sekitar garis diagonal. Pola ini mengindikasikan tingkat akurasi yang tinggi serta kesalahan prediksi yang relatif kecil pada data pengujian. Dibandingkan dengan Kernel Regression, LightGBM memperlihatkan sebaran titik yang lebih rapat di sekitar garis referensi dan nilai R² yang sedikit lebih tinggi, yang menandakan presisi prediksi yang lebih baik. Temuan ini memperkuat hasil evaluasi kuantitatif sebelumnya bahwa LightGBM lebih efektif dalam menangkap variasi dan dinamika harga penutupan Solana.
# FEATURE IMPORTANCE
importance <- lgb.importance(model_lgb)
ggplot(importance, aes(x = reorder(Feature, Gain), y = Gain)) +
geom_bar(stat = "identity", fill = "#45B7D1") +
coord_flip() +
labs(
title = "Feature Importance - LightGBM",
subtitle = "Kontribusi relatif setiap fitur dalam prediksi",
x = "Fitur",
y = "Importance (Gain)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5, color = "gray40")
)Visualisasi feature importance berdasarkan nilai gain menunjukkan bahwa variabel high_lag1 memiliki kontribusi paling dominan dalam proses prediksi harga penutupan Solana, diikuti oleh low_lag1, sementara open_lag1 memberikan kontribusi yang relatif lebih kecil. Sebaliknya, volume_lag1 memiliki pengaruh yang sangat terbatas terhadap prediksi model. Temuan ini mengindikasikan bahwa informasi harga ekstrem pada periode sebelumnya, khususnya harga tertinggi dan terendah, memainkan peran yang lebih penting dalam menentukan harga penutupan dibandingkan volume perdagangan, serta memperkuat hasil analisis sebelumnya mengenai rendahnya keterkaitan volume dengan pergerakan harga pada interval waktu pendek.
Forecasting
Prediksi Harga 1 Jam ke Depan
Forecasting satu langkah ke depan (1-step ahead) dilakukan untuk memprediksi harga penutupan Solana satu jam setelah waktu observasi terakhir yang tersedia dalam dataset. Proses ini menggunakan fitur lag periode sebelumnya sebagai input prediksi, sehingga mencerminkan skema rolling forecast yang umum digunakan pada data deret waktu. Prediksi dilakukan menggunakan dua model, yaitu Kernel Regression dan LightGBM, dengan memanfaatkan data pelatihan yang telah dibangun sebelumnya. Hasil prediksi kemudian dibandingkan secara numerik dan divisualisasikan dalam bentuk diagram batang serta grafik deret waktu yang menggabungkan data historis dan titik prediksi, guna memudahkan interpretasi perbedaan estimasi antar model.
# FORECASTING FUNCTION
forecast_next_hour <- function(model_type = "both") {
# Ambil data terbaru untuk forecasting
latest_data <- tail(df, 1)
latest_features <- as.matrix(latest_data[, ..FEATURES])
if (model_type == "kernel" || model_type == "both") {
kernel_pred <- kernel_predict(latest_features, Xtr, ytr, h_opt)
cat("=== FORECASTING KERNEL REGRESSION ===\n")
cat("Waktu data terakhir :", format(latest_data$ts, "%Y-%m-%d %H:%M"), "\n")
cat("Waktu prediksi :", format(latest_data$ts + hours(1), "%Y-%m-%d %H:%M"), "\n")
cat("Prediksi harga 1 jam ke depan: $", round(kernel_pred, 4), "\n")
}
if (model_type == "lightgbm" || model_type == "both") {
lgb_pred <- predict(model_lgb, latest_features)
if (model_type == "both") cat("\n=== FORECASTING LIGHTGBM ===\n")
if (model_type == "lightgbm") cat("=== FORECASTING LIGHTGBM ===\n")
cat("Waktu data terakhir :", format(latest_data$ts, "%Y-%m-%d %H:%M"), "\n")
cat("Waktu prediksi :", format(latest_data$ts + hours(1), "%Y-%m-%d %H:%M"), "\n")
cat("Prediksi harga 1 jam ke depan: $", round(lgb_pred, 4), "\n")
}
if (model_type == "both") {
cat("\n=== PERBANDINGAN PREDIKSI ===\n")
cat("Prediksi Kernel Regression : $", round(kernel_pred, 4), "\n")
cat("Prediksi LightGBM : $", round(lgb_pred, 4), "\n")
cat("Selisih prediksi (LGBM - Kernel): $", round(lgb_pred - kernel_pred, 4), "\n")
# Return results
return(data.table(
Last_Timestamp = latest_data$ts,
Forecast_Timestamp = latest_data$ts + hours(1),
Kernel_Pred = kernel_pred,
LightGBM_Pred = lgb_pred,
Last_Price = latest_data$close
))
}
}
# RUN FORECASTING
forecast_results <- forecast_next_hour("both")## === FORECASTING KERNEL REGRESSION ===
## Waktu data terakhir : 2025-12-09 01:00
## Waktu prediksi : 2025-12-09 02:00
## Prediksi harga 1 jam ke depan: $ 133.0358
##
## === FORECASTING LIGHTGBM ===
## Waktu data terakhir : 2025-12-09 01:00
## Waktu prediksi : 2025-12-09 02:00
## Prediksi harga 1 jam ke depan: $ 133.4051
##
## === PERBANDINGAN PREDIKSI ===
## Prediksi Kernel Regression : $ 133.0358
## Prediksi LightGBM : $ 133.4051
## Selisih prediksi (LGBM - Kernel): $ 0.3693
# BAR CHART VISUALIZATION - FORECAST ONLY
forecast_plot_data <- data.table(
Model = c("Kernel Regression", "LightGBM"),
Value = c(forecast_results$Kernel_Pred, forecast_results$LightGBM_Pred),
Color = c("#FF6B6B", "#4ECDC4")
)
ggplot(forecast_plot_data, aes(x = Model, y = Value, fill = Color)) +
geom_bar(stat = "identity", width = 0.6, alpha = 0.8) +
geom_text(aes(label = paste0("$", round(Value, 2))),
vjust = -0.5, size = 4.5, fontface = "bold") +
labs(
title = "Prediksi Harga Solana 1 Jam ke Depan",
subtitle = paste("Waktu prediksi:", format(forecast_results$Forecast_Timestamp, "%Y-%m-%d %H:%M")),
x = "",
y = "Harga Prediksi (USD)"
) +
scale_fill_identity() +
scale_y_continuous(labels = dollar_format(prefix = "$")) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
plot.subtitle = element_text(hjust = 0.5, color = "gray40", size = 11),
axis.text.x = element_text(size = 11),
axis.text.y = element_text(size = 10)
)# LINE CHART VISUALIZATION (last 20 observations + forecast)
last_20 <- tail(df, 20)
# Calculate percentage changes relative to last known price
last_price <- tail(last_20$close, 1)
kernel_pct_change <- ((forecast_results$Kernel_Pred - last_price) / last_price) * 100
lgbm_pct_change <- ((forecast_results$LightGBM_Pred - last_price) / last_price) * 100
# Create data for plot
plot_data <- data.table(
Time = c(last_20$ts, forecast_results$Forecast_Timestamp),
Value = c(last_20$close, NA),
Type = c(rep("Historical", nrow(last_20)), "Forecast")
)
# Add forecast points separately
kernel_point <- data.table(
Time = forecast_results$Forecast_Timestamp,
Value = forecast_results$Kernel_Pred,
Type = "Forecast",
Model = "Kernel"
)
lightgbm_point <- data.table(
Time = forecast_results$Forecast_Timestamp,
Value = forecast_results$LightGBM_Pred,
Type = "Forecast",
Model = "LightGBM"
)
ggplot() +
# Historical data line
geom_line(data = plot_data[Type == "Historical"],
aes(x = Time, y = Value, color = "Data Historis"),
size = 1, alpha = 0.8) +
# Forecast points
geom_point(data = kernel_point,
aes(x = Time, y = Value, color = "Kernel Regression"),
size = 5, shape = 18) +
geom_point(data = lightgbm_point,
aes(x = Time, y = Value, color = "LightGBM"),
size = 5, shape = 17) +
# Vertical line indicating "now"
geom_vline(xintercept = last_20$ts[nrow(last_20)],
linetype = "dashed", color = "gray50", alpha = 0.7, size = 0.8) +
# Annotations
annotate("text", x = last_20$ts[nrow(last_20)], y = max(last_20$close) * 0.95,
label = "Sekarang", hjust = 1.1, vjust = 1, color = "gray40", size = 3.5) +
annotate("text", x = forecast_results$Forecast_Timestamp,
y = forecast_results$Kernel_Pred,
label = sprintf("Kernel\n$%.2f\n(%+.1f%%)",
forecast_results$Kernel_Pred, kernel_pct_change),
hjust = -0.1, vjust = 0.5, color = "#FF6B6B", size = 3.2) +
annotate("text", x = forecast_results$Forecast_Timestamp,
y = forecast_results$LightGBM_Pred,
label = sprintf("LightGBM\n$%.2f\n(%+.1f%%)",
forecast_results$LightGBM_Pred, lgbm_pct_change),
hjust = -0.1, vjust = 0.5, color = "#4ECDC4", size = 3.2) +
# Styling
labs(
title = "Forecasting 1-Step Ahead: Harga Solana",
subtitle = "20 Observasi Historis + Prediksi 1 Jam ke Depan",
x = "Waktu",
y = "Harga (USD)",
color = "Legenda"
) +
scale_color_manual(values = c("Data Historis" = "#00FFA3",
"Kernel Regression" = "#FF6B6B",
"LightGBM" = "#4ECDC4")) +
scale_y_continuous(labels = dollar_format(prefix = "$")) +
scale_x_datetime(date_labels = "%m/%d %H:%M",
breaks = scales::pretty_breaks(n = 6)) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
plot.subtitle = element_text(hjust = 0.5, color = "gray40", size = 11),
legend.position = "bottom",
axis.text.x = element_text(angle = 45, hjust = 1, size = 9),
axis.text.y = element_text(size = 9),
legend.text = element_text(size = 10)
)Hasil forecasting menunjukkan bahwa kedua model menghasilkan estimasi harga satu jam ke depan yang relatif berdekatan, dengan perbedaan prediksi yang kecil. Kernel Regression memprediksi harga sebesar sekitar USD 133,04, sementara LightGBM menghasilkan prediksi yang sedikit lebih tinggi, yaitu sekitar USD 133,41. Dibandingkan dengan harga terakhir, perbedaan ini menunjukkan bahwa Kernel Regression cenderung menghasilkan estimasi yang lebih konservatif, sedangkan LightGBM memberikan sinyal yang lebih optimis dalam jangka sangat pendek. Berdasarkan pola 20 observasi terakhir yang menunjukkan kecenderungan penurunan harga, selisih prediksi antar model mencerminkan perbedaan cara masing-masing metode merespons dinamika tren terbaru, dengan LightGBM lebih sensitif terhadap perubahan non-linear dibandingkan pendekatan pemulusan pada Kernel Regression.
Ringkasan Hasil:
- Waktu Prediksi: 2025-12-09 02:00
- Prediksi Kernel Regression: $133.04 (-0.1% dari harga terakhir)
- Prediksi LightGBM: $133.41 (+0.2% dari harga terakhir)
- Analisis Tren: Berdasarkan 20 observasi terakhir, terlihat bahwa harga cenderung turun dalam 5 periode terakhir.
- Rekomendasi: LightGBM lebih optimis dibandingkan Kernel Regression. Selisih prediksi: $0.37.
Kesimpulan
Ringkasan Hasil
- Performa Terbaik: LightGBM dengan R² 0.9956 dibandingkan Kernel Regression 0.995.
- Akurasi: LightGBM memiliki nilai MAPE 0.73% (lebih kecil) dibandingkan Kernel Regression 0.8%.
- Fitur Penting: Fitur
high_lag1paling berpengaruh dalam prediksi harga.
Forecasting Terkini
- Prediksi LightGBM: $133.41 (+0.2% dari harga terakhir)
- Prediksi Kernel Regression: $133.04 (-0.1% dari harga terakhir)
- Rekomendasi: Gunakan LightGBM untuk prediksi real-time, dengan monitoring prediksi kernel sebagai baseline.
Keterbatasan
- Hanya menggunakan data historis tanpa mempertimbangkan faktor eksternal (sentimen, berita, dll).
- Asumsi stationarity pada data time series mungkin tidak selalu terpenuhi.
- Time frame prediksi terbatas pada 1 jam ke depan.
Dashboard
Proyek ini juga dikembangkan lebih lanjut dalam bentuk dashboard Shiny interaktif yang menyajikan analisis dan hasil pemodelan secara lebih komprehensif. Dashboard tersebut memungkinkan pengguna untuk mengeksplorasi data historis, visualisasi, evaluasi model, serta hasil forecasting secara dinamis dan real time, sehingga memudahkan pemahaman terhadap perilaku harga Solana dan perbandingan kinerja model. Dengan pendekatan interaktif ini, hasil analisis tidak hanya bersifat statis, tetapi juga dapat digunakan sebagai alat eksplorasi dan pendukung pengambilan keputusan secara lebih intuitif dan informatif.
Akses Dashboard: https://vianarhma.shinyapps.io/UASRegresiSemiparametrik/
Developer
Projek ini disusun secara kelompok untuk memenuhi Tugas Akhir Ujian Akhir Semester Mata Kuliah Regresi Semiparametrik, Sains Data Universitas Muhammadiyah Semarang. Dengan rincian keanggotaan:
| Nama | NIM | Peran |
|---|---|---|
| Novia Yunanita | B2D023015 | Pengelolaan dataset, reviewing hasil eksperimen, validasi alur analisis, penulisan publikasi. |
| Oktaviana Rahma Dhani | B2D023022 | Mengembangkan model LightGBM, Implementasi sistem Shiny |
| Dinda Putri Lestari | B2D023017 | Mengembangkan metode kernel regression, visualisasi hasil analisis dan forecasting. |
| Nurkhaliza | B2D023021 | Mengumpulkan landasan teori dan metodologi |
| Farid Sam Saputra | B2D023020 | pengembangan Interface dan fitur Publikasi dan Dashboard |