Import stock prices
stocks <- tq_get(c("XOM", "CVX", "SHEL", "COP"),
get = "stock.prices",
from = "2016-01-01",
to = "2025-01-01")
stocks
## # A tibble: 9,056 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 XOM 2016-01-04 77.5 77.9 76.5 77.5 20400100 50.4
## 2 XOM 2016-01-05 77.2 78.1 76.9 78.1 11993500 50.9
## 3 XOM 2016-01-06 76.6 77.6 76.6 77.5 18826900 50.4
## 4 XOM 2016-01-07 76.1 78.0 75.9 76.2 21263800 49.6
## 5 XOM 2016-01-08 76.3 76.7 74.5 74.7 19033600 48.6
## 6 XOM 2016-01-11 75.0 75.1 72.6 73.7 21353000 48.0
## 7 XOM 2016-01-12 74.1 75.4 73.2 75.2 21864100 49.0
## 8 XOM 2016-01-13 75.8 77.1 74.9 75.7 26052700 49.2
## 9 XOM 2016-01-14 76.2 79.9 75.8 79.1 33806700 51.5
## 10 XOM 2016-01-15 76.3 78.2 76.3 77.6 28342100 50.5
## # ℹ 9,046 more rows
Apply dyplr verbs learned in chapter 5
Filter rows
stocks %>%
filter(close > 80)
## # A tibble: 4,280 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 XOM 2016-02-05 79.4 80.1 78.6 80.1 26719900 52.1
## 2 XOM 2016-02-08 79.3 81.8 78.9 81.2 26601200 52.8
## 3 XOM 2016-02-09 80.0 80.7 78.7 80.1 18418100 52.6
## 4 XOM 2016-02-12 80.1 81.1 79.8 81.0 16767200 53.2
## 5 XOM 2016-02-16 81.7 81.8 80.3 81.2 15912200 53.3
## 6 XOM 2016-02-17 81.7 82.8 81.2 82 17006700 53.9
## 7 XOM 2016-02-18 82.9 83.1 81.9 82.4 14873700 54.2
## 8 XOM 2016-02-19 82.2 82.6 80.9 82.5 13615900 54.2
## 9 XOM 2016-02-22 82.5 83.4 82.2 82.4 14595200 54.1
## 10 XOM 2016-02-23 82.0 82.4 80.9 81.2 11041600 53.4
## # ℹ 4,270 more rows
Arrange rows
stocks %>%
arrange(desc(volume))
## # A tibble: 9,056 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 XOM 2021-03-19 56.7 57.5 55.8 56.5 84439400 47.4
## 2 XOM 2020-03-13 40.0 40.1 35 38.1 79891500 29.5
## 3 XOM 2020-11-09 36.4 38.0 36.1 36.9 76879400 29.7
## 4 XOM 2020-03-20 34.8 35.2 31.6 32.7 76534600 25.4
## 5 XOM 2020-03-09 41.7 44.6 40.8 41.9 72896300 32.4
## 6 XOM 2022-03-08 89.1 91.5 85.4 87.8 72082300 77.7
## 7 XOM 2020-03-12 39.9 40.7 37 37.2 65725300 28.8
## 8 XOM 2022-03-09 84.0 86.6 81.6 82.8 65466700 73.3
## 9 XOM 2022-06-17 91.0 91.3 85.7 86.1 64610200 77.0
## 10 XOM 2020-02-28 48.8 51.4 48.0 51.4 62446700 39.8
## # ℹ 9,046 more rows
Select columns
stocks %>%
select(open:close)
## # A tibble: 9,056 × 4
## open high low close
## <dbl> <dbl> <dbl> <dbl>
## 1 77.5 77.9 76.5 77.5
## 2 77.2 78.1 76.9 78.1
## 3 76.6 77.6 76.6 77.5
## 4 76.1 78.0 75.9 76.2
## 5 76.3 76.7 74.5 74.7
## 6 75.0 75.1 72.6 73.7
## 7 74.1 75.4 73.2 75.2
## 8 75.8 77.1 74.9 75.7
## 9 76.2 79.9 75.8 79.1
## 10 76.3 78.2 76.3 77.6
## # ℹ 9,046 more rows
Add columns
stocks %>%
mutate(movement = volume * adjusted)
## # A tibble: 9,056 × 9
## symbol date open high low close volume adjusted movement
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 XOM 2016-01-04 77.5 77.9 76.5 77.5 20400100 50.4 1028624755.
## 2 XOM 2016-01-05 77.2 78.1 76.9 78.1 11993500 50.9 609895444.
## 3 XOM 2016-01-06 76.6 77.6 76.6 77.5 18826900 50.4 949422690.
## 4 XOM 2016-01-07 76.1 78.0 75.9 76.2 21263800 49.6 1055149642.
## 5 XOM 2016-01-08 76.3 76.7 74.5 74.7 19033600 48.6 925402285.
## 6 XOM 2016-01-11 75.0 75.1 72.6 73.7 21353000 48.0 1024270447.
## 7 XOM 2016-01-12 74.1 75.4 73.2 75.2 21864100 49.0 1070278154.
## 8 XOM 2016-01-13 75.8 77.1 74.9 75.7 26052700 49.2 1282947493.
## 9 XOM 2016-01-14 76.2 79.9 75.8 79.1 33806700 51.5 1741150283.
## 10 XOM 2016-01-15 76.3 78.2 76.3 77.6 28342100 50.5 1431294646.
## # ℹ 9,046 more rows
stocks %>%
transmute(movement = volume * adjusted)
## # A tibble: 9,056 × 1
## movement
## <dbl>
## 1 1028624755.
## 2 609895444.
## 3 949422690.
## 4 1055149642.
## 5 925402285.
## 6 1024270447.
## 7 1070278154.
## 8 1282947493.
## 9 1741150283.
## 10 1431294646.
## # ℹ 9,046 more rows
stocks %>%
mutate(prev_volume = lag(volume))
## # A tibble: 9,056 × 9
## symbol date open high low close volume adjusted prev_volume
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 XOM 2016-01-04 77.5 77.9 76.5 77.5 20400100 50.4 NA
## 2 XOM 2016-01-05 77.2 78.1 76.9 78.1 11993500 50.9 20400100
## 3 XOM 2016-01-06 76.6 77.6 76.6 77.5 18826900 50.4 11993500
## 4 XOM 2016-01-07 76.1 78.0 75.9 76.2 21263800 49.6 18826900
## 5 XOM 2016-01-08 76.3 76.7 74.5 74.7 19033600 48.6 21263800
## 6 XOM 2016-01-11 75.0 75.1 72.6 73.7 21353000 48.0 19033600
## 7 XOM 2016-01-12 74.1 75.4 73.2 75.2 21864100 49.0 21353000
## 8 XOM 2016-01-13 75.8 77.1 74.9 75.7 26052700 49.2 21864100
## 9 XOM 2016-01-14 76.2 79.9 75.8 79.1 33806700 51.5 26052700
## 10 XOM 2016-01-15 76.3 78.2 76.3 77.6 28342100 50.5 33806700
## # ℹ 9,046 more rows
stocks %>%
mutate(cumsum_volume = cumsum(volume))
## # A tibble: 9,056 × 9
## symbol date open high low close volume adjusted cumsum_volume
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 XOM 2016-01-04 77.5 77.9 76.5 77.5 20400100 50.4 20400100
## 2 XOM 2016-01-05 77.2 78.1 76.9 78.1 11993500 50.9 32393600
## 3 XOM 2016-01-06 76.6 77.6 76.6 77.5 18826900 50.4 51220500
## 4 XOM 2016-01-07 76.1 78.0 75.9 76.2 21263800 49.6 72484300
## 5 XOM 2016-01-08 76.3 76.7 74.5 74.7 19033600 48.6 91517900
## 6 XOM 2016-01-11 75.0 75.1 72.6 73.7 21353000 48.0 112870900
## 7 XOM 2016-01-12 74.1 75.4 73.2 75.2 21864100 49.0 134735000
## 8 XOM 2016-01-13 75.8 77.1 74.9 75.7 26052700 49.2 160787700
## 9 XOM 2016-01-14 76.2 79.9 75.8 79.1 33806700 51.5 194594400
## 10 XOM 2016-01-15 76.3 78.2 76.3 77.6 28342100 50.5 222936500
## # ℹ 9,046 more rows
Summarize with groups
stocks %>%
summarise(Avg_Open = mean(open, na.rm = TRUE))
## # A tibble: 1 × 1
## Avg_Open
## <dbl>
## 1 83.1
stocks %>%
group_by(symbol) %>%
summarise(Avg_Open = mean(open, na.rm = TRUE), Avg_High = mean(high, na.rm = TRUE), Avg_Low = mean(low, na.rm = TRUE), Avg_Close = mean(close, na.rm = TRUE)) %>%
arrange(Avg_Open)
## # A tibble: 4 × 5
## symbol Avg_Open Avg_High Avg_Low Avg_Close
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 SHEL 54.8 55.2 54.4 54.8
## 2 COP 71.8 72.7 70.8 71.8
## 3 XOM 82.0 82.7 81.2 82.0
## 4 CVX 124. 125. 123. 124.
stocks %>%
group_by(symbol) %>%
summarise(count = n(), Avg_Open = mean(open, na.rm = TRUE), Avg_High = mean(high, na.rm = TRUE), Avg_Low = mean(low, na.rm = TRUE), Avg_Close = mean(close, na.rm = TRUE)) %>%
ggplot(mapping = aes(x = symbol, y = Avg_Open)) +
geom_bar(stat = 'identity') + ggtitle("Average Open Price", subtitle = "By Corporation")

