Stocks from Home Depot, Lowe’s & COSTCO
stocks <- tq_get(c("HD", "LOW", "COST"),
get = "stock.prices",
from = "2018-01-01")
stocks
## # A tibble: 6,558 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 HD 2018-01-02 190. 191. 188. 188. 4684700 152.
## 2 HD 2018-01-03 188 189. 188. 189. 4530500 152.
## 3 HD 2018-01-04 190. 191. 188. 191. 4047400 154.
## 4 HD 2018-01-05 191. 193. 191. 192. 4224800 155.
## 5 HD 2018-01-08 192. 194. 192. 192. 3508500 155.
## 6 HD 2018-01-09 193. 193. 192. 193. 3012300 156.
## 7 HD 2018-01-10 193. 193. 192. 192. 3119500 155.
## 8 HD 2018-01-11 192. 195. 191. 195. 3899200 157.
## 9 HD 2018-01-12 196. 199. 195. 196. 6748400 158.
## 10 HD 2018-01-16 198. 199. 196. 196. 5692700 158.
## # ℹ 6,548 more rows
stocks %>%
ggplot(aes(x = date, y = adjusted, color = symbol)) +
geom_line()
filter(stocks, adjusted > 30)
## # A tibble: 6,558 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 HD 2018-01-02 190. 191. 188. 188. 4684700 152.
## 2 HD 2018-01-03 188 189. 188. 189. 4530500 152.
## 3 HD 2018-01-04 190. 191. 188. 191. 4047400 154.
## 4 HD 2018-01-05 191. 193. 191. 192. 4224800 155.
## 5 HD 2018-01-08 192. 194. 192. 192. 3508500 155.
## 6 HD 2018-01-09 193. 193. 192. 193. 3012300 156.
## 7 HD 2018-01-10 193. 193. 192. 192. 3119500 155.
## 8 HD 2018-01-11 192. 195. 191. 195. 3899200 157.
## 9 HD 2018-01-12 196. 199. 195. 196. 6748400 158.
## 10 HD 2018-01-16 198. 199. 196. 196. 5692700 158.
## # ℹ 6,548 more rows
filter(stocks, open < 188)
## # A tibble: 1,083 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 HD 2018-02-06 179. 192. 175. 191. 11682700 154.
## 2 HD 2018-02-09 183. 186 176. 184. 9059200 148.
## 3 HD 2018-02-12 187. 187. 183. 184. 6783700 148.
## 4 HD 2018-02-13 183. 184. 181. 184. 4273800 148.
## 5 HD 2018-02-14 182. 185. 181. 185. 6767000 149.
## 6 HD 2018-02-15 187. 187. 183. 185. 5113300 149.
## 7 HD 2018-02-16 185. 188. 185. 187. 7619200 151.
## 8 HD 2018-02-21 187. 188. 183. 183. 7527200 148.
## 9 HD 2018-02-22 184. 186. 183. 185. 5653900 149.
## 10 HD 2018-02-23 186. 188. 186. 188. 4315400 152.
## # ℹ 1,073 more rows
filter(stocks, close > 188)
## # A tibble: 5,471 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 HD 2018-01-02 190. 191. 188. 188. 4684700 152.
## 2 HD 2018-01-03 188 189. 188. 189. 4530500 152.
## 3 HD 2018-01-04 190. 191. 188. 191. 4047400 154.
## 4 HD 2018-01-05 191. 193. 191. 192. 4224800 155.
## 5 HD 2018-01-08 192. 194. 192. 192. 3508500 155.
## 6 HD 2018-01-09 193. 193. 192. 193. 3012300 156.
## 7 HD 2018-01-10 193. 193. 192. 192. 3119500 155.
## 8 HD 2018-01-11 192. 195. 191. 195. 3899200 157.
## 9 HD 2018-01-12 196. 199. 195. 196. 6748400 158.
## 10 HD 2018-01-16 198. 199. 196. 196. 5692700 158.
## # ℹ 5,461 more rows
arrange(stocks, desc(open), desc(date))
## # A tibble: 6,558 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 COST 2026-05-20 1089. 1090. 1072 1074. 2223400 1072.
## 2 COST 2026-05-19 1077 1096. 1072. 1094. 2853300 1093.
## 3 COST 2025-02-14 1076. 1077. 1068. 1072. 1410700 1063.
## 4 COST 2025-02-18 1069. 1071 1045. 1056. 2090600 1047.
## 5 COST 2025-02-13 1067. 1078. 1065. 1077. 1623300 1068.
## 6 COST 2026-05-21 1063. 1065. 1039. 1050. 2149700 1049.
## 7 COST 2025-02-11 1060. 1066 1049. 1058. 1748500 1049.
## 8 COST 2025-02-19 1056. 1063. 1053 1063. 1349600 1054.
## 9 COST 2025-06-04 1055 1058. 1049. 1052. 1422100 1044.
## 10 COST 2025-06-03 1054. 1067. 1043. 1056. 1992900 1048.
## # ℹ 6,548 more rows
select(stocks, open:close)
## # A tibble: 6,558 × 4
## open high low close
## <dbl> <dbl> <dbl> <dbl>
## 1 190. 191. 188. 188.
## 2 188 189. 188. 189.
## 3 190. 191. 188. 191.
## 4 191. 193. 191. 192.
## 5 192. 194. 192. 192.
## 6 193. 193. 192. 193.
## 7 193. 193. 192. 192.
## 8 192. 195. 191. 195.
## 9 196. 199. 195. 196.
## 10 198. 199. 196. 196.
## # ℹ 6,548 more rows
select(stocks, open, high, close)
## # A tibble: 6,558 × 3
## open high close
## <dbl> <dbl> <dbl>
## 1 190. 191. 188.
## 2 188 189. 189.
## 3 190. 191. 191.
## 4 191. 193. 192.
## 5 192. 194. 192.
## 6 193. 193. 193.
## 7 193. 193. 192.
## 8 192. 195. 195.
## 9 196. 199. 196.
## 10 198. 199. 196.
## # ℹ 6,548 more rows
select(stocks, open, high, close, low)
## # A tibble: 6,558 × 4
## open high close low
## <dbl> <dbl> <dbl> <dbl>
## 1 190. 191. 188. 188.
## 2 188 189. 189. 188.
## 3 190. 191. 191. 188.
## 4 191. 193. 192. 191.
## 5 192. 194. 192. 192.
## 6 193. 193. 193. 192.
## 7 193. 193. 192. 192.
## 8 192. 195. 195. 191.
## 9 196. 199. 196. 195.
## 10 198. 199. 196. 196.
## # ℹ 6,548 more rows
select(stocks, open, high, close, adjusted, volume)
## # A tibble: 6,558 × 5
## open high close adjusted volume
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 190. 191. 188. 152. 4684700
## 2 188 189. 189. 152. 4530500
## 3 190. 191. 191. 154. 4047400
## 4 191. 193. 192. 155. 4224800
## 5 192. 194. 192. 155. 3508500
## 6 193. 193. 193. 156. 3012300
## 7 193. 193. 192. 155. 3119500
## 8 192. 195. 195. 157. 3899200
## 9 196. 199. 196. 158. 6748400
## 10 198. 199. 196. 158. 5692700
## # ℹ 6,548 more rows
mutate(stocks,
gain = close - open) %>%
# Select date and gain
select(date, gain)
## # A tibble: 6,558 × 2
## date gain
## <date> <dbl>
## 1 2018-01-02 -2.18
## 2 2018-01-03 1.01
## 3 2018-01-04 0.640
## 4 2018-01-05 1.57
## 5 2018-01-08 0.320
## 6 2018-01-09 0.400
## 7 2018-01-10 -0.960
## 8 2018-01-11 3
## 9 2018-01-12 0.920
## 10 2018-01-16 -1.55
## # ℹ 6,548 more rows
# Just keep gain
mutate(stocks,
gain = close - open) %>%
# Select year, month, day, and gain
select(gain)
## # A tibble: 6,558 × 1
## gain
## <dbl>
## 1 -2.18
## 2 1.01
## 3 0.640
## 4 1.57
## 5 0.320
## 6 0.400
## 7 -0.960
## 8 3
## 9 0.920
## 10 -1.55
## # ℹ 6,548 more rows
# alternative using transmute()
transmute(stocks,
gain = close - open)
## # A tibble: 6,558 × 1
## gain
## <dbl>
## 1 -2.18
## 2 1.01
## 3 0.640
## 4 1.57
## 5 0.320
## 6 0.400
## 7 -0.960
## 8 3
## 9 0.920
## 10 -1.55
## # ℹ 6,548 more rows
# lag()
select(stocks, open) %>%
mutate(open_lag1 = lag(open))
## # A tibble: 6,558 × 2
## open open_lag1
## <dbl> <dbl>
## 1 190. NA
## 2 188 190.
## 3 190. 188
## 4 191. 190.
## 5 192. 191.
## 6 193. 192.
## 7 193. 193.
## 8 192. 193.
## 9 196. 192.
## 10 198. 196.
## # ℹ 6,548 more rows
# cumsum()
select(stocks, close) %>%
mutate(close_cumsum = cumsum(close))
## # A tibble: 6,558 × 2
## close close_cumsum
## <dbl> <dbl>
## 1 188. 188.
## 2 189. 377.
## 3 191. 568.
## 4 192. 760.
## 5 192. 952.
## 6 193. 1145.
## 7 192. 1337.
## 8 195. 1532.
## 9 196. 1728.
## 10 196. 1924.
## # ℹ 6,548 more rows
Collapsing data to a single row
stocks
## # A tibble: 6,558 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 HD 2018-01-02 190. 191. 188. 188. 4684700 152.
## 2 HD 2018-01-03 188 189. 188. 189. 4530500 152.
## 3 HD 2018-01-04 190. 191. 188. 191. 4047400 154.
## 4 HD 2018-01-05 191. 193. 191. 192. 4224800 155.
## 5 HD 2018-01-08 192. 194. 192. 192. 3508500 155.
## 6 HD 2018-01-09 193. 193. 192. 193. 3012300 156.
## 7 HD 2018-01-10 193. 193. 192. 192. 3119500 155.
## 8 HD 2018-01-11 192. 195. 191. 195. 3899200 157.
## 9 HD 2018-01-12 196. 199. 195. 196. 6748400 158.
## 10 HD 2018-01-16 198. 199. 196. 196. 5692700 158.
## # ℹ 6,548 more rows
# average volume
summarise(stocks, volume = mean(volume, na.rm = TRUE))
## # A tibble: 1 × 1
## volume
## <dbl>
## 1 3377965.
Summarize by group
stocks %>%
# Group by ticker
group_by(symbol) %>%
# Calculate average volume
summarise(volume = mean(volume, na.rm = TRUE)) %>%
# Sort it
arrange(volume)
## # A tibble: 3 × 2
## symbol volume
## <chr> <dbl>
## 1 COST 2236694.
## 2 LOW 3788860.
## 3 HD 4108340.
Show gap between prices
stocks %>%
mutate(gap = low - high) %>%
group_by(gap) %>%
summarise(count = n(),
lowest = mean(low, na.rm = TRUE),
highest = mean(high, na.rm = TRUE)) %>%
# Plot
ggplot(mapping = aes(x = lowest, y = highest)) +
geom_point(aes(size = count), alpha = 0.3) +
geom_smooth(se = FALSE)
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
Missing Values
stocks %>%
# Remove missing values
filter(!is.na(volume))
## # A tibble: 6,558 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 HD 2018-01-02 190. 191. 188. 188. 4684700 152.
## 2 HD 2018-01-03 188 189. 188. 189. 4530500 152.
## 3 HD 2018-01-04 190. 191. 188. 191. 4047400 154.
## 4 HD 2018-01-05 191. 193. 191. 192. 4224800 155.
## 5 HD 2018-01-08 192. 194. 192. 192. 3508500 155.
## 6 HD 2018-01-09 193. 193. 192. 193. 3012300 156.
## 7 HD 2018-01-10 193. 193. 192. 192. 3119500 155.
## 8 HD 2018-01-11 192. 195. 191. 195. 3899200 157.
## 9 HD 2018-01-12 196. 199. 195. 196. 6748400 158.
## 10 HD 2018-01-16 198. 199. 196. 196. 5692700 158.
## # ℹ 6,548 more rows
grouping by multiple variables
stocks %>%
group_by(open, close, high, low) %>%
summarise(count = n()) %>%
ungroup()
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by open, close, high, and low.
## ℹ Output is grouped by open, close, and high.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(open, close, high, low))` for per-operation grouping
## (`?dplyr::dplyr_by`) instead.
## # A tibble: 6,558 × 5
## open close high low count
## <dbl> <dbl> <dbl> <dbl> <int>
## 1 64.4 69.9 73.2 60 1
## 2 65.2 67.8 69.1 63.0 1
## 3 68.5 65.0 70.1 61 1
## 4 72.2 66.4 73.0 65.5 1
## 5 72.8 77.3 77.6 72.1 1
## 6 73.6 73.8 75.6 64.2 1
## 7 79.8 82.9 83.3 79.2 1
## 8 80.1 83.7 87.0 78.3 1
## 9 80.7 80.4 83.9 79.1 1
## 10 81.8 83.0 83.0 81.2 1
## # ℹ 6,548 more rows