Import stock prices

stocks <- tq_get(c("SOXX", "TKR", "VTV" ),
                 get = "stock.prices",
                 from = "2026-01-01",
                 to = "2026-09-01")
stocks
## # A tibble: 498 × 8
##    symbol date        open  high   low close  volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
##  1 SOXX   2026-01-02  309.  316.  309.  314. 8491300     313.
##  2 SOXX   2026-01-05  321.  323.  317.  318. 7923200     318.
##  3 SOXX   2026-01-06  322.  329.  322   328. 7579900     328.
##  4 SOXX   2026-01-07  325.  326.  322.  325. 4528500     325.
##  5 SOXX   2026-01-08  324.  324.  316.  320. 5408300     319.
##  6 SOXX   2026-01-09  323.  331.  321.  329. 7323100     328.
##  7 SOXX   2026-01-12  326.  331.  326.  330. 5159600     330.
##  8 SOXX   2026-01-13  333.  336.  332.  333. 3835900     333.
##  9 SOXX   2026-01-14  331.  332.  327.  332. 5468900     332.
## 10 SOXX   2026-01-15  343.  345.  337.  337. 6531500     337.
## # ℹ 488 more rows

Plot stock prices

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

Apply the dplyr verbs you learned in chapter 5

Filter rows

stocks %>% filter(adjusted > 100)
## # A tibble: 458 × 8
##    symbol date        open  high   low close  volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
##  1 SOXX   2026-01-02  309.  316.  309.  314. 8491300     313.
##  2 SOXX   2026-01-05  321.  323.  317.  318. 7923200     318.
##  3 SOXX   2026-01-06  322.  329.  322   328. 7579900     328.
##  4 SOXX   2026-01-07  325.  326.  322.  325. 4528500     325.
##  5 SOXX   2026-01-08  324.  324.  316.  320. 5408300     319.
##  6 SOXX   2026-01-09  323.  331.  321.  329. 7323100     328.
##  7 SOXX   2026-01-12  326.  331.  326.  330. 5159600     330.
##  8 SOXX   2026-01-13  333.  336.  332.  333. 3835900     333.
##  9 SOXX   2026-01-14  331.  332.  327.  332. 5468900     332.
## 10 SOXX   2026-01-15  343.  345.  337.  337. 6531500     337.
## # ℹ 448 more rows

Arrange rows

stocks %>% arrange(desc(volume))
## # A tibble: 498 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 SOXX   2026-06-09  585.  589.  522.  562. 24548100     562.
##  2 SOXX   2026-06-05  578.  580.  540.  540. 22377300     540.
##  3 SOXX   2026-07-29  489.  496.  464.  465  18817200     465 
##  4 SOXX   2026-03-03  338.  339.  331.  335. 17946100     334.
##  5 SOXX   2026-07-30  492.  510.  488.  505. 17477800     505.
##  6 SOXX   2026-06-10  552.  573.  539.  542. 16672200     541.
##  7 SOXX   2026-07-02  601.  608.  555.  566. 16092600     566.
##  8 SOXX   2026-07-17  509.  533.  499.  522. 15576800     522.
##  9 SOXX   2026-02-04  342.  345.  323.  330. 15231400     330.
## 10 SOXX   2026-07-28  497.  498.  480.  491. 14904200     491.
## # ℹ 488 more rows

Select columns

stocks %>% 
    group_by(symbol) %>%
    slice_max(date, n = 1) %>%
    ungroup() %>%
    select(symbol, open:close)
## # A tibble: 3 × 5
##   symbol  open  high   low close
##   <chr>  <dbl> <dbl> <dbl> <dbl>
## 1 SOXX    510.  514.  507.  511.
## 2 TKR     121.  122.  119.  120.
## 3 VTV     225.  225.  224.  225.

Add columns

stocks %>%
    group_by(symbol) %>%
    mutate(daily_return = (close - lag(close)) / lag(close )) %>%
    ungroup()
## # A tibble: 498 × 9
##    symbol date        open  high   low close  volume adjusted daily_return
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>        <dbl>
##  1 SOXX   2026-01-02  309.  316.  309.  314. 8491300     313.     NA      
##  2 SOXX   2026-01-05  321.  323.  317.  318. 7923200     318.      0.0139 
##  3 SOXX   2026-01-06  322.  329.  322   328. 7579900     328.      0.0324 
##  4 SOXX   2026-01-07  325.  326.  322.  325. 4528500     325.     -0.0105 
##  5 SOXX   2026-01-08  324.  324.  316.  320. 5408300     319.     -0.0163 
##  6 SOXX   2026-01-09  323.  331.  321.  329. 7323100     328.      0.0288 
##  7 SOXX   2026-01-12  326.  331.  326.  330. 5159600     330.      0.00478
##  8 SOXX   2026-01-13  333.  336.  332.  333. 3835900     333.      0.00893
##  9 SOXX   2026-01-14  331.  332.  327.  332. 5468900     332.     -0.00420
## 10 SOXX   2026-01-15  343.  345.  337.  337. 6531500     337.      0.0160 
## # ℹ 488 more rows

Summarize with groups

stocks %>%
    group_by(symbol) %>%
    mutate(daily_return = (close - lag(close)) / lag(close)) %>%
    summarise(
        avg_daily_return = mean(daily_return, na.rm = TRUE),
        total_return = (last(close) - first(close)) / first(close),
        volatility = sd(daily_return, na.rm = TRUE)

    )
## # A tibble: 3 × 4
##   symbol avg_daily_return total_return volatility
##   <chr>             <dbl>        <dbl>      <dbl>
## 1 SOXX           0.00347         0.629    0.0319 
## 2 TKR            0.00229         0.396    0.0232 
## 3 VTV            0.000955        0.166    0.00672