# Load packages

# Core
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.2     
## ── 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.12 ──
## ✔ PerformanceAnalytics 2.1.0      ✔ TTR                  0.24.4
## ✔ quantmod             0.4.29     ✔ xts                  0.14.2── 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

Goal

Take raw prices of five individual stocks and transform them into monthly returns five stocks: “SPY”, “EFA”, “IJS”, “EEM”, “AGG”

1 Import stock prices

# Choose Stocks
symbols <- c("SPY", "EFA", "IJS", "EEM", "AGG")

prices <- tq_get(
  x = symbols,
  get = "stock.prices",
  from = "2017-01-01",
  to = "2022-01-01")

2 Convert prices to returns

asset_returns_tbl <- prices %>%
    
     group_by(symbol) %>%
     tq_transmute(select = adjusted,
             mutate_fun  = periodReturn,
             period      = "monthly",
             type        = "log") %>%
    ungroup() %>%

    set_names(c("asset", "date", "returns"))

asset_returns_tbl
## # A tibble: 300 × 3
##    asset date       returns
##    <chr> <date>       <dbl>
##  1 SPY   2017-01-31 0.0101 
##  2 SPY   2017-02-28 0.0385 
##  3 SPY   2017-03-31 0.00125
##  4 SPY   2017-04-28 0.00988
##  5 SPY   2017-05-31 0.0140 
##  6 SPY   2017-06-30 0.00635
##  7 SPY   2017-07-31 0.0203 
##  8 SPY   2017-08-31 0.00291
##  9 SPY   2017-09-29 0.0199 
## 10 SPY   2017-10-31 0.0233 
## # ℹ 290 more rows

3 Make plot

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) +
    
    #labelling 
    labs(title = "distribution of monthly returns, 2017-2022",
         y     = "frequency",
         x     = "rate of returns",
         caption = "A typical mothly return is higher for SPY and IJS than for AGG, EEM, and EFA" )