Import stock prices

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

Plot stock prices

stocks %>%
    
    ggplot(aes(x = date, y = adjusted, color = symbol)) +
    geom_line()

# Apply the dyplr verbs you learned in chapter 5

Filter Rows

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

Arange 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 Columns

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

Add Columns

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

Summarize by Groups

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.