# Load packages
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tidyquant)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo 
## ── Attaching core tidyquant packages ─────────────────────── tidyquant 1.0.11 ──
## ✔ PerformanceAnalytics 2.0.8      ✔ TTR                  0.24.4
## ✔ quantmod             0.4.28     ✔ xts                  0.14.1── Conflicts ────────────────────────────────────────── tidyquant_conflicts() ──
## ✖ zoo::as.Date()                 masks base::as.Date()
## ✖ zoo::as.Date.numeric()         masks base::as.Date.numeric()
## ✖ dplyr::filter()                masks stats::filter()
## ✖ xts::first()                   masks dplyr::first()
## ✖ dplyr::lag()                   masks stats::lag()
## ✖ xts::last()                    masks dplyr::last()
## ✖ PerformanceAnalytics::legend() masks graphics::legend()
## ✖ quantmod::summary()            masks base::summary()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

I chose the stocks Amazon, Microsoft, and Netflix and this is what I found:

symbols <- c("AMZN", "MSFT", "NFLX")
 
prices <- tq_get(x    = symbols,
                 get  = "stock.prices",
                 from = "2022-01-01",
                 to   = "2022-12-31")

Quarterly prices of Amazon, Microsoft and Netflix

asset_returns_tbl <- prices %>%
   
    group_by(symbol) %>%
    tq_transmute(select     = adjusted,
                 mutate_fun = periodReturn,
                 period     = "quarterly",
                 type       = "log") %>%
    ungroup () %>%
   
    set_names(c("asset", "date", "returns"))
 
asset_returns_tbl
## # A tibble: 12 × 3
##    asset date       returns
##    <chr> <date>       <dbl>
##  1 AMZN  2022-03-31 -0.0444
##  2 AMZN  2022-06-30 -0.428 
##  3 AMZN  2022-09-30  0.0620
##  4 AMZN  2022-12-30 -0.297 
##  5 MSFT  2022-03-31 -0.0802
##  6 MSFT  2022-06-30 -0.180 
##  7 MSFT  2022-09-30 -0.0957
##  8 MSFT  2022-12-30  0.0321
##  9 NFLX  2022-03-31 -0.467 
## 10 NFLX  2022-06-30 -0.762 
## 11 NFLX  2022-09-30  0.297 
## 12 NFLX  2022-12-30  0.225

Histogram Showing the Quarterly Returns in 2022

asset_returns_tbl %>%
   
    ggplot(aes(x = returns)) +
    geom_density(aes(color = asset), show.legend = FALSE, alpha = 1) +
    geom_histogram(aes(fill = asset), show.legend = FALSE, alpha = 0.3, binwidth = 0.01) +
    facet_wrap(~asset, ncol = 1) +
   
    # labeling
    labs(title = "Distribution of Quarterly  Returns, 2022",
         y = "Frequency",
         x = "Weight of Returns",
         caption = "A typical monthly return is higher for SPY and IJS than for AGG, EEM, and EFA.")

Interpretted plot

For the year of 2022, Microsoft had the highest return among Amazon and Netflix, sitting at a -27.8%, then Amazon was behind at -49.62% and then finally Netflix being -51.05%.