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