Library dan setup

library(tidyquant) # untuk ambil data
library(psych) # stat deskriptif
library(dplyr)

Import Data

list_kode <- function(teks) {
  kode <- strsplit(teks, "\\s+")[[1]]
  return(kode)
}

ambil_data <- function(code, start_date, end_date) {
  # code = kode saham (string)
  # start_date = awal periode (string)
  # end_date = akhir periode (string)
  
  # Khusus IHSG tidak pakai .JK, selain IHSG pakai .JK
  ticker <- ifelse(substr(code, 1, 1) == "^", code, paste0(code, ".JK"))
  
  # Ambil data
  price = tq_get(ticker,
                 from = start_date,
                 to   = end_date)
  
  # Hitung returns
  returns = diff(log(price$close))
  
  # Simpan di dalam data frame
  df <- data.frame(
    date = price$date,       # tanggal
    close = price$close,     # harga penutupan saham
    returns = c(NA, returns) # returns, baris pertama kosong (NA)
  )
  return(df)
}
saham <- "AKRA  ANTM  ASII  ASSA  AUTO  BBCA  BBNI  BBRI  BBTN  BMRI  BTPS  CTRA  DSNG  EMTK  ICBP  INCO  INDF  INTP  JPFA  JSMR  KLBF  PWON  SMGR  SMSM  SSMS  UNTR  UNVR"
kode_saham <- c("^JKSE", list_kode(saham))
#pb <- txtProgressBar(min=0, max=length(kode_saham), style=3)

# Inisialisasi list untuk menyimpan data returns
df_list <- list()

for (i in seq_along(kode_saham)) {
  kode <- kode_saham[i]
  data_saham <- ambil_data(kode, "2025-03-01", "2026-03-01")
  
  df_temp <- data.frame(
    tanggal = data_saham$date,
    returns = data_saham$returns
  )
  
  colnames(df_temp)[2] <- kode
  df_list[[kode]] <- df_temp
  
  #setTxtProgressBar(pb, i)
}

# Mengecek apakah jumlah baris sama
#cat("\n\n")
sapply(df_list, nrow)
## ^JKSE  AKRA  ANTM  ASII  ASSA  AUTO  BBCA  BBNI  BBRI  BBTN  BMRI  BTPS  CTRA 
##   235   235   235   235   235   235   235   235   235   235   235   235   235 
##  DSNG  EMTK  ICBP  INCO  INDF  INTP  JPFA  JSMR  KLBF  PWON  SMGR  SMSM  SSMS 
##   235   235   235   235   235   235   235   235   235   235   235   235   235 
##  UNTR  UNVR 
##   235   235
# Merge berdasarkan tanggal
df <- Reduce(function(x,y) merge(x, y, by="tanggal", all=FALSE), df_list)

df <- na.omit(df) # hapus baris pertama yg NA
rownames(df) <- NULL # reset index
head(df)

Statistik Deskriptif

desk <- t(describe(df[-1], ranges=F, type=2, check=F, fast=T))
print(desk)
##                  ^JKSE         AKRA          ANTM          ASII         ASSA
## vars      1.000000e+00 2.000000e+00   3.000000000   4.000000000 5.000000e+00
## n         2.340000e+02 2.340000e+02 234.000000000 234.000000000 2.340000e+02
## mean      9.984203e-04 2.027339e-04   0.004314493   0.001517398 3.108284e-03
## sd        1.311948e-02 2.912218e-02   0.036400244   0.021949883 3.420484e-02
## skew     -2.108953e+00 1.037754e+00  -0.318932201  -0.240304404 2.614129e-02
## kurtosis  1.251497e+01 1.082986e+01   1.805597678   5.070540024 2.180222e+00
## se        8.576471e-04 1.903776e-03   0.002379558   0.001434909 2.236041e-03
##                   AUTO          BBCA         BBNI          BBRI         BBTN
## vars       6.000000000  7.000000e+00 8.000000e+00  9.000000e+00 1.000000e+01
## n        234.000000000  2.340000e+02 2.340000e+02  2.340000e+02 2.340000e+02
## mean       0.001566564 -8.724315e-04 1.381854e-04  2.707082e-04 1.953577e-03
## sd         0.021433191  1.816760e-02 2.099444e-02  2.084474e-02 2.808556e-02
## skew      -0.447846551 -2.152433e-01 6.388640e-01 -2.102410e-01 5.701446e-01
## kurtosis   2.224855586  3.847899e+00 2.843708e+00  3.506763e+00 2.057213e+00
## se         0.001401132  1.187653e-03 1.372449e-03  1.362663e-03 1.836010e-03
##                   BMRI         BTPS          CTRA         DSNG         EMTK
## vars      1.100000e+01 1.200000e+01  1.300000e+01 1.400000e+01 1.500000e+01
## n         2.340000e+02 2.340000e+02  2.340000e+02 2.340000e+02 2.340000e+02
## mean      3.151431e-04 9.768938e-04 -2.688625e-04 1.686556e-03 1.979849e-03
## sd        2.187774e-02 2.711974e-02  2.343298e-02 3.472867e-02 4.675986e-02
## skew     -1.832154e-01 1.066099e+00  2.694265e-01 2.487998e-01 5.183018e-01
## kurtosis  3.650399e+00 5.686820e+00  1.596769e+00 2.197319e+00 3.425022e+00
## se        1.430193e-03 1.772873e-03  1.531862e-03 2.270284e-03 3.056788e-03
##                   ICBP         INCO          INDF          INTP          JPFA
## vars      16.000000000 1.700000e+01  1.800000e+01  19.000000000  2.000000e+01
## n        234.000000000 2.340000e+02  2.340000e+02 234.000000000  2.340000e+02
## mean      -0.001273415 4.282701e-03 -5.582059e-04   0.001312934  7.008674e-04
## sd         0.017507830 3.960984e-02  1.883011e-02   0.027250303  3.056837e-02
## skew       0.252900900 1.285937e-01  4.657584e-02  -0.133592303 -1.072648e-02
## kurtosis   1.274201105 1.503917e+00  1.404684e+00   3.474349656  9.121626e-01
## se         0.001144523 2.589376e-03  1.230963e-03   0.001781408  1.998317e-03
##                   JSMR          KLBF          PWON         SMGR          SMSM
## vars      2.100000e+01  2.200000e+01  2.300000e+01 2.400000e+01  2.500000e+01
## n         2.340000e+02  2.340000e+02  2.340000e+02 2.340000e+02  2.340000e+02
## mean     -1.153443e-05 -3.867451e-05 -1.604185e-04 9.462935e-04  2.532295e-04
## sd        2.001331e-02  2.725989e-02  2.072778e-02 3.381498e-02  1.361804e-02
## skew      1.059728e+00  3.460853e-01  3.888836e-01 6.787827e-01 -1.995876e-01
## kurtosis  7.557972e+00  4.361178e-01  3.273123e+00 5.121982e+00  1.432366e+00
## se        1.308311e-03  1.782035e-03  1.355018e-03 2.210554e-03  8.902391e-04
##                   SSMS          UNTR         UNVR
## vars      2.600000e+01  27.000000000 2.800000e+01
## n         2.340000e+02 234.000000000 2.340000e+02
## mean     -1.075152e-04   0.001039446 3.202211e-03
## sd        3.128951e-02   0.025762395 3.239969e-02
## skew      1.335266e-01  -1.864799242 1.113668e+00
## kurtosis  3.984823e+00  12.665328121 3.128696e+00
## se        2.045459e-03   0.001684140 2.118034e-03

Visualisasi Data