knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)

1. Get Stock Prices and Convert to Returns

Ra <- c("FNV", "WPM", "NEM", "CCJ", "CEG", "BWXT", "NVDA", "TSM", "ASML", "CAT", "ITW", "HON", "PLD", "EQIX", "PSA", "TPL", "XOM", "CVX") %>%
    tq_get(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: 1,026 × 3
## # Groups:   symbol [18]
##    symbol date             Ra
##    <chr>  <date>        <dbl>
##  1 FNV    2022-01-31 -0.0280 
##  2 FNV    2022-02-28  0.112  
##  3 FNV    2022-03-31  0.0865 
##  4 FNV    2022-04-29 -0.0524 
##  5 FNV    2022-05-31 -0.0602 
##  6 FNV    2022-06-30 -0.0716 
##  7 FNV    2022-07-29 -0.0274 
##  8 FNV    2022-08-31 -0.0608 
##  9 FNV    2022-09-30 -0.00338
## 10 FNV    2022-10-31  0.0343 
## # ℹ 1,016 more rows

2. Get Baseline and Convert to Returns

Rb <- c("^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: 57 × 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
## # ℹ 47 more rows

3. Join the Two Tables

RaRb <- left_join(Ra, Rb, by = c("date" = "date"))
RaRb
## # A tibble: 1,026 × 4
## # Groups:   symbol [18]
##    symbol date             Ra      Rb
##    <chr>  <date>        <dbl>   <dbl>
##  1 FNV    2022-01-31 -0.0280  -0.101 
##  2 FNV    2022-02-28  0.112   -0.0343
##  3 FNV    2022-03-31  0.0865   0.0341
##  4 FNV    2022-04-29 -0.0524  -0.133 
##  5 FNV    2022-05-31 -0.0602  -0.0205
##  6 FNV    2022-06-30 -0.0716  -0.0871
##  7 FNV    2022-07-29 -0.0274   0.123 
##  8 FNV    2022-08-31 -0.0608  -0.0464
##  9 FNV    2022-09-30 -0.00338 -0.105 
## 10 FNV    2022-10-31  0.0343   0.0390
## # ℹ 1,016 more rows

4. Calculate CAPM

RaRb_capm <- RaRb %>%
    tq_performance(Ra = Ra,
                   Rb = Rb,
                   performance_fun = table.CAPM)
RaRb_capm
## # A tibble: 18 × 18
## # Groups:   symbol [18]
##    symbol ActivePremium   Alpha AlphaRobust AnnualizedAlpha    Beta `Beta-`
##    <chr>          <dbl>   <dbl>       <dbl>           <dbl>   <dbl>   <dbl>
##  1 FNV           0.047   0.0153      0.0132          0.200   0.112    0.468
##  2 WPM           0.209   0.0262      0.0204          0.364   0.268    0.633
##  3 NEM           0.0769  0.0189      0.0178          0.251   0.220    0.177
##  4 CCJ           0.229   0.0215      0.0179          0.291   1.06     1.03 
##  5 CEG           0.358   0.0333      0.026           0.482   0.703   -0.165
##  6 BWXT          0.163   0.0187      0.0159          0.249   0.523    0.406
##  7 NVDA          0.410   0.0248      0.0174          0.341   1.92     2.61 
##  8 TSM           0.198   0.0151      0.01            0.197   1.24     1.24 
##  9 ASML          0.0661  0.0064     -0.0096          0.0797  1.37     1.16 
## 10 CAT           0.240   0.0204      0.0155          0.274   1.03     0.642
## 11 ITW          -0.0698  0.0004     -0.0023          0.0051  0.487    0.843
## 12 HON          -0.0916 -0.0007     -0.007          -0.0084  0.449    0.239
## 13 PLD          -0.127  -0.0064     -0.0019         -0.074   0.824    0.532
## 14 EQIX         -0.0504  0.0001     -0.0057          0.001   0.717    0.810
## 15 PSA          -0.113  -0.0033     -0.0056         -0.0394  0.542    0.281
## 16 TPL           0.112   0.0263      0.0101          0.366   0.0781   1.80 
## 17 XOM           0.148   0.0238      0.0139          0.326  -0.132    0.029
## 18 CVX           0.0569  0.0155      0.0167          0.203   0.107    0.392
## # ℹ 11 more variables: `Beta-Robust` <dbl>, `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 Positively Skewed Distribution of Returns?

RaRb_skewness <- RaRb %>%
    tq_performance(Ra = Ra,
                   Rb = NULL,
                   performance_fun = skewness)
RaRb_skewness
## # A tibble: 18 × 2
## # Groups:   symbol [18]
##    symbol skewness.1
##    <chr>       <dbl>
##  1 FNV        0.515 
##  2 WPM        0.466 
##  3 NEM        0.0452
##  4 CCJ        0.431 
##  5 CEG        0.563 
##  6 BWXT       0.237 
##  7 NVDA      -0.0392
##  8 TSM        0.353 
##  9 ASML       0.410 
## 10 CAT        0.255 
## 11 ITW        0.432 
## 12 HON        0.754 
## 13 PLD       -0.354 
## 14 EQIX       0.358 
## 15 PSA        0.347 
## 16 TPL        0.868 
## 17 XOM        0.583 
## 18 CVX        0.0823

The Following Stocks Have Positive Skewness: FNV, WPM, NEM, CCJ, CEG, BWXT, TSM, ASML, CAT, ITW, HON, EQIX, PSA, TPL, XOM, and CVX. This means that those 16 stocks, on average, take on more gains then losses each year.