# Load packages
library(tidyverse)
library(tidyquant) 

1 Get stock prices and convert to returns

Ra <- c("AAPL", "ROKU", "CL=F") %>%
  tq_get(get  = "stock.prices",
         from = "2022-01-01") %>%
  group_by(symbol) %>%
  tq_transmute(select     = adjusted,
               mutate_fun = periodReturn,
               perio      = "monthly",
               col_rename = "Ra")
Ra
## # A tibble: 63 × 3
## # Groups:   symbol [3]
##    symbol date            Ra
##    <chr>  <date>       <dbl>
##  1 AAPL   2022-01-31 -0.0397
##  2 AAPL   2022-02-28 -0.0541
##  3 AAPL   2022-03-31  0.0575
##  4 AAPL   2022-04-29 -0.0971
##  5 AAPL   2022-05-31 -0.0545
##  6 AAPL   2022-06-30 -0.0814
##  7 AAPL   2022-07-29  0.189 
##  8 AAPL   2022-08-31 -0.0312
##  9 AAPL   2022-09-30 -0.121 
## 10 AAPL   2022-10-31  0.110 
## # ℹ 53 more rows

2 Get baseline and convert to returns

Rb <- "^IXIC" %>%
  tq_get(get  = "stock.prices",
         from = "2022-01-01") %>%
  tq_transmute(select    = adjusted,
              mutate_fun = periodReturn,
              period     = "monthly",
              col_rename = "Rb")
Rb
## # A tibble: 21 × 2
##    date            Rb
##    <date>       <dbl>
##  1 2022-01-31 -0.101 
##  2 2022-02-28 -0.0343
##  3 2022-03-31  0.0341
##  4 2022-04-29 -0.133 
##  5 2022-05-31 -0.0205
##  6 2022-06-30 -0.0871
##  7 2022-07-29  0.123 
##  8 2022-08-31 -0.0464
##  9 2022-09-30 -0.105 
## 10 2022-10-31  0.0390
## # ℹ 11 more rows

3 Join the two tables

RaRb <- left_join(Ra, Rb, by = c("date" = "date"))
RaRb
## # A tibble: 63 × 4
## # Groups:   symbol [3]
##    symbol date            Ra      Rb
##    <chr>  <date>       <dbl>   <dbl>
##  1 AAPL   2022-01-31 -0.0397 -0.101 
##  2 AAPL   2022-02-28 -0.0541 -0.0343
##  3 AAPL   2022-03-31  0.0575  0.0341
##  4 AAPL   2022-04-29 -0.0971 -0.133 
##  5 AAPL   2022-05-31 -0.0545 -0.0205
##  6 AAPL   2022-06-30 -0.0814 -0.0871
##  7 AAPL   2022-07-29  0.189   0.123 
##  8 AAPL   2022-08-31 -0.0312 -0.0464
##  9 AAPL   2022-09-30 -0.121  -0.105 
## 10 AAPL   2022-10-31  0.110   0.0390
## # ℹ 53 more rows

4 Calculate CAPM

RaRb_capm <- RaRb %>%
  tq_performance(Ra = Ra,
                 Rb = Rb,
                 performance_fun = table.CAPM)
RaRb_capm
## # A tibble: 3 × 13
## # Groups:   symbol [3]
##   symbol ActivePremium   Alpha AnnualizedAlpha   Beta `Beta-` `Beta+`
##   <chr>          <dbl>   <dbl>           <dbl>  <dbl>   <dbl>   <dbl>
## 1 AAPL          0.0733  0.0078           0.098  1.08    0.718   1.28 
## 2 ROKU         -0.403  -0.0267          -0.277  1.68    2.50    0.797
## 3 CL=F          0.191   0.0107           0.136 -0.122   0.239  -0.912
## # ℹ 6 more variables: Correlation <dbl>, `Correlationp-value` <dbl>,
## #   InformationRatio <dbl>, `R-squared` <dbl>, TrackingError <dbl>,
## #   TreynorRatio <dbl>

Which stock has a positively skewed distribution of return?

RaRb_capm <- RaRb %>%
  tq_performance(Ra = Ra,
                 Rb = NULL,
                 performance_fun = skewness)
RaRb_capm
## # A tibble: 3 × 2
## # Groups:   symbol [3]
##   symbol skewness.1
##   <chr>       <dbl>
## 1 AAPL        0.416
## 2 ROKU        1.09 
## 3 CL=F        0.139

All of my stocks, which are Apple, Roku, and Crude Oil, had a positively skewed distribution of return.

Which of my stock(s) beat the market in 2022?

Apple and Crude Oil Nov 23 beat the market in 2022, while Roku failed to beat the market.