stock_symbol <- c("META")
From_Date = as.character(Sys.Date()-182*1)
To_Date = as.character(Sys.Date())
META <- getSymbols(stock_symbol,src = "yahoo",from=From_Date,
to=To_Date,auto.assign =
FALSE,adjust=TRUE)
Meta Platform Inc., sebelumnya dikenal sebagai Facebook, adalah perusahaan teknologi multinasional yang berbasis di Amerika Serikat. Perusahaan ini didirikan pada tahun 2004 oleh Mark Zuckerberg dan rekan-rekannya. Awalnya hanya berfokus pada jejaring sosial, Meta telah berkembang menjadi entitas yang lebih luas dengan fokus pada teknologi, jejaring sosial, dan realitas maya. Meta telah menarik perhatian investor dengan kinerja keuangan yang mengesankan dan pengenalan dividen baru-baru ini. Beberapa analis mempertimbangkan apakah Meta dapat dianggap sebagai saham dengan nilai (value stock). Namun, untuk memahami perkembangan saham Meta Platform Inc. secara lebih mendalam, disarankan untuk selalu memeriksa sumber yang lebih terperinci dan terkini.
head(META)
## META.Open META.High META.Low META.Close META.Volume META.Adjusted
## 2023-08-22 292.55 292.90 286.75 287.60 12999900 287.60
## 2023-08-23 288.50 297.40 287.67 294.24 18287000 294.24
## 2023-08-24 298.50 299.46 286.64 286.75 18360900 286.75
## 2023-08-25 286.13 288.39 276.03 285.50 23701400 285.50
## 2023-08-28 288.00 291.45 285.80 290.26 14239300 290.26
## 2023-08-29 288.58 299.15 288.18 297.99 20844500 297.99
Dalam enam bulan terakhir, saham Meta Platform Inc. (META) telah mengalami perjalanan yang menarik dan penuh tantangan. Pada tanggal 22 Agustus 2023, saham META memulai perjalanan dengan harga sekitar 250. Dalam beberapa bulan berikutnya, saham META mengalami tren positif yang mengundang perhatian banyak pihak. Harga saham terus naik secara konsisten, menembus batas-batas sebelumnya. Pada 2 Februari 2024, harga saham mencapai rekor tertinggi sepanjang masa pada 474.99. Ini adalah momen yang menggembirakan bagi para investor yang telah mempercayai potensi Meta Platform Inc.
highchart(type = "stock") %>%
hc_add_series(META) %>%
hc_title(text="<b>Stock Market Movement within the Last Six Months<b>")
Penghitungan return harga saham Meta Platform Inc. selama periode 22 Agustus 2023 hingga 16 Februari 2024 melibatkan penerapan rumus return harga saham pada interval waktu ∆t. Rumus ini digunakan untuk mengevaluasi perubahan nilai saham selama periode tertentu, memungkinkan analisis yang lebih mendalam terhadap kinerja saham dalam rentang waktu tersebut. Ri,j =((S(t + ∆t)- S(t)))/S(t) ≈ln(S(t + ∆t)/S(t) ) di mana Ri,j =((S(t+∆t)-S(t)))/S(t) sebagai return diskrit, dan ln(S(t+∆t)/S(t) ) sebagai return kontinu. Dengan memanfaatkan data harga saham harian selama enam bulan (128 hari saham) dan mengambil interval waktu ∆t sebesar 1 hari yang setara dengan 1/128 tahun, kita dapat menghitung return harian saham baik dalam bentuk kontinu maupun diskrit. Berikut disajikan tabel historis Meta Platform Inc. selama periode 22 Agustus 2023 hingga 16 Februari 2024. Tabel ini memberikan gambaran terperinci tentang perubahan harga saham sepanjang periode tersebut, menjadi dasar penting untuk analisis dan evaluasi kinerja investasi.
# Calculate discrete returns
META$discrete_returns <- Return.calculate(META$META.Close, method = "discrete")
# Calculate logarithmic returns
META$log_returns <- Return.calculate(META$META.Close, method = "log")
# Gabungkan kolom-kolom baru ke dalam dataset
META <- cbind(META, discrete_returns = META$discrete_returns, log_returns = META$log_returns)
# Tampilkan struktur dataset setelah penggabungan
META
## META.Open META.High META.Low META.Close META.Volume META.Adjusted
## 2023-08-22 292.55 292.90 286.75 287.60 12999900 287.60
## 2023-08-23 288.50 297.40 287.67 294.24 18287000 294.24
## 2023-08-24 298.50 299.46 286.64 286.75 18360900 286.75
## 2023-08-25 286.13 288.39 276.03 285.50 23701400 285.50
## 2023-08-28 288.00 291.45 285.80 290.26 14239300 290.26
## 2023-08-29 288.58 299.15 288.18 297.99 20844500 297.99
## 2023-08-30 297.17 298.29 293.43 295.10 17717000 295.10
## 2023-08-31 295.80 301.10 295.66 295.89 17229900 295.89
## 2023-09-01 299.37 301.74 294.47 296.38 12819800 296.38
## 2023-09-05 297.02 301.39 295.51 300.15 14956000 300.15
## ...
## 2024-02-05 469.88 471.90 459.22 459.41 40832400 459.41
## 2024-02-06 464.00 467.12 453.00 454.72 21655200 454.72
## 2024-02-07 458.00 471.52 456.18 469.59 23066000 469.59
## 2024-02-08 468.32 470.59 465.03 470.00 18815100 470.00
## 2024-02-09 472.95 473.59 467.47 468.11 18413100 468.11
## 2024-02-12 468.19 479.15 466.58 468.90 19382000 468.90
## 2024-02-13 456.87 467.89 455.09 460.12 20916600 460.12
## 2024-02-14 467.93 474.11 466.09 473.28 16858400 473.28
## 2024-02-15 475.28 488.62 472.22 484.03 24212300 484.03
## 2024-02-16 478.11 478.96 469.21 473.32 23306500 473.32
## discrete_returns log_returns discrete_returns.1 log_returns.1
## 2023-08-22 NA NA NA NA
## 2023-08-23 0.0230875660 0.0228250806 0.0230875660 0.0228250806
## 2023-08-24 -0.0254553782 -0.0257849717 -0.0254553782 -0.0257849717
## 2023-08-25 -0.0043591979 -0.0043687269 -0.0043591979 -0.0043687269
## 2023-08-28 0.0166725386 0.0165350776 0.0166725386 0.0165350776
## 2023-08-29 0.0266312279 0.0262827894 0.0266312279 0.0262827894
## 2023-08-30 -0.0096982591 -0.0097455935 -0.0096982591 -0.0097455935
## 2023-08-31 0.0026770875 0.0026735105 0.0026770875 0.0026735105
## 2023-09-01 0.0016559877 0.0016546181 0.0016559877 0.0016546181
## 2023-09-05 0.0127201193 0.0126398981 0.0127201193 0.0126398981
## ...
## 2024-02-05 -0.0328006629 -0.0333506651 -0.0328006629 -0.0333506651
## 2024-02-06 -0.0102087512 -0.0102612179 -0.0102087512 -0.0102612179
## 2024-02-07 0.0327014318 0.0321781182 0.0327014318 0.0321781182
## 2024-02-08 0.0008731099 0.0008727289 0.0008731099 0.0008727289
## 2024-02-09 -0.0040213078 -0.0040294150 -0.0040213078 -0.0040294150
## 2024-02-12 0.0016876558 0.0016862333 0.0016876558 0.0016862333
## 2024-02-13 -0.0187246724 -0.0189021987 -0.0187246724 -0.0189021987
## 2024-02-14 0.0286012427 0.0281998625 0.0286012427 0.0281998625
## 2024-02-15 0.0227138270 0.0224597088 0.0227138270 0.0224597088
## 2024-02-16 -0.0221267101 -0.0223751778 -0.0221267101 -0.0223751778
# Buat objek time series untuk return diskrit
META_discrete_ts <- xts(META$discrete_returns, order.by = index(META))
# Buat objek time series untuk return kontinu
META_log_ts <- xts(META$log_returns, order.by = index(META))
# Buat plot gabungan menggunakan highcharter
highchart() %>%
hc_chart(type = "scatter") %>%
hc_title(text = "Return Diskrit dan Kontinu Saham META") %>%
hc_xAxis(type = "datetime") %>%
hc_add_series(data = META_discrete_ts, name = "Return Diskrit") %>%
hc_add_series(data = META_log_ts, name = "Return Kontinu")
Untuk mengetahui normalitas return saham Meta Platform Inc, data return diskrit maupun return kontinu disajikan ke dalam scatterplot, normal p-plot, dan bentuk histogram.
# Ambil data return diskrit sebagai contoh
return_diskrit <- META_discrete_ts
return_kontinu <- META_log_ts
# Lakukan uji normalitas Kolmogorov-Smirnov secara manual
ks_test_diskrit <- ks.test(return_diskrit, "pnorm")
ks_test_kontinu <- ks.test(return_kontinu, "pnorm")
# Tampilkan histogram untuk melihat distribusi data dengan banyak balok
hist(return_diskrit,
main = "Histogram Return Diskrit",
xlab = "Return Diskrit",
col = "lightblue",
border = "black",
breaks = "FD") # Ubah metode pembagian balok sesuai kebutuhan (contoh: "FD" untuk metode Freedman-Diaconis)
# Tampilkan scatter plot distribusi normal
qqnorm(return_diskrit, main = "QQ Plot - Distribusi Normal (Diskrit)", col = "blue", pch = 20, cex = 1.5)
qqline(return_diskrit, col = 2, lwd = 2)
# Tampilkan hasil uji untuk return diskrit
cat("Statistik uji Kolmogorov-Smirnov (Diskrit):", ks_test_diskrit$statistic, "\n")
## Statistik uji Kolmogorov-Smirnov (Diskrit): 0.5092098
cat("P-value (Diskrit):", ks_test_diskrit$p.value, "\n")
## P-value (Diskrit): 0
# Tentukan tingkat signifikansi (biasanya 0.05)
alpha <- 0.05
# Lakukan pengujian hipotesis untuk return diskrit
if (ks_test_diskrit$p.value < alpha) {
cat("Tolak hipotesis nol (Diskrit): Data tidak terdistribusi normal.\n")
} else {
cat("Terima hipotesis nol (Diskrit): Data terdistribusi normal.\n")
}
## Tolak hipotesis nol (Diskrit): Data tidak terdistribusi normal.
# Tampilkan histogram untuk melihat distribusi data dengan banyak balok
hist(return_kontinu,
main = "Histogram Return Kontinu",
xlab = "Return Kontinu",
col = "lightgreen",
border = "black",
breaks = "FD") # Ubah metode pembagian balok sesuai kebutuhan (contoh: "FD" untuk metode Freedman-Diaconis)
# Tampilkan scatter plot distribusi normal
qqnorm(return_kontinu, main = "QQ Plot - Distribusi Normal (Kontinu)", col = "green", pch = 20, cex = 1.5)
qqline(return_kontinu, col = 2, lwd = 2)
# Tampilkan hasil uji untuk return kontinu
cat("Statistik uji Kolmogorov-Smirnov (Kontinu):", ks_test_kontinu$statistic, "\n")
## Statistik uji Kolmogorov-Smirnov (Kontinu): 0.5091051
cat("P-value (Kontinu):", ks_test_kontinu$p.value, "\n")
## P-value (Kontinu): 0
# Lakukan pengujian hipotesis untuk return kontinu
if (ks_test_kontinu$p.value < alpha) {
cat("Tolak hipotesis nol (Kontinu): Data tidak terdistribusi normal.\n")
} else {
cat("Terima hipotesis nol (Kontinu): Data terdistribusi normal.\n")
}
## Tolak hipotesis nol (Kontinu): Data tidak terdistribusi normal.
Scatter plot di atas menampilkan data mengenai Return Diskrit dan Kontinu Saham META selama periode enam bulan dari September 2023 hingga Februari 2024. Dalam plot terlihat ada satu pencilan data, dimana pada Tanggal 2 Februari 2024, return META mencapai 20%.
# Fungsi untuk menghapus pencilan berdasarkan IQR
remove_outliers <- function(data) {
Q1 <- quantile(data, 0.25, na.rm = TRUE)
Q3 <- quantile(data, 0.75, na.rm = TRUE)
IQR_val <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR_val
upper_bound <- Q3 + 1.5 * IQR_val
data_filtered <- data[which(data >= lower_bound & data <= upper_bound)]
return(data_filtered)
}
# Menghapus pencilan dari return_diskrit
return_diskrit_no_outliers <- remove_outliers(return_diskrit)
return_kontinu_no_outliers <- remove_outliers(return_kontinu)
# Tampilkan hasil
cat("Jumlah data sebelum menghapus pencilan:", length(return_diskrit), "\n")
## Jumlah data sebelum menghapus pencilan: 124
cat("Jumlah data setelah menghapus pencilan:", length(return_diskrit_no_outliers), "\n")
## Jumlah data setelah menghapus pencilan: 122
cat("Jumlah data sebelum menghapus pencilan:", length(return_kontinu), "\n")
## Jumlah data sebelum menghapus pencilan: 124
cat("Jumlah data setelah menghapus pencilan:", length(return_kontinu_no_outliers), "\n")
## Jumlah data setelah menghapus pencilan: 121
Dari hasil uji normalitas ini, terlihat bahwa data tidak terdistribusi normal dengan masing-masing P-valuenya adalah 0. Hal ini mungkin dikarenakan adanya pencilan pada data, untuk itu karena tujuan analisis ini melihat pergerakan return dan mensimulasikan lintasan saha, maka dilakukan cleaning data untuk menghilangkan pencilan.
# Tampilkan hasil uji untuk return diskrit
cat("Statistik uji Kolmogorov-Smirnov (Diskrit):", ks_test_diskrit$statistic, "\n")
## Statistik uji Kolmogorov-Smirnov (Diskrit): 0.5092098
cat("P-value (Diskrit):", ks_test_diskrit$p.value, "\n")
## P-value (Diskrit): 0
# Tentukan tingkat signifikansi (biasanya 0.05)
alpha <- 0.05
# Lakukan pengujian hipotesis untuk return diskrit
if (ks_test_diskrit$p.value < alpha) {
cat("Tolak hipotesis nol (Diskrit): Data tidak terdistribusi normal.\n")
} else {
cat("Terima hipotesis nol (Diskrit): Data terdistribusi normal.\n")
}
## Tolak hipotesis nol (Diskrit): Data tidak terdistribusi normal.
# Tampilkan hasil uji untuk return kontinu
cat("Statistik uji Kolmogorov-Smirnov (Kontinu):", ks_test_kontinu$statistic, "\n")
## Statistik uji Kolmogorov-Smirnov (Kontinu): 0.5091051
cat("P-value (Kontinu):", ks_test_kontinu$p.value, "\n")
## P-value (Kontinu): 0
# Lakukan pengujian hipotesis untuk return kontinu
if (ks_test_kontinu$p.value < alpha) {
cat("Tolak hipotesis nol (Kontinu): Data tidak terdistribusi normal.\n")
} else {
cat("Terima hipotesis nol (Kontinu): Data terdistribusi normal.\n")
}
## Tolak hipotesis nol (Kontinu): Data tidak terdistribusi normal.
Hasil dari histogram dan QQ Plot berikut menunjukkan bahwa distribusi pada kedua return sudah berdistribusi normal. Hal ini dapat dilihat pada visual histogram yang berbentuk lonceng dan dot yang tersebar disekitar garis. Distribusi normal memungkinkan penerapan model statistik yang lebih sederhana dan efektif, memudahkan prediksi dan pengelolaan portofolio. Dalam prakteknya, return saham seringkali tidak sepenuhnya mengikuti distribusi normal, dan analis perlu mempertimbangkan sifat unik dari setiap saham dan faktor-faktor yang dapat mempengaruhi pergerakan harga saham. Untuk memahami lebih jauh, berikut adalah QQ plot distribusi normal.
# Ambil data return diskrit sebagai contoh
return_diskrit <- return_diskrit_no_outliers
return_kontinu <- return_kontinu_no_outliers
# Lakukan uji normalitas Kolmogorov-Smirnov secara manual
ks_test_diskrit <- ks.test(return_diskrit, "pnorm")
ks_test_kontinu <- ks.test(return_kontinu, "pnorm")
# Tampilkan histogram untuk melihat distribusi data dengan banyak balok
hist(return_diskrit,
main = "Histogram Return Diskrit",
xlab = "Return Diskrit",
col = "lightblue",
border = "black",
breaks = "FD") # Ubah metode pembagian balok sesuai kebutuhan (contoh: "FD" untuk metode Freedman-Diaconis)
# Tampilkan histogram untuk melihat distribusi data dengan banyak balok
hist(return_kontinu,
main = "Histogram Return Kontinu",
xlab = "Return Kontinu",
col = "lightgreen",
border = "black",
breaks = "FD") # Ubah metode pembagian balok sesuai kebutuhan (contoh: "FD" untuk metode Freedman-Diaconis)
# Tampilkan scatter plot distribusi normal
qqnorm(return_diskrit, main = "QQ Plot - Distribusi Normal (Diskrit)", col = "blue", pch = 20, cex = 1.5)
qqline(return_diskrit, col = 2, lwd = 2)
# Tampilkan scatter plot distribusi normal
qqnorm(return_kontinu, main = "QQ Plot - Distribusi Normal (Kontinu)", col = "green", pch = 20, cex = 1.5)
qqline(return_kontinu, col = 2, lwd = 2)
## D. Simulasi Lintasan Harga Saham. ### Mencari parameter
# Periksa dan hapus nilai NA pada indeks pertama
if (is.na(return_diskrit_no_outliers[1])) {
return_diskrit <- return_diskrit_no_outliers[-1]
}
# Cek apakah data masih mengandung NA
any_na <- any(is.na(return_diskrit_no_outliers))
if (any_na) {
stop("Data masih mengandung NA setelah menghilangkan indeks pertama. Periksa data Anda.")
}
# Hitung rata-rata baru (opsional)
mean_diskrit <- mean(return_diskrit_no_outliers, na.rm = TRUE)
mean_kontinu <- mean(return_kontinu_no_outliers, na.rm = TRUE)
# Hitung standar deviasi baru (opsional)
sd_diskrit <- sd(return_diskrit_no_outliers, na.rm = TRUE)
sd_kontinu <- sd(return_kontinu_no_outliers, na.rm = TRUE)
volatility_diskrit <- sd_diskrit * 100
volatility_kontinu <- sd_kontinu * 100
sd_diskrit
## [1] 0.01688935
sd_kontinu
## [1] 0.01643768
volatility_diskrit
## [1] 1.688935
volatility_kontinu
## [1] 1.643768
Simulasi lintasan harga saham dilakukan dengan menggunakan model Geometric Brownian Motion. Model ini memasukkan pengembalian rata-rata dan volatilitas untuk menghasilkan proses stokastik yang memodelkan harga saham di masa depan. Parameter simulasi ditetapkan dengan harga saham awal (S) sebesar 318.64, rata-rata pengembalian (mu) yang berasal dari data diskrit, dan standar deviasi (sigma) juga dari data diskrit. Simulasi berjalan selama periode waktu (T) 1 dengan 125 langkah (L). Berikut adalah hasil dari simulasi lintasan harga saham dengan formulasi diskrit dan kontinu:
# Install dan memuat library ggplot2 jika belum terpasang
# install.packages("ggplot2")
library(ggplot2)
# Set parameter simulasi
S <- 318.64
mu <- mean_diskrit
sigma <- sd_diskrit
L <- 125
T <- 1
dt <- T/L
M <- 1
# Waktu
t_waktu <- seq(0, T, length.out = L) # Sesuaikan length.out dengan panjang lintasan harga saham
# Simulasi lintasan harga saham
S_hargasaham <- S * cumprod(exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * rnorm(M * L)))
# Menambahkan harga saham awal
S_hargasaham <- cbind(rep(S, M), S_hargasaham)
# Buat data frame
df <- data.frame(t_waktu, S_hargasaham)
# Mengecilkan data frame menjadi dua kolom (t_waktu dan harga saham) dan memperbaiki nama kolom
df <- reshape2::melt(df, id.vars = "t_waktu")
colnames(df) <- c("t_waktu", "Lintasan", "Harga_Saham")
# Plot lintasan harga saham
ggplot(df, aes(x = t_waktu, y = Harga_Saham, color = factor(Lintasan))) +
geom_line() +
labs(title = "Simulasi lintasan harga saham formulasi diskrit",
x = "t",
y = "S(t)") +
theme_minimal() +
scale_color_discrete(name = "Lintasan") +
theme(legend.position = "top")
# Install dan memuat library ggplot2 jika belum terpasang
# install.packages("ggplot2")
library(ggplot2)
# Set parameter simulasi
S <- 318.64
mu <- mean_kontinu
sigma <- sd_kontinu
L <- 125
T <- 1
dt <- T/L
M <- 1
# Waktu
t_waktu <- seq(0, T, length.out = L) # Sesuaikan length.out dengan panjang lintasan harga saham
# Simulasi lintasan harga saham
S_hargasaham <- S * cumprod(exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * rnorm(M * L)))
# Menambahkan harga saham awal
S_hargasaham <- cbind(rep(S, M), S_hargasaham)
# Buat data frame
df <- data.frame(t_waktu, S_hargasaham)
# Mengecilkan data frame menjadi dua kolom (t_waktu dan harga saham) dan memperbaiki nama kolom
df <- reshape2::melt(df, id.vars = "t_waktu")
colnames(df) <- c("t_waktu", "Lintasan", "Harga_Saham")
# Plot lintasan harga saham
ggplot(df, aes(x = t_waktu, y = Harga_Saham, color = factor(Lintasan))) +
geom_line() +
labs(title = "Simulasi lintasan harga saham formulasi kontinu",
x = "t",
y = "S(t)") +
theme_minimal() +
scale_color_discrete(name = "Lintasan") +
theme(legend.position = "top")