Langkah 1: Load Packages


# Load libraries
library(quantmod)    # Untuk mengambil data saham
library(ggplot2)     # Untuk plotting
library(forecast)    # Untuk time series forecasting
library(TTR)         # Untuk indikator teknikal (RSI, MACD, dll.)
library(tseries)     # Untuk uji stasioneritas (ADF test)

Langkah 2: Ambil Data dari Yahoo Finance

# Ambil data BBRI.JK (Bank Rakyat Indonesia)
getSymbols("BBRI.JK", src = "yahoo", from = "2023-01-01", to = Sys.Date())
[1] "BBRI.JK"
# Simpan data ke dataframe
bbri <- data.frame(Date = index(BBRI.JK), coredata(BBRI.JK))
colnames(bbri) <- c("Date", "Open", "High", "Low", "Close", "Volume", "Adjusted")
head(bbri)

Langkah 3: Plot Harga Historis

# Plot harga penutupan (Close Price)
ggplot(bbri, aes(x = Date, y = Close)) +
  geom_line(color = "steelblue", linewidth = 1) +
  scale_x_date(
    date_breaks = "1 month",    # Label tiap 1 bulan
    date_labels = "%b %Y",      # Format: "Jun 2023"
    guide = guide_axis(angle = 45)  # Rotasi label 45°
  ) +
  labs(title = "BBRI.JK: Harga Harian (2023-Sekarang)", 
       x = "Tanggal", y = "Harga Penutupan (IDR)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Interpretasi:

Langkah 4: Analisis Teknikal (RSI & Moving Average)

# Hitung RSI (14 hari)
bbri$RSI <- RSI(bbri$Close, n = 14)

# Hitung Moving Average 50 hari dan 200 hari
bbri$MA50 <- SMA(bbri$Close, n = 50)
bbri$MA200 <- SMA(bbri$Close, n = 200)

ggplot(bbri, aes(x = Date, y = RSI)) +
  geom_line(color = "purple", linewidth = 0.8) +
  geom_hline(yintercept = 70, linetype = "dashed", color = "red") +
  geom_hline(yintercept = 30, linetype = "dashed", color = "green") +
  scale_x_date(
    date_breaks = "1 month",          # Label per bulan
    date_labels = "%b %Y",            # Format: "Jun 2023"
    expand = c(0, 0)                  # Hilangkan margin kosong
  ) +
  labs(
    title = "Indikator RSI 14 Hari BBRI.JK",
    subtitle = "Level Overbought (>70) dan Oversold (<30)",
    x = "Tanggal (Bulan-Tahun)",
    y = "Nilai RSI"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),  # Miringkan label
    plot.title = element_text(face = "bold")
  )

Interpretasi:

Langkah 5: Prediksi Harga dengan ARIMA

# Konversi data ke time series
ts_data <- ts(bbri$Close, frequency = 252)  # 252 hari trading per tahun

# Uji stasioneritas (ADF Test)
adf.test(ts_data)  # Jika p-value < 0.05, data stasioner

    Augmented Dickey-Fuller Test

data:  ts_data
Dickey-Fuller = -2.3043, Lag order = 8, p-value = 0.4495
alternative hypothesis: stationary
# Fit ARIMA model
arima_model <- auto.arima(ts_data)
summary(arima_model)
Series: ts_data 
ARIMA(0,1,0) 

sigma^2 = 7651:  log likelihood = -3433.99
AIC=6869.98   AICc=6869.99   BIC=6874.35

Training set error measures:
                    ME     RMSE      MAE         MPE     MAPE       MASE        ACF1
Training set -1.772483 87.39302 65.36793 -0.05894346 1.375678 0.06256657 -0.03481964
# Prediksi 30 hari ke depan
forecast_data <- forecast(arima_model, h = 30)
autoplot(forecast_data) +
  labs(title = "Prediksi Harga BBRI.JK (30 Hari ke Depan)", x = "Hari", y = "Harga") +
  theme_minimal()

Interpretasi:

Langkah 6: Analisis Volatilitas (ATR)

# Hitung ATR (pakai solusi 1)
atr_data <- ATR(bbri[, c("High", "Low", "Close")], n = 14)
bbri$ATR <- atr_data[, "atr"]

ggplot(bbri, aes(x = Date, y = ATR)) +
  geom_line(color = "red") +
  scale_x_date(
    date_breaks = "2 weeks",   # Label tiap 2 minggu
    date_labels = "%d %b"      # Format: "05 Jun"
  ) +
  labs(title = "Volatilitas BBRI (ATR 14 Hari)", x = "Tanggal", y = "ATR") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))  # Label vertikal

