# 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