stocks <- tq_get(c("JPM", "GS", "SOFI"),
get = "stock.prices",
from = "2020-01-01")
stocks
## # A tibble: 4,799 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 JPM 2020-01-02 140. 141. 139. 141. 10803700 118.
## 2 JPM 2020-01-03 138. 139. 137. 138. 10386800 116.
## 3 JPM 2020-01-06 137. 138. 136. 138. 10259000 116.
## 4 JPM 2020-01-07 137. 138. 136. 136. 10531300 114.
## 5 JPM 2020-01-08 136. 138. 136. 137. 9695300 115.
## 6 JPM 2020-01-09 138. 138. 137. 137. 9469000 116.
## 7 JPM 2020-01-10 137. 137. 136. 136. 10190900 114.
## 8 JPM 2020-01-13 136. 137. 136. 137. 12355200 115.
## 9 JPM 2020-01-14 138. 141. 138. 139. 24906000 117.
## 10 JPM 2020-01-15 138. 139. 136. 137. 16293400 115.
## # ℹ 4,789 more rows
stocks %>%
ggplot(aes(x = date, y = adjusted, color = symbol)) +
geom_line()
# Apply the dyplr verbs you learned in chapter 5
stocks %>% filter(adjusted > 24)
## # A tibble: 3,485 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 JPM 2020-01-02 140. 141. 139. 141. 10803700 118.
## 2 JPM 2020-01-03 138. 139. 137. 138. 10386800 116.
## 3 JPM 2020-01-06 137. 138. 136. 138. 10259000 116.
## 4 JPM 2020-01-07 137. 138. 136. 136. 10531300 114.
## 5 JPM 2020-01-08 136. 138. 136. 137. 9695300 115.
## 6 JPM 2020-01-09 138. 138. 137. 137. 9469000 116.
## 7 JPM 2020-01-10 137. 137. 136. 136. 10190900 114.
## 8 JPM 2020-01-13 136. 137. 136. 137. 12355200 115.
## 9 JPM 2020-01-14 138. 141. 138. 139. 24906000 117.
## 10 JPM 2020-01-15 138. 139. 136. 137. 16293400 115.
## # ℹ 3,475 more rows
stocks %>% filter(symbol == "GS")
## # A tibble: 1,684 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 GS 2020-01-02 231 235. 230. 234. 3736300 200.
## 2 GS 2020-01-03 232. 233. 230. 232. 2274500 198.
## 3 GS 2020-01-06 230. 234. 229. 234. 3329300 200.
## 4 GS 2020-01-07 235 238. 235. 235. 5255200 201.
## 5 GS 2020-01-08 236. 240. 235. 238. 3564700 203.
## 6 GS 2020-01-09 241. 243. 240. 243. 3980700 207.
## 7 GS 2020-01-10 243. 243. 241. 242. 2248100 207.
## 8 GS 2020-01-13 244. 246. 243 245. 3359200 210.
## 9 GS 2020-01-14 245. 249. 245. 246. 4302800 210.
## 10 GS 2020-01-15 242 250. 239. 245. 5411200 210.
## # ℹ 1,674 more rows
stocks %>% filter(adjusted > 100)
## # A tibble: 3,175 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 JPM 2020-01-02 140. 141. 139. 141. 10803700 118.
## 2 JPM 2020-01-03 138. 139. 137. 138. 10386800 116.
## 3 JPM 2020-01-06 137. 138. 136. 138. 10259000 116.
## 4 JPM 2020-01-07 137. 138. 136. 136. 10531300 114.
## 5 JPM 2020-01-08 136. 138. 136. 137. 9695300 115.
## 6 JPM 2020-01-09 138. 138. 137. 137. 9469000 116.
## 7 JPM 2020-01-10 137. 137. 136. 136. 10190900 114.
## 8 JPM 2020-01-13 136. 137. 136. 137. 12355200 115.
## 9 JPM 2020-01-14 138. 141. 138. 139. 24906000 117.
## 10 JPM 2020-01-15 138. 139. 136. 137. 16293400 115.
## # ℹ 3,165 more rows
stocks %>% filter(symbol == "JPM" & adjusted > 150)
## # A tibble: 708 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 JPM 2021-10-06 168. 169. 166 169. 8692600 150.
## 2 JPM 2021-10-07 171. 172. 170. 170. 10195400 151.
## 3 JPM 2021-10-08 170. 171. 169. 170. 8190100 151.
## 4 JPM 2021-10-20 168. 171. 167. 171. 8185600 152.
## 5 JPM 2021-10-21 171. 171. 169. 170. 8415200 150.
## 6 JPM 2021-10-22 170. 172. 170. 172. 8817900 152.
## 7 JPM 2021-10-25 173. 173. 170. 171. 10159200 152.
## 8 JPM 2021-10-26 171 172. 171. 171. 8015100 152.
## 9 JPM 2021-10-28 168. 171. 168. 170. 7212900 151.
## 10 JPM 2021-10-29 171. 172. 169. 170. 8140100 151.
## # ℹ 698 more rows
stocks %>% filter(symbol == "GS" | symbol == "JPM")
## # A tibble: 3,368 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 JPM 2020-01-02 140. 141. 139. 141. 10803700 118.
## 2 JPM 2020-01-03 138. 139. 137. 138. 10386800 116.
## 3 JPM 2020-01-06 137. 138. 136. 138. 10259000 116.
## 4 JPM 2020-01-07 137. 138. 136. 136. 10531300 114.
## 5 JPM 2020-01-08 136. 138. 136. 137. 9695300 115.
## 6 JPM 2020-01-09 138. 138. 137. 137. 9469000 116.
## 7 JPM 2020-01-10 137. 137. 136. 136. 10190900 114.
## 8 JPM 2020-01-13 136. 137. 136. 137. 12355200 115.
## 9 JPM 2020-01-14 138. 141. 138. 139. 24906000 117.
## 10 JPM 2020-01-15 138. 139. 136. 137. 16293400 115.
## # ℹ 3,358 more rows
arrange(stocks, desc(date))
## # A tibble: 4,799 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 JPM 2026-09-15 351 355. 343. 352. 14026500 352.
## 2 GS 2026-09-15 985. 988. 954. 977. 2355200 977.
## 3 SOFI 2026-09-15 17.5 17.6 16.9 17.1 50242400 17.1
## 4 JPM 2026-09-14 354. 355. 348. 350. 9609900 350.
## 5 GS 2026-09-14 1010 1014. 979. 988. 2206600 988.
## 6 SOFI 2026-09-14 17.0 17.8 17 17.6 33181800 17.6
## 7 JPM 2026-09-11 358. 360. 355. 356. 5354600 356.
## 8 GS 2026-09-11 1035. 1043. 1019. 1029. 1163000 1029.
## 9 SOFI 2026-09-11 17.3 17.5 17.1 17.3 24556600 17.3
## 10 JPM 2026-09-10 354. 354. 351. 354. 4184200 354.
## # ℹ 4,789 more rows
select(stocks, symbol, date, close)
## # A tibble: 4,799 × 3
## symbol date close
## <chr> <date> <dbl>
## 1 JPM 2020-01-02 141.
## 2 JPM 2020-01-03 138.
## 3 JPM 2020-01-06 138.
## 4 JPM 2020-01-07 136.
## 5 JPM 2020-01-08 137.
## 6 JPM 2020-01-09 137.
## 7 JPM 2020-01-10 136.
## 8 JPM 2020-01-13 137.
## 9 JPM 2020-01-14 139.
## 10 JPM 2020-01-15 137.
## # ℹ 4,789 more rows
stocks %>%
mutate(daily_price_diff = open - close) %>%
select(symbol, date, daily_price_diff)
## # A tibble: 4,799 × 3
## symbol date daily_price_diff
## <chr> <date> <dbl>
## 1 JPM 2020-01-02 -1.30
## 2 JPM 2020-01-03 -0.840
## 3 JPM 2020-01-06 -1.67
## 4 JPM 2020-01-07 1.40
## 5 JPM 2020-01-08 -1.24
## 6 JPM 2020-01-09 0.610
## 7 JPM 2020-01-10 1.14
## 8 JPM 2020-01-13 -1.01
## 9 JPM 2020-01-14 -0.860
## 10 JPM 2020-01-15 1.13
## # ℹ 4,789 more rows
# Calculate the overnight gap using lag()
stocks %>%
mutate(prev_close = lag(close),
overnight_gap = open - prev_close) %>%
select(symbol, date, close, prev_close, open, overnight_gap)
## # A tibble: 4,799 × 6
## symbol date close prev_close open overnight_gap
## <chr> <date> <dbl> <dbl> <dbl> <dbl>
## 1 JPM 2020-01-02 141. NA 140. NA
## 2 JPM 2020-01-03 138. 141. 138. -3.59
## 3 JPM 2020-01-06 138. 138. 137. -1.78
## 4 JPM 2020-01-07 136. 138. 137. -0.950
## 5 JPM 2020-01-08 137. 136. 136. -0.180
## 6 JPM 2020-01-09 137. 137. 138. 1.11
## 7 JPM 2020-01-10 136. 137. 137. -0.230
## 8 JPM 2020-01-13 137. 136. 136. 0.120
## 9 JPM 2020-01-14 139. 137. 138. 0.740
## 10 JPM 2020-01-15 137. 139. 138. -0.950
## # ℹ 4,789 more rows
## cumsum
stocks %>%
mutate(cumulative_volume = cumsum(volume)) %>%
select(symbol, date, volume, cumulative_volume)
## # A tibble: 4,799 × 4
## symbol date volume cumulative_volume
## <chr> <date> <dbl> <dbl>
## 1 JPM 2020-01-02 10803700 10803700
## 2 JPM 2020-01-03 10386800 21190500
## 3 JPM 2020-01-06 10259000 31449500
## 4 JPM 2020-01-07 10531300 41980800
## 5 JPM 2020-01-08 9695300 51676100
## 6 JPM 2020-01-09 9469000 61145100
## 7 JPM 2020-01-10 10190900 71336000
## 8 JPM 2020-01-13 12355200 83691200
## 9 JPM 2020-01-14 24906000 108597200
## 10 JPM 2020-01-15 16293400 124890600
## # ℹ 4,789 more rows
stocks %>%
# Group by stock symbol
group_by(symbol) %>%
# Calculate average adjusted price
summarise(avg_price = mean(adjusted, na.rm = TRUE)) %>%
# Sort it
arrange(avg_price)
## # A tibble: 3 × 2
## symbol avg_price
## <chr> <dbl>
## 1 SOFI 13.1
## 2 JPM 175.
## 3 GS 433.