Output:

ATR rendah:

LS0tDQp0aXRsZTogIkFuYWxpc2lzIEt1YW50aXRhdGlmIFNhaGFtIEJCUkkuSks6IFBlbmRla2F0YW4gVGVrbmlrYWwsIFN0YXRpc3RpaywgZGFuIFByZWRpa3NpIFRpbWUgU2VyaWVzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMgTGFuZ2thaCAxOiBMb2FkIFBhY2thZ2VzDQoNCmBgYHtyfQ0KDQojIExvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KHF1YW50bW9kKSAgICAjIFVudHVrIG1lbmdhbWJpbCBkYXRhIHNhaGFtDQpsaWJyYXJ5KGdncGxvdDIpICAgICAjIFVudHVrIHBsb3R0aW5nDQpsaWJyYXJ5KGZvcmVjYXN0KSAgICAjIFVudHVrIHRpbWUgc2VyaWVzIGZvcmVjYXN0aW5nDQpsaWJyYXJ5KFRUUikgICAgICAgICAjIFVudHVrIGluZGlrYXRvciB0ZWtuaWthbCAoUlNJLCBNQUNELCBkbGwuKQ0KbGlicmFyeSh0c2VyaWVzKSAgICAgIyBVbnR1ayB1amkgc3Rhc2lvbmVyaXRhcyAoQURGIHRlc3QpDQoNCmBgYA0KDQojIyBMYW5na2FoIDI6IEFtYmlsIERhdGEgZGFyaSBZYWhvbyBGaW5hbmNlDQoNCmBgYHtyfQ0KIyBBbWJpbCBkYXRhIEJCUkkuSksgKEJhbmsgUmFreWF0IEluZG9uZXNpYSkNCmdldFN5bWJvbHMoIkJCUkkuSksiLCBzcmMgPSAieWFob28iLCBmcm9tID0gIjIwMjMtMDEtMDEiLCB0byA9IFN5cy5EYXRlKCkpDQoNCiMgU2ltcGFuIGRhdGEga2UgZGF0YWZyYW1lDQpiYnJpIDwtIGRhdGEuZnJhbWUoRGF0ZSA9IGluZGV4KEJCUkkuSkspLCBjb3JlZGF0YShCQlJJLkpLKSkNCmNvbG5hbWVzKGJicmkpIDwtIGMoIkRhdGUiLCAiT3BlbiIsICJIaWdoIiwgIkxvdyIsICJDbG9zZSIsICJWb2x1bWUiLCAiQWRqdXN0ZWQiKQ0KaGVhZChiYnJpKQ0KYGBgDQoNCiMjIExhbmdrYWggMzogUGxvdCBIYXJnYSBIaXN0b3Jpcw0KDQpgYGB7cn0NCiMgUGxvdCBoYXJnYSBwZW51dHVwYW4gKENsb3NlIFByaWNlKQ0KZ2dwbG90KGJicmksIGFlcyh4ID0gRGF0ZSwgeSA9IENsb3NlKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAic3RlZWxibHVlIiwgbGluZXdpZHRoID0gMSkgKw0KICBzY2FsZV94X2RhdGUoDQogICAgZGF0ZV9icmVha3MgPSAiMSBtb250aCIsICAgICMgTGFiZWwgdGlhcCAxIGJ1bGFuDQogICAgZGF0ZV9sYWJlbHMgPSAiJWIgJVkiLCAgICAgICMgRm9ybWF0OiAiSnVuIDIwMjMiDQogICAgZ3VpZGUgPSBndWlkZV9heGlzKGFuZ2xlID0gNDUpICAjIFJvdGFzaSBsYWJlbCA0NcKwDQogICkgKw0KICBsYWJzKHRpdGxlID0gIkJCUkkuSks6IEhhcmdhIEhhcmlhbiAoMjAyMy1TZWthcmFuZykiLCANCiAgICAgICB4ID0gIlRhbmdnYWwiLCB5ID0gIkhhcmdhIFBlbnV0dXBhbiAoSURSKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXNpOioqDQoNCi0gICBUcmVuIG5haWsvdHVydW4vYmVyZ2VyYWsgc2lkZXdheXMgKHNlc3VhaWthbiBkZW5nYW4gcG9sYSB5YW5nIHRlcmxpaGF0KS4NCg0KLSAgIEppa2EgYWRhIGxvbmpha2FuIHZvbHVtZSwgYmlzYSBtZW5na29uZmlybWFzaSBicmVha291dCBhdGF1IHJldmVyc2FsLg0KDQojIyBMYW5na2FoIDQ6IEFuYWxpc2lzIFRla25pa2FsIChSU0kgJiBNb3ZpbmcgQXZlcmFnZSkNCg0KYGBge3J9DQojIEhpdHVuZyBSU0kgKDE0IGhhcmkpDQpiYnJpJFJTSSA8LSBSU0koYmJyaSRDbG9zZSwgbiA9IDE0KQ0KDQojIEhpdHVuZyBNb3ZpbmcgQXZlcmFnZSA1MCBoYXJpIGRhbiAyMDAgaGFyaQ0KYmJyaSRNQTUwIDwtIFNNQShiYnJpJENsb3NlLCBuID0gNTApDQpiYnJpJE1BMjAwIDwtIFNNQShiYnJpJENsb3NlLCBuID0gMjAwKQ0KDQpnZ3Bsb3QoYmJyaSwgYWVzKHggPSBEYXRlLCB5ID0gUlNJKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAicHVycGxlIiwgbGluZXdpZHRoID0gMC44KSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDcwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDMwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJncmVlbiIpICsNCiAgc2NhbGVfeF9kYXRlKA0KICAgIGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCAgICAgICAgICAjIExhYmVsIHBlciBidWxhbg0KICAgIGRhdGVfbGFiZWxzID0gIiViICVZIiwgICAgICAgICAgICAjIEZvcm1hdDogIkp1biAyMDIzIg0KICAgIGV4cGFuZCA9IGMoMCwgMCkgICAgICAgICAgICAgICAgICAjIEhpbGFuZ2thbiBtYXJnaW4ga29zb25nDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkluZGlrYXRvciBSU0kgMTQgSGFyaSBCQlJJLkpLIiwNCiAgICBzdWJ0aXRsZSA9ICJMZXZlbCBPdmVyYm91Z2h0ICg+NzApIGRhbiBPdmVyc29sZCAoPDMwKSIsDQogICAgeCA9ICJUYW5nZ2FsIChCdWxhbi1UYWh1bikiLA0KICAgIHkgPSAiTmlsYWkgUlNJIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwgICMgTWlyaW5na2FuIGxhYmVsDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KKipJbnRlcnByZXRhc2k6KioNCg0KLSAgIFJTSSBcPiA3MDogT3ZlcmJvdWdodCAocG90ZW5zaSBqdWFsKS4NCg0KLSAgIFJTSSBcPCAzMDogT3ZlcnNvbGQgKHBvdGVuc2kgYmVsaSkuDQoNCi0gICBHb2xkZW4gQ3Jvc3MgKE1BNTAgXD4gTUEyMDApOiBTaW55YWwgYnVsbGlzaC4NCg0KLSAgIERlYXRoIENyb3NzIChNQTUwIFw8IE1BMjAwKTogU2lueWFsIGJlYXJpc2guDQoNCiMjIExhbmdrYWggNTogUHJlZGlrc2kgSGFyZ2EgZGVuZ2FuIEFSSU1BDQoNCmBgYHtyfQ0KIyBLb252ZXJzaSBkYXRhIGtlIHRpbWUgc2VyaWVzDQp0c19kYXRhIDwtIHRzKGJicmkkQ2xvc2UsIGZyZXF1ZW5jeSA9IDI1MikgICMgMjUyIGhhcmkgdHJhZGluZyBwZXIgdGFodW4NCg0KIyBVamkgc3Rhc2lvbmVyaXRhcyAoQURGIFRlc3QpDQphZGYudGVzdCh0c19kYXRhKSAgIyBKaWthIHAtdmFsdWUgPCAwLjA1LCBkYXRhIHN0YXNpb25lcg0KDQojIEZpdCBBUklNQSBtb2RlbA0KYXJpbWFfbW9kZWwgPC0gYXV0by5hcmltYSh0c19kYXRhKQ0Kc3VtbWFyeShhcmltYV9tb2RlbCkNCg0KIyBQcmVkaWtzaSAzMCBoYXJpIGtlIGRlcGFuDQpmb3JlY2FzdF9kYXRhIDwtIGZvcmVjYXN0KGFyaW1hX21vZGVsLCBoID0gMzApDQphdXRvcGxvdChmb3JlY2FzdF9kYXRhKSArDQogIGxhYnModGl0bGUgPSAiUHJlZGlrc2kgSGFyZ2EgQkJSSS5KSyAoMzAgSGFyaSBrZSBEZXBhbikiLCB4ID0gIkhhcmkiLCB5ID0gIkhhcmdhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKkludGVycHJldGFzaToqKg0KDQotICAgQVJJTUEocCxkLHEpOiBNb2RlbCB0ZXJiYWlrIGRpcGlsaWggc2VjYXJhIG90b21hdGlzLg0KDQotICAgQ29uZmlkZW5jZSBpbnRlcnZhbCAoYWJ1LWFidSk6IFJlbnRhbmcga2V0aWRha3Bhc3RpYW4gcHJlZGlrc2kuDQoNCiMjIExhbmdrYWggNjogQW5hbGlzaXMgVm9sYXRpbGl0YXMgKEFUUikNCg0KYGBge3J9DQojIEhpdHVuZyBBVFIgKHBha2FpIHNvbHVzaSAxKQ0KYXRyX2RhdGEgPC0gQVRSKGJicmlbLCBjKCJIaWdoIiwgIkxvdyIsICJDbG9zZSIpXSwgbiA9IDE0KQ0KYmJyaSRBVFIgPC0gYXRyX2RhdGFbLCAiYXRyIl0NCg0KZ2dwbG90KGJicmksIGFlcyh4ID0gRGF0ZSwgeSA9IEFUUikpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gInJlZCIpICsNCiAgc2NhbGVfeF9kYXRlKA0KICAgIGRhdGVfYnJlYWtzID0gIjIgd2Vla3MiLCAgICMgTGFiZWwgdGlhcCAyIG1pbmdndQ0KICAgIGRhdGVfbGFiZWxzID0gIiVkICViIiAgICAgICMgRm9ybWF0OiAiMDUgSnVuIg0KICApICsNCiAgbGFicyh0aXRsZSA9ICJWb2xhdGlsaXRhcyBCQlJJIChBVFIgMTQgSGFyaSkiLCB4ID0gIlRhbmdnYWwiLCB5ID0gIkFUUiIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUpKSAgIyBMYWJlbCB2ZXJ0aWthbA0KDQpgYGANCg0KKipPdXRwdXQ6KioNCg0KLSAgIEdhcmlzIG1lcmFoIChBVFIpIHlhbmcgbmFpayBtZW51bmp1a2thbiBwZW5pbmdrYXRhbiB2b2xhdGlsaXRhcy4NCg0KLSAgIEtvcmVsYXNpIGFudGFyYSBsb25qYWthbiBBVFIgZGFuIHBlcmdlcmFrYW4gaGFyZ2EgZWtzdHJlbSBiaXNhIGRpbGloYXQuDQoNCi0gICBJbnRlcnByZXRhc2kgQVRSIHVudHVrIEJCUkkuSks6DQoNCi0gICBBVFIgdGluZ2dpIChtaXNhbCBcPiA1JSBkYXJpIGhhcmdhIHNhaGFtKToNCg0KLSAgIE1lbnVuanVra2FuIHZvbGF0aWxpdGFzIHRpbmdnaSDihpIgUG90ZW5zaSBwZWx1YW5nIHRyYWRpbmcgKGJyZWFrb3V0L3N3aW5nKSwgdGV0YXBpIHJpc2lrbyBqdWdhIGJlc2FyLkNvbnRvaDogSmlrYSBCQlJJIG1lbWlsaWtpIEFUUiAyMDAgSURSIGRhbiBoYXJnYSA1LDAwMCBJRFIsIGJlcmFydGkgcGVyZ2VyYWthbiBoYXJpYW4gcmF0YS1yYXRhIMKxNCUuDQoNCioqQVRSIHJlbmRhaDoqKg0KDQotICAgUGFzYXIgc2VkYW5nIGtvbnNvbGlkYXNpIOKGkiBLdXJhbmcgbWVuYXJpayB1bnR1ayB0cmFkZXIgaGFyaWFuLg0KDQotICAgQ2F0YXRhbiBQZW50aW5nOiBBVFIgdGlkYWsgbWVudW5qdWtrYW4gYXJhaCB0cmVuLCBoYW55YSB2b2xhdGlsaXRhcy4NCg0KLSAgIExlYmloIGVmZWt0aWYgamlrYSBkaWtvbWJpbmFzaWthbiBkZW5nYW4gaW5kaWthdG9yIGxhaW4gKGNvbnRvaDogUGFyYWJvbGljIFNBUiBhdGF1IEJvbGxpbmdlciBCYW5kcykuDQo=