# Import library yang dibutuhkan
library(readr)
## Warning: package 'readr' was built under R version 4.2.3
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)

Langkah awal adalah mengimpor library yang diperlukan untuk analisis data. Library readr digunakan untuk membaca file CSV, dplyr digunakan untuk manipulasi data, dan ggplot2 digunakan untuk visualisasi data.

# Lokasi file CSV
file_path <- "C:/Users/ASUS/Downloads/data harga saham.csv"

Kemudian mendefinisikan lokasi file CSV yang akan diolah.

# Periksa apakah file sudah ada di sistem
if (file.exists(file_path)) {
  print("File sudah ada di sistem.")
} else {
  print("File tidak ditemukan.")
}
## [1] "File sudah ada di sistem."

Berikutnya, memeriksa apakah file CSV sudah ada di sistem.

# Baca file CSV dan simpan dalam bentuk data frame
data <- read_csv(file_path, col_types = cols(Date = col_datetime(format = "%m/%d/%Y"), AMT = col_double(), GE = col_double(), XOM = col_double(), WMT = col_double()))

Membaca file CSV dan menyimpannya dalam bentuk data frame. Fungsi col_types digunakan untuk menentukan tipe data untuk setiap kolom dalam file CSV.

# Tampilkan sepuluh baris pertama, struktur, ringkasan, dan dimensi dari data frame
head(data, 21)
## # A tibble: 21 × 5
##    Date                  AMT    GE   XOM   WMT
##    <dttm>              <dbl> <dbl> <dbl> <dbl>
##  1 2021-10-01 00:00:00  267.  106.  60.1  137.
##  2 2021-10-04 00:00:00  265.  105.  60.9  136.
##  3 2021-10-05 00:00:00  265.  105.  60.8  137.
##  4 2021-10-06 00:00:00  268.  104.  59.7  138.
##  5 2021-10-07 00:00:00  266.  106.  59.9  139.
##  6 2021-10-08 00:00:00  262.  105.  61.4  140.
##  7 2021-10-11 00:00:00  262.  104.  60.7  140.
##  8 2021-10-12 00:00:00  265.  103.  60.4  139.
##  9 2021-10-13 00:00:00  264.  102.  60.3  138.
## 10 2021-10-14 00:00:00  268.  103.  61.2  140.
## # … with 11 more rows
str(data)
## spc_tbl_ [21 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Date: POSIXct[1:21], format: "2021-10-01" "2021-10-04" ...
##  $ AMT : num [1:21] 267 265 265 268 266 ...
##  $ GE  : num [1:21] 106 105 105 104 106 ...
##  $ XOM : num [1:21] 60.1 60.9 60.8 59.7 59.9 ...
##  $ WMT : num [1:21] 137 136 137 138 139 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Date = col_datetime(format = "%m/%d/%Y"),
##   ..   AMT = col_double(),
##   ..   GE = col_double(),
##   ..   XOM = col_double(),
##   ..   WMT = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
summary(data)
##       Date                             AMT              GE       
##  Min.   :2021-10-01 00:00:00.00   Min.   :261.6   Min.   :102.4  
##  1st Qu.:2021-10-08 00:00:00.00   1st Qu.:265.2   1st Qu.:104.0  
##  Median :2021-10-15 00:00:00.00   Median :268.0   Median :104.7  
##  Mean   :2021-10-15 18:17:08.56   Mean   :272.6   Mean   :104.5  
##  3rd Qu.:2021-10-22 00:00:00.00   3rd Qu.:282.0   3rd Qu.:105.3  
##  Max.   :2021-10-29 00:00:00.00   Max.   :286.9   Max.   :107.4  
##       XOM             WMT       
##  Min.   :59.69   Min.   :135.7  
##  1st Qu.:60.74   1st Qu.:139.2  
##  Median :61.73   Median :140.6  
##  Mean   :61.78   Mean   :142.6  
##  3rd Qu.:63.00   3rd Qu.:147.5  
##  Max.   :64.97   Max.   :150.1
dim(data)
## [1] 21  5

Menampilkan sepuluh baris pertama, struktur, ringkasan, dan dimensi dari data frame, pada langkah ini menampilkan informasi dasar data yang dimasukkan.

# Hitung return harian dari setiap saham
data <- data %>% mutate(Return_AMT = (AMT - lag(AMT)) / lag(AMT),
                         Return_GE = (GE - lag(GE)) / lag(GE),
                         Return_XOM = (XOM - lag(XOM)) / lag(XOM),
                         Return_WMT = (WMT - lag(WMT)) / lag(WMT))

Kemudian menghitung return harian untuk setiap saham menggunakan formula yang diberikan yakni𝑟𝑡 = 𝑃𝑡 − 𝑃𝑡−1/𝑃𝑡−1. Di sini, lag(AMT) mengacu pada 𝑃𝑡−1 dan AMT mengacu pada 𝑃𝑡 dalam formula. Hal ini berlaku juga pada setiap saham (AMT, GE, XOM, dan WMT).

# Buat data frame baru yang berisi return harian
return_data <- data %>% select(Date, Return_AMT, Return_GE, Return_XOM, Return_WMT)