stocks %>%
filter(!is.na(open))
## # A tibble: 9,056 × 8
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 XOM 2016-01-04 77.5 77.9 76.5 77.5 20400100 50.4
## 2 XOM 2016-01-05 77.2 78.1 76.9 78.1 11993500 50.9
## 3 XOM 2016-01-06 76.6 77.6 76.6 77.5 18826900 50.4
## 4 XOM 2016-01-07 76.1 78.0 75.9 76.2 21263800 49.6
## 5 XOM 2016-01-08 76.3 76.7 74.5 74.7 19033600 48.6
## 6 XOM 2016-01-11 75.0 75.1 72.6 73.7 21353000 48.0
## 7 XOM 2016-01-12 74.1 75.4 73.2 75.2 21864100 49.0
## 8 XOM 2016-01-13 75.8 77.1 74.9 75.7 26052700 49.2
## 9 XOM 2016-01-14 76.2 79.9 75.8 79.1 33806700 51.5
## 10 XOM 2016-01-15 76.3 78.2 76.3 77.6 28342100 50.5
## # ℹ 9,046 more rows
stocks %>%
group_by(symbol, open) %>%
summarise(count = n()) %>%
ungroup()
## `summarise()` has grouped output by 'symbol'. You can override using the
## `.groups` argument.
## # A tibble: 7,400 × 3
## symbol open count
## <chr> <dbl> <int>
## 1 COP 23.1 1
## 2 COP 24.2 1
## 3 COP 26.4 1
## 4 COP 26.5 1
## 5 COP 26.8 1
## 6 COP 27.1 1
## 7 COP 27.5 1
## 8 COP 28.1 1
## 9 COP 28.5 1
## 10 COP 28.9 1
## # ℹ 7,390 more rows