# Load library yang diperlukan
library(ggplot2)
library(e1071) # Untuk SVR
library(quantmod) # Untuk mengambil data Bitcoin
## Warning: package 'quantmod' was built under R version 4.4.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.4.3
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.4.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
# 1. Mengambil Data Bitcoin (Contoh: 1 tahun terakhir)
getSymbols("BTC-USD", src = "yahoo", from = Sys.Date()-365, to = Sys.Date())
## [1] "BTC-USD"
# Membuat dataframe dari data Bitcoin
bitcoin_data <- data.frame(
Date = index(`BTC-USD`),
Price = as.numeric(`BTC-USD`$`BTC-USD.Close`),
Volume = as.numeric(`BTC-USD`$`BTC-USD.Volume`)
)
# Menghitung perubahan harga harian (target prediksi)
bitcoin_data$Price_Change <- c(NA, diff(bitcoin_data$Price))
# Membersihkan data (menghapus NA)
bitcoin_clean <- na.omit(bitcoin_data)
# Menampilkan 5 baris pertama dan terakhir
head_tail <- rbind(head(bitcoin_clean, 5), tail(bitcoin_clean, 5))
print(head_tail)
## Date Price Volume Price_Change
## 2 2024-05-14 61552.79 28186271527 -1348.6601562
## 3 2024-05-15 66267.49 39815167074 4714.7031250
## 4 2024-05-16 65231.58 31573077994 -1035.9101562
## 5 2024-05-17 67051.88 28031279310 1820.2929688
## 6 2024-05-18 66940.80 16712277406 -111.0703125
## 362 2025-05-09 102970.85 58198593958 -270.6093750
## 363 2025-05-10 104696.33 42276713994 1725.4765625
## 364 2025-05-11 104106.36 46285517406 -589.9687500
## 365 2025-05-12 102812.95 63250475404 -1293.4062500
## 366 2025-05-13 102812.40 62084628480 -0.5546875
# 2. Membagi data menjadi training (70%) dan testing (30%)
set.seed(42) # Untuk reproduktibilitas
index <- sample(1:nrow(bitcoin_clean), 0.7 * nrow(bitcoin_clean))
train_data <- bitcoin_clean[index, ]
test_data <- bitcoin_clean[-index, ]
# 3. Membangun Model Regresi Linier
lm_model <- lm(Price_Change ~ Price + Volume, data = train_data)
lm_pred <- predict(lm_model, newdata = test_data)
# 4. Membangun Model SVR
svr_model <- svm(Price_Change ~ Price + Volume,
data = train_data,
type = "eps-regression",
kernel = "radial", # Kernel RBF untuk non-linear
cost = 1, # Parameter regularisasi
epsilon = 0.1) # Margin kesalahan
svr_pred <- predict(svr_model, newdata = test_data)
# 5. Visualisasi Hasil
ggplot() +
geom_point(aes(x = test_data$Date, y = test_data$Price_Change),
color = "black", size = 2) + # Data aktual
geom_line(aes(x = test_data$Date, y = lm_pred),
color = "blue", linewidth = 1, linetype = "dashed") + # Prediksi Regresi Linier
geom_line(aes(x = test_data$Date, y = svr_pred),
color = "red", linewidth = 1) + # Prediksi SVR
labs(title = "Perbandingan Prediksi Kenaikan Bitcoin: SVR vs Regresi Linier",
x = "Tanggal",
y = "Perubahan Harga Bitcoin (USD)") +
theme_minimal()

# 6. Evaluasi Model dengan MSE
lm_mse <- mean((lm_pred - test_data$Price_Change)^2)
svr_mse <- mean((svr_pred - test_data$Price_Change)^2)
# Print hasil MSE
cat("MSE Regresi Linier:", round(lm_mse, 2), "\n")
## MSE Regresi Linier: 4005210
cat("MSE SVR:", round(svr_mse, 2), "\n")
## MSE SVR: 4068999
# 7. Interpretasi Hasil
cat("\nInterpretasi Hasil:\n")
##
## Interpretasi Hasil:
cat("- Garis biru putus-putus menunjukkan prediksi dari model Regresi Linier\n")
## - Garis biru putus-putus menunjukkan prediksi dari model Regresi Linier
cat("- Garis merah solid menunjukkan prediksi dari model SVR\n")
## - Garis merah solid menunjukkan prediksi dari model SVR
cat("- Titik-titik hitam menunjukkan perubahan harga aktual Bitcoin\n\n")
## - Titik-titik hitam menunjukkan perubahan harga aktual Bitcoin
if (svr_mse < lm_mse) {
cat("Berdasarkan MSE, model SVR (", round(svr_mse, 2),
") lebih baik daripada Regresi Linier (", round(lm_mse, 2), ")\n")
} else {
cat("Berdasarkan MSE, model Regresi Linier (", round(lm_mse, 2),
") lebih baik daripada SVR (", round(svr_mse, 2), ")\n")
}
## Berdasarkan MSE, model Regresi Linier ( 4005210 ) lebih baik daripada SVR ( 4068999 )
# 8. Prediksi untuk hari berikutnya
latest_data <- tail(bitcoin_clean, 1)
next_day_lm <- predict(lm_model, newdata = latest_data)
next_day_svr <- predict(svr_model, newdata = latest_data)
cat("\nPrediksi perubahan harga Bitcoin untuk hari berikutnya:\n")
##
## Prediksi perubahan harga Bitcoin untuk hari berikutnya:
cat("- Regresi Linier:", round(next_day_lm, 2), "USD\n")
## - Regresi Linier: 245.61 USD
cat("- SVR:", round(next_day_svr, 2), "USD\n")
## - SVR: 115.93 USD