Membuat data frame baru yang hanya berisi kolom tanggal dan return harian untuk setiap

# Tampilkan sepuluh baris pertama, struktur, ringkasan, dan dimensi dari data frame baru
head(return_data, 21)
## # A tibble: 21 × 5
##    Date                Return_AMT Return_GE Return_XOM Return_WMT
##    <dttm>                   <dbl>     <dbl>      <dbl>      <dbl>
##  1 2021-10-01 00:00:00   NA        NA         NA        NA       
##  2 2021-10-04 00:00:00   -0.00518  -0.00869    0.0130   -0.00963 
##  3 2021-10-05 00:00:00   -0.00256   0         -0.00162   0.00656 
##  4 2021-10-06 00:00:00    0.0129   -0.00543   -0.0183    0.00732 
##  5 2021-10-07 00:00:00   -0.00690   0.0113     0.00281   0.0118  
##  6 2021-10-08 00:00:00   -0.0151   -0.00749    0.0251    0.00302 
##  7 2021-10-11 00:00:00   -0.00183  -0.00611   -0.00997  -0.000931
##  8 2021-10-12 00:00:00    0.0113   -0.0131    -0.00520  -0.00107 
##  9 2021-10-13 00:00:00   -0.00140  -0.00350   -0.00278  -0.00725 
## 10 2021-10-14 00:00:00    0.0140    0.00371    0.0152    0.0108  
## # … with 11 more rows
str(return_data)
## tibble [21 × 5] (S3: tbl_df/tbl/data.frame)
##  $ Date      : POSIXct[1:21], format: "2021-10-01" "2021-10-04" ...
##  $ Return_AMT: num [1:21] NA -0.00518 -0.00256 0.01289 -0.0069 ...
##  $ Return_GE : num [1:21] NA -0.00869 0 -0.00543 0.01131 ...
##  $ Return_XOM: num [1:21] NA 0.01297 -0.00162 -0.01834 0.00281 ...
##  $ Return_WMT: num [1:21] NA -0.00963 0.00656 0.00732 0.01177 ...
summary(return_data)
##       Date                          Return_AMT          Return_GE        
##  Min.   :2021-10-01 00:00:00.00   Min.   :-0.015144   Min.   :-0.033414  
##  1st Qu.:2021-10-08 00:00:00.00   1st Qu.:-0.004998   1st Qu.:-0.006456  
##  Median :2021-10-15 00:00:00.00   Median : 0.001262   Median :-0.001389  
##  Mean   :2021-10-15 18:17:08.56   Mean   : 0.002853   Mean   :-0.000359  
##  3rd Qu.:2021-10-22 00:00:00.00   3rd Qu.: 0.011334   3rd Qu.: 0.011486  
##  Max.   :2021-10-29 00:00:00.00   Max.   : 0.019388   Max.   : 0.020323  
##                                   NA's   :1           NA's   :1          
##    Return_XOM          Return_WMT        
##  Min.   :-0.025972   Min.   :-0.0096316  
##  1st Qu.:-0.003381   1st Qu.:-0.0009669  
##  Median : 0.002809   Median : 0.0063851  
##  Mean   : 0.002919   Mean   : 0.0043612  
##  3rd Qu.: 0.013481   3rd Qu.: 0.0093958  
##  Max.   : 0.025058   Max.   : 0.0212451  
##  NA's   :1           NA's   :1
dim(return_data)
## [1] 21  5

Menampilkan informasi dasar tentang data frame yang baru.

# Tuliskan data frame ke sebuah CSV file
write_csv(return_data, "D:/return_data.csv")

Kemudian menuliskan data frame ke sebuah file CSV baru.

# Periksa apakah CSV file sudah ada di sistem
if (file.exists("return_data.csv")) {
  print("File return_data.csv sudah ada di sistem.")
} else {
  print("File return_data.csv tidak ditemukan.")
}
## [1] "File return_data.csv tidak ditemukan."

Memeriksa apakah file CSV baru sudah ada di sistem.

return_data <- na.omit(return_data)
return_data[is.na(return_data)] <- 0  # Mengganti NA dengan 0

# Buat gabungan lines plot dari return harian
ggplot(return_data, aes(Date)) +
  geom_line(aes(y = Return_AMT, colour = "AMT")) +
  geom_line(aes(y = Return_GE, colour = "GE")) +
  geom_line(aes(y = Return_XOM, colour = "XOM")) +
  geom_line(aes(y = Return_WMT, colour = "WMT")) +
  labs(colour = "Legend") +
  theme_minimal()

Membuat lines plot dari return harian untuk setiap saham pada data.


```r
# Buat gabungan boxplots dari return harian
ggplot(return_data) +
  geom_boxplot(aes(x = "AMT", y = Return_AMT), fill = "pink") +
  geom_boxplot(aes(x = "GE", y = Return_GE), fill = "green") +
  geom_boxplot(aes(x = "XOM", y = Return_XOM), fill = "blue") +
  geom_boxplot(aes(x = "WMT", y = Return_WMT), fill = "grey") +
  coord_flip() +
  theme_minimal()