# load packages
library(tidyverse)
library(tidyquant) 

1 Get stock prices and convert to returns

Ra <- c("NVDA", "AMD", "INTC") %>% 
  tq_get("stock.prices",
         from = "2022-01-01") %>%
  group_by("symbol") %>%
  tq_transmute(select = adjusted,
               mutate_fun = periodReturn,
               period = "monthly",
               col_rename = "Ra")
Ra
## # A tibble: 45 × 3
## # Groups:   "symbol" [1]
##    `"symbol"` date            Ra
##    <chr>      <date>       <dbl>
##  1 symbol     2022-01-31  0.506 
##  2 symbol     2022-02-28 -0.0155
##  3 symbol     2022-03-31  0.0390
##  4 symbol     2022-04-29 -0.120 
##  5 symbol     2022-05-31  0.0271
##  6 symbol     2022-06-30 -0.158 
##  7 symbol     2022-07-29 -0.0294
##  8 symbol     2022-08-31 -0.112 
##  9 symbol     2022-09-30 -0.193 
## 10 symbol     2022-10-31  0.103 
## # ℹ 35 more rows

2 Get basline and convert to returns

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

3 Join the two tables

RaRb <- left_join(Ra, Rb, by = c("date" = "date"))
RaRb
## # A tibble: 45 × 5
##    `"symbol".x` date            Ra `"symbol".y`      Rb
##    <chr>        <date>       <dbl> <chr>          <dbl>
##  1 symbol       2022-01-31  0.506  symbol       -0.101 
##  2 symbol       2022-02-28 -0.0155 symbol       -0.0343
##  3 symbol       2022-03-31  0.0390 symbol        0.0341
##  4 symbol       2022-04-29 -0.120  symbol       -0.133 
##  5 symbol       2022-05-31  0.0271 symbol       -0.0205
##  6 symbol       2022-06-30 -0.158  symbol       -0.0871
##  7 symbol       2022-07-29 -0.0294 symbol        0.123 
##  8 symbol       2022-08-31 -0.112  symbol       -0.0464
##  9 symbol       2022-09-30 -0.193  symbol       -0.105 
## 10 symbol       2022-10-31  0.103  symbol        0.0390
## # ℹ 35 more rows

4 Calculate CAPM

RaRb_capm <- RaRb %>% 
  tq_performance(Ra = Ra,
                 Rb = Rb,
                 performance_fun = table.CAPM)
RaRb_capm
## # A tibble: 1 × 17
##   ActivePremium  Alpha AlphaRobust AnnualizedAlpha  Beta `Beta-` `Beta-Robust`
##           <dbl>  <dbl>       <dbl>           <dbl> <dbl>   <dbl>         <dbl>
## 1       -0.0527 0.0086     -0.0215           0.108 0.754  -0.108         0.994
## # ℹ 10 more variables: `Beta+` <dbl>, `Beta+Robust` <dbl>, BetaRobust <dbl>,
## #   Correlation <dbl>, `Correlationp-value` <dbl>, InformationRatio <dbl>,
## #   `R-squared` <dbl>, `R-squaredRobust` <dbl>, TrackingError <dbl>,
## #   TreynorRatio <dbl>

Which stock has a posstivly skewed distribution of return

RaRb_skewness <- RaRb %>% 
  tq_performance(Ra = Ra,
                 Rb = Rb,
                 performance_fun = BetaCoSkewness)
RaRb_skewness
## # A tibble: 1 × 1
##   BetaCoSkewness.1
##              <dbl>
## 1           -0.102