Pendahuluan

Dokumen ini berisi visualisasi data harga saham menggunakan package ggplot2 pada R.

Import Library

library(readr)
library(ggplot2)
library(ggpmisc)

Membaca Data

NOK <- read_csv("Nokia ADR Stock Price History.csv",
                locale = locale(decimal_mark = ","))
Boeing <- read_csv("Boeing Stock Price History.csv", 
                locale = locale(decimal_mark = ","))
JPM <- read_csv("JPMorgan Stock Price History.csv", 
                locale = locale(decimal_mark = ","))

dataNOK <- data.frame(Time = as.Date(NOK$Date, format = '%m/%d/%Y'), Price = NOK$Price)
dataBoeing <- data.frame(Time = as.Date(Boeing$Date, format = '%m/%d/%Y'), Price = Boeing$Price)
dataJPM <- data.frame(Time = as.Date(JPM$Date, format = '%m/%d/%Y'), Price = JPM$Price)

head(dataNOK)
##         Time Price
## 1 2026-03-13  8240
## 2 2026-03-12  8140
## 3 2026-03-11  7900
## 4 2026-03-10  7800
## 5 2026-03-09  7890
## 6 2026-03-06  7740
head(dataBoeing)
##         Time Price
## 1 2026-03-13 20989
## 2 2026-03-12 20476
## 3 2026-03-11 21410
## 4 2026-03-10 21776
## 5 2026-03-09 22500
## 6 2026-03-06 23111
head(dataJPM)
##         Time Price
## 1 2026-03-13 28344
## 2 2026-03-12 28289
## 3 2026-03-11 28752
## 4 2026-03-10 28873
## 5 2026-03-09 28992
## 6 2026-03-06 28948

Visualisasi Data

p11 <- ggplot(dataNOK, aes(x = Time, y = Price)) +
  geom_line() +
  xlab("Date") +
  ylab("Price") +
  ggtitle("Time Series Plot NOK") +
  scale_x_date(date_labels = "%b %Y", date_breaks = "2 months") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 50, hjust = 1))+ 
  geom_vline(xintercept = as.Date(c("2023-01-01", "2024-01-01", "2025-01-01", "2026-01
01")), 
             linetype = 2, 
             color = 2, 
             linewidth = 1)
p11

#NOK
p <- ggplot(dataNOK, aes(x = Time, y = Price)) + 
  geom_line() +
  xlab("Date") +
  ylab("Price")

p +
  scale_x_date(date_labels = "%b %Y", date_breaks = "2 months") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 50, hjust = 1)) +
  
  stat_peaks(geom = "point", span = 15, color = "steelblue3", size = 2) +
  stat_peaks(geom = "label", span = 15, color = "steelblue3", angle = 0,
             hjust = -0.1, x.label.fmt = "%d/%m/%y") +
  
  stat_peaks(geom = "rug", span = 15, color = "blue", sides = "b") +
  
  stat_valleys(geom = "point", span = 11, color = "red", size = 2) +  
  stat_valleys(geom = "label", span = 11, color = "red", angle = 0,               
               hjust = -0.1, x.label.fmt = "%Y-%m-%d") +  
  stat_valleys(geom = "rug", span = 11, color = "red", sides = "b")

p22 <- ggplot(dataBoeing, aes(x = Time, y = Price)) +
  geom_line() +
  xlab("Date") +
  ylab("Price") +
  ggtitle("Time Series Plot Boeing") +
  scale_x_date(date_labels = "%b %Y", date_breaks = "2 months") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 50, hjust = 1))+ 
  geom_vline(xintercept = as.Date(c("2023-01-01", "2024-01-01", "2025-01-01", "2026-01
01")), 
             linetype = 2, 
             color = 2, 
             linewidth = 1)

p22

#Boeing
p <- ggplot(dataBoeing, aes(x = Time, y = Price)) + 
  geom_line() +
  xlab("Date") +
  ylab("Price")

p +
  scale_x_date(date_labels = "%b %Y", date_breaks = "2 months") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 50, hjust = 1)) +
  
  stat_peaks(geom = "point", span = 15, color = "steelblue3", size = 2) +
  stat_peaks(geom = "label", span = 15, color = "steelblue3", angle = 0,
             hjust = -0.1, x.label.fmt = "%d/%m/%y") +
  
  stat_peaks(geom = "rug", span = 15, color = "blue", sides = "b") +
  
  stat_valleys(geom = "point", span = 11, color = "red", size = 2) +  
  stat_valleys(geom = "label", span = 11, color = "red", angle = 0,               
               hjust = -0.1, x.label.fmt = "%Y-%m-%d") +  
  stat_valleys(geom = "rug", span = 11, color = "red", sides = "b")

p33 <- ggplot(dataJPM, aes(x = Time, y = Price)) +
  geom_line() +
  xlab("Date") +
  ylab("Price") +
  ggtitle("Time Series Plot JPM") +
  scale_x_date(date_labels = "%b %Y", date_breaks = "2 months") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 50, hjust = 1))+ 
  geom_vline(xintercept = as.Date(c("2023-01-01", "2024-01-01", "2025-01-01", "2026-01
01")), 
             linetype = 2, 
             color = 2, 
             linewidth = 1)
p33

#JPM
p <- ggplot(dataJPM, aes(x = Time, y = Price)) + 
  geom_line() +
  xlab("Date") +
  ylab("Price")

p +
  scale_x_date(date_labels = "%b %Y", date_breaks = "2 months") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 50, hjust = 1)) +
  
  stat_peaks(geom = "point", span = 15, color = "steelblue3", size = 2) +
  stat_peaks(geom = "label", span = 15, color = "steelblue3", angle = 0,
             hjust = -0.1, x.label.fmt = "%d/%m/%y") +
  
  stat_peaks(geom = "rug", span = 15, color = "blue", sides = "b") +
  
  stat_valleys(geom = "point", span = 11, color = "red", size = 2) +  
  stat_valleys(geom = "label", span = 11, color = "red", angle = 0,               
               hjust = -0.1, x.label.fmt = "%Y-%m-%d") +  
  stat_valleys(geom = "rug", span = 11, color = "red", sides = "b")

Multiple Stocks

#Multiple
dataJPM$Stock <- "JPM"
dataNOK$Stock <- "NOK"
dataBoeing$Stock <- "Boeing"

data_all<-rbind(dataNOK, dataBoeing, dataJPM)

ggplot(data_all, aes(x = Time, y = Price, color = Stock)) +
  geom_line(size = 1) +
  theme_minimal() +
  theme(legend.position = "right") +
  scale_x_date(date_labels = "%b %Y", date_breaks = "2 months") +
  theme(axis.text.x = element_text(angle = 50, hjust = 1))+ 
  geom_vline(xintercept = as.Date(c("2023-01-01", "2024-01-01", "2025-01-01", "2026-01
01")), 
             linetype = 2, 
             color = 2, 
             linewidth = 1)