Analisis Rantai Markov pada Data Yahoo

Dinamika Perubahan Harga Saham Yahoo (2019–2023)

Author

Rahul Fikri Alamsyah

Published

December 28, 2025

1 PENDAHULUAN

1.1 Latar Belakang

Dalam dunia ekonomi dan keuangan, pergerakan harga aset seperti saham, valuta asing, dan komoditas bersifat dinamis serta berubah dari waktu ke waktu. Data historis harga yang tersedia pada platform seperti Yahoo Finance menunjukkan bahwa perubahan harga aset dapat diklasifikasikan ke dalam tiga keadaan utama, yaitu naik, tetap, dan turun. Klasifikasi ini mencerminkan kondisi dasar pasar dalam setiap periode pengamatan.

Namun, perubahan harga aset tidak terjadi secara acak sepenuhnya, melainkan menunjukkan ketergantungan pada kondisi sebelumnya. Artinya, keadaan harga pada suatu waktu tertentu memiliki kecenderungan dipengaruhi oleh keadaan harga pada periode sebelumnya. Fenomena ini menunjukkan adanya pola transisi antar-keadaan harga yang dapat dimodelkan secara probabilistik.

Rantai Markov merupakan salah satu pendekatan statistik yang tepat untuk memodelkan sistem dengan sejumlah keadaan diskrit, di mana peluang terjadinya suatu keadaan pada waktu mendatang hanya bergantung pada keadaan saat ini. Dengan menerapkan rantai Markov pada perubahan harga aset, pola transisi antar kondisi naik–tetap–turun dapat dianalisis secara sistematis melalui matriks probabilitas transisi. Pendekatan ini memungkinkan pemahaman yang lebih mendalam terhadap dinamika pergerakan harga aset serta memberikan dasar kuantitatif dalam analisis perilaku pasar dan pengambilan keputusan ekonomi.

1.2 Tujuan Analisis

  • Mengidentifikasi probabilitas transisi antar kondisi harga aset (naik–tetap–turun) berdasarkan data historis.
  • Menganalisis ketergantungan perubahan harga saat ini terhadap kondisi sebelumnya, guna mengetahui kecenderungan pergerakan harga aset dari waktu ke waktu.
  • Menyusun matriks probabilitas transisi sebagai representasi dinamika perubahan harga aset.
  • Memprediksi distribusi keadaan harga aset pada periode mendatang berdasarkan sifat jangka pendek rantai Markov.
  • Memberikan dasar kuantitatif dalam memahami perilaku pergerakan harga aset sebagai bahan pertimbangan dalam pengambilan keputusan ekonomi dan keuangan.

2 Tinjauan Pustaka

2.1 Rantai Markov

Rantai Markov (Markov Chains) adalah suatu teknik matematika yang biasa digunakan untuk melakukan pemodelan (modelling) bermacam-macam sistem dan proses bisnis. Teknik ini dapat digunakan untuk memperkirakan perubahan-perubahan di waktu yang akan datang dalam variabel-variabel dinamis atas dasar perubahan-perubahan dari variabel-variabel dinamis tersebut di waktu yang lalu. Teknik ini dapat digunakan juga untuk menganalisis kejadian-kejadian di waktu-waktu mendatang secara matematis. Model Rantai Markov ditemukan oleh seorang ahli Rusia yang bernama A.A. Markov pada tahun 1906

prinsip penelitian dengan model Rantai Markov berlandaskan pada prinsip probabilitas dan ketergantungan waktu (temporal dependence), di mana keadaan masa depan hanya bergantung pada keadaan saat ini, bukan pada sejarah masa lalunya.

2.2 Diagram Alur

3 Analisis Data

3.1 Load Library

library(readxl)

library(psych)

library(markovchain)

library(quantmod)

library(PerformanceAnalytics)

library(diagram)

library(expm)

3.2 Cleansing dan Tranform Data

Lihat Kode
data <- read_excel("C:/Users/62896/Downloads/yahoo_data.xlsx")
head(data)
Date Open High Low Close Adj Close** Volume
Apr 28, 2023 33797.43 34104.56 33728.40 34098.16 34098.16 354310000
Apr 27, 2023 33381.66 33859.75 33374.65 33826.16 33826.16 343240000
Apr 26, 2023 33596.34 33645.83 33235.85 33301.87 33301.87 321170000
Apr 25, 2023 33828.34 33875.49 33525.39 33530.83 33530.83 297880000
Apr 24, 2023 33805.04 33891.15 33726.09 33875.40 33875.40 252020000
Apr 21, 2023 33793.60 33858.83 33688.57 33808.96 33808.96 291080000
Lihat Kode
# Pastikan date itu sebagai format tanggal
data$Date <- as.Date(data$Date, format = "%b %d, %Y")

# Urutkan data berdasarkan tanggal (ascending)
data <- data[order(data$Date), ]

# jadikan index untuk time series
rownames(data) <- data$Date
Warning: Setting row names on a tibble is deprecated.
Lihat Kode
#Melihat summary pada data 
describe(data[-1])
vars n mean sd median trimmed mad min max range skew kurtosis se
Open 1 1258 29595.82 4.006078e+03 29201.41 29603.41 5417.094 19028.36 36722.60 17694.24 0.0142158 -1.296430 112.9481
High 2 1258 29776.95 4.009008e+03 29335.69 29780.25 5440.349 19121.01 36952.65 17831.64 0.0290639 -1.354891 113.0307
Low 3 1258 29402.43 4.004949e+03 28996.50 29417.92 5399.540 18213.65 36636.00 18422.35 -0.0059873 -1.226520 112.9163
Close 4 1258 29599.36 4.007469e+03 29199.46 29608.82 5412.580 18591.93 36799.65 18207.72 0.0138051 -1.294324 112.9874
Adj Close** 5 1258 29599.36 4.007469e+03 29199.46 29608.82 5412.580 18591.93 36799.65 18207.72 0.0138051 -1.294324 112.9874
Volume 6 1258 345063624.80 1.069142e+08 324725000.00 331905386.90 80468115.000 86150000.00 915990000.00 829840000.00 1.7545928 5.009200 3014359.5293
Lihat Kode
# Urutkan berdasarkan tanggal
data <- data[order(data$Date), ]

# Buat xts (gunakan kolom Date sebagai index)
data_xts <- xts(data[, -1], order.by = data$Date)

# Cek hasilnya
head(data_xts)
               Open     High      Low    Close Adj Close**    Volume
2018-05-01 24117.29 24117.29 23808.19 24099.05    24099.05 380070000
2018-05-02 24097.63 24185.52 23886.30 23924.98    23924.98 385350000
2018-05-03 23836.23 23996.15 23531.31 23930.15    23930.15 389240000
2018-05-04 23865.22 24333.35 23778.87 24262.51    24262.51 329480000
2018-05-07 24317.66 24479.45 24263.42 24357.32    24357.32 307670000
2018-05-08 24341.35 24412.34 24198.34 24360.21    24360.21 344940000

3.3 Penentuan State

Pada analisis ini saya hanya mengambil kolom close sebagai analisis finansial kenapa?karna kolom close menandakan tutupnya keuangan akhir di suatu perusahaan dan itu yang membuat saya mengambil kolom close sebagai analisis random markov kali ini.dan selanjutnya membuat kolom status untuk melihat perubahan yang bisa dijadikan random markov ada status naik,turun dan tetap

Lihat Kode
# Ambil kolom Close (atau nama lain kalau beda)
close <- data$Close

# Buat status perubahan
change <- diff(close)

# Tentukan kategori status
status <- ifelse(change > 0, "Naik",
                 ifelse(change < 0, "Turun", "Tetap"))

# Geser 1 langkah supaya panjang sama
status <- c(NA, status)
data$Status <- status
head(data)
Date Open High Low Close Adj Close** Volume Status
2018-05-01 24117.29 24117.29 23808.19 24099.05 24099.05 380070000 NA
2018-05-02 24097.63 24185.52 23886.30 23924.98 23924.98 385350000 Turun
2018-05-03 23836.23 23996.15 23531.31 23930.15 23930.15 389240000 Naik
2018-05-04 23865.22 24333.35 23778.87 24262.51 24262.51 329480000 Naik
2018-05-07 24317.66 24479.45 24263.42 24357.32 24357.32 307670000 Naik
2018-05-08 24341.35 24412.34 24198.34 24360.21 24360.21 344940000 Naik

3.4 Pembentukan Matrix Transisi

Lihat Kode
# Bentuk model Markov
markov_model <- markovchainFit(data = data$Status, method = "mle")

tmA <- markov_model$estimate@transitionMatrix
# Buat objek Markov Chain dari matriks transisi
dtmcA <- new("markovchain", 
             transitionMatrix = tmA,
             states = c("Turun", "Tetap", "Naik"),
             name = "Rantai Markov Harga Saham")

# Tampilkan hasilnya
dtmcA
Rantai Markov Harga Saham 
 A  3 - dimensional discrete Markov Chain defined by the following states: 
 Turun, Tetap, Naik 
 The transition matrix  (by rows)  is defined as follows: 
           Naik       Tetap     Turun
Naik  0.5359765 0.001468429 0.4625551
Tetap 1.0000000 0.000000000 0.0000000
Turun 0.5505226 0.000000000 0.4494774
Lihat Kode
# Ambil matriks transisinya
tmA
           Naik       Tetap     Turun
Naik  0.5359765 0.001468429 0.4625551
Tetap 1.0000000 0.000000000 0.0000000
Turun 0.5505226 0.000000000 0.4494774
Lihat Kode
plot(dtmcA)

Lihat Kode
# === Ubah nama state sesuai data kamu ===
stateNames <- c("Turun", "Tetap", "Naik")

# Pastikan urutannya sama seperti di matriks
rownames(tmA) <- stateNames
colnames(tmA) <- stateNames

# === Plot rantai Markov ===
plotmat(tmA,
        pos = c(1, 2), 
        lwd = 1, 
        box.lwd = 2, 
        cex.txt = 0.8, 
        box.size = 0.1, 
        box.type = "circle", 
        box.prop = 0.5,
        box.col = "lightblue",
        arr.length = .1,
        arr.width = .1,
        self.cex = .6,
        self.shifty = -.01,
        self.shiftx = .14,
        main = "Rantai Markov Perubahan Harga (Naik/Turun/Tetap)"
)

Berdasarkan matriks probabilitas transisi yang diperoleh, dapat dilihat bahwa pergerakan harga aset menunjukkan pola yang cukup dinamis antar kondisi naik, tetap, dan turun. Ketika harga berada pada kondisi naik, terdapat kecenderungan harga untuk tetap melanjutkan kenaikan pada periode berikutnya dengan probabilitas sekitar 53,6%. Meskipun demikian, peluang terjadinya pembalikan arah menuju kondisi turun juga relatif besar, yaitu sekitar 46,3%, yang mengindikasikan bahwa fase kenaikan belum sepenuhnya stabil dan masih rentan terhadap fluktuasi pasar.

Pada kondisi tetap, hasil analisis menunjukkan bahwa keadaan ini bersifat sementara. Harga aset yang berada pada kondisi tetap pada satu periode selalu berpindah ke kondisi naik pada periode berikutnya. Temuan ini mengindikasikan bahwa stagnasi harga tidak berlangsung lama dan pasar cenderung segera menunjukkan pergerakan, khususnya ke arah positif. Kondisi ini kemungkinan dipengaruhi oleh jumlah observasi keadaan tetap yang terbatas dalam data historis.

Sementara itu, ketika harga berada dalam kondisi turun, terdapat kecenderungan harga untuk mengalami pemulihan. Probabilitas transisi dari kondisi turun ke kondisi naik sedikit lebih besar dibandingkan peluang untuk tetap berada pada kondisi turun. Hal ini menunjukkan adanya potensi rebound harga setelah periode penurunan, meskipun risiko kelanjutan tren penurunan masih tetap ada.

Secara keseluruhan, hasil analisis rantai Markov menunjukkan bahwa kondisi naik merupakan keadaan yang paling dominan dan sering menjadi tujuan akhir transisi dari kondisi lainnya. Kondisi tetap tidak berperan sebagai keadaan jangka panjang, sedangkan kondisi turun cenderung diikuti oleh pergerakan kembali ke kondisi naik. Pola ini mencerminkan karakteristik pasar yang aktif dan fluktuatif, di mana perubahan harga lebih sering diikuti oleh dinamika transisi dibandingkan kondisi yang stagnan.

3.5 Penentuan Initial State

Lihat Kode
prop <- prop.table(table(na.omit(data$Status)))

# Sesuaikan urutan: Turun, Tetap, Naik
initialState <- as.numeric(prop[c("Turun", "Tetap", "Naik")])
initialState[is.na(initialState)] <- 0
names(initialState) <- c("Turun", "Tetap", "Naik")

initialState
       Turun        Tetap         Naik 
0.4566428003 0.0007955449 0.5425616547 

Distribusi keadaan awal (initial state) menunjukkan bahwa pada awal periode pengamatan, probabilitas harga aset berada pada kondisi naik merupakan yang terbesar, yaitu sekitar 54,26%. Sementara itu, probabilitas harga berada pada kondisi turun sebesar 45,66%, dan probabilitas berada pada kondisi tetap sangat kecil, yaitu kurang dari 0,1%. Temuan ini mengindikasikan bahwa sejak awal pengamatan, pergerakan harga aset cenderung berada dalam kondisi aktif, dengan dominasi kondisi naik dan turun, serta sangat jarang mengalami stagnasi.

3.6 Final State

Lihat Kode
# state 1 langkah
steps <- 1

# Pastikan initial state berbentuk row vector
initialStateVec <- matrix(initialState, nrow = 1)

# Karena tmA adalah matrix
finalState <- initialStateVec %*% (tmA %^% steps)

finalState
         Turun        Tetap      Naik
[1,] 0.5442378 0.0006705474 0.4550916
Lihat Kode
#state 2 langkah
steps <- 2
finalState2 <- initialStateVec %*% (tmA %^% steps)
finalState2
         Turun        Tetap      Naik
[1,] 0.5429075 0.0007991745 0.4562933

3.7 Analisis Steady State

Lihat Kode
steadyStates(dtmcA)
         Turun        Tetap      Naik
[1,] 0.5429827 0.0007973315 0.4562199

Distribusi steady state yang diperoleh menunjukkan bahwa dalam jangka panjang, probabilitas harga aset berada pada kondisi turun merupakan yang paling besar, yaitu sekitar 54,30%. Sementara itu, probabilitas harga berada pada kondisi naik sebesar 45,62%, dan probabilitas berada pada kondisi tetap sangat kecil, yaitu sekitar 0,08%. Hasil ini mengindikasikan bahwa dalam jangka panjang, dinamika pergerakan harga aset didominasi oleh fluktuasi antara kondisi naik dan turun, dengan kecenderungan lebih besar pada kondisi penurunan.

Lihat Kode
set.seed(123)  # agar hasil reproducible
simulasi <- rmarkovchain(n = 10, object = dtmcA, t0 = "Tetap")
simulasi
 [1] "Turun" "Naik"  "Turun" "Naik"  "Naik"  "Turun" "Turun" "Naik"  "Naik" 
[10] "Turun"

Berdasarkan hasil analisis selama 10 hari pengamatan, kondisi harga aset menunjukkan pergerakan yang fluktuatif antara keadaan naik dan turun, tanpa adanya periode stagnan (tetap). Dari sepuluh hari tersebut, kondisi naik dan turun muncul secara bergantian, dengan frekuensi yang relatif seimbang. Pola ini mencerminkan bahwa dalam jangka pendek, harga aset cenderung bergerak aktif dan tidak menetap pada satu kondisi tertentu.

4 Insight

1. Pasar bersifat aktif dan tidak stagnan
Hampir tidak ditemukannya kondisi tetap baik pada data historis, analisis 10 hari, maupun steady state menunjukkan bahwa harga aset jarang berada dalam kondisi diam.


Implikasi bisnis: strategi wait and see kurang efektif. Pelaku pasar perlu respons cepat karena perubahan harga terjadi hampir setiap periode.

2. Jangka pendek ada peluang rebound, tapi jangka panjang lebih berisiko

Dalam jangka pendek, baik kondisi turun maupun tetap memiliki peluang cukup besar untuk berpindah ke kondisi naik. Namun, hasil steady state justru menunjukkan bahwa dalam jangka panjang, probabilitas berada pada kondisi turun lebih besar dibandingkan naik.
Implikasi bisnis:

Cocok untuk trading jangka pendek dan ini mengidentifikasikan bahwasanya kurang ideal untuk hold jangka panjang tanpa manajemen risiko

3. Momentum naik tidak sepenuhnya stabil
Meskipun kondisi naik memiliki peluang bertahan yang cukup besar, probabilitas pembalikan ke kondisi turun juga tinggi.
Implikasi bisnis:

Saat harga naik, profit taking(mengambil keuntungan pasar) menjadi strategi rasional dan juga hindari asumsi bahwa tren naik akan bertahan lama karna tren naik dan turun tidak jauh beda probrabilitasnya

4. Penurunan harga membuka peluang masuk pasar (entry point)
Probabilitas transisi dari kondisi turun ke kondisi naik relatif tinggi, menunjukkan adanya kecenderungan pemulihan harga setelah penurunan.
Implikasi bisnis:

Strategi buy on dip relevan dalam konteks ini