Provide major takeaways from Chapter 1 in 50 words # Reproducible Finance is a philosiphy about how to do quantitative, data science driven financial analysis. Data visualization translates numbers into shapes and colors so others can derive value from the information. One of R’s most powerful traits is its collection of packages that allows us to use smart R codes.

library(tidyverse)
library(tidyquant)

Stock Index

tq_index_options()
## [1] "DOW"       "DOWGLOBAL" "SP400"     "SP500"     "SP600"
data <- tq_index("SP400")

Stock Exchanges

tq_exchange_options()
## [1] "AMEX"   "NASDAQ" "NYSE"
data <- tq_exchange("NYSE")

tq_get

stock prices from yahoo finance

stock <- tq_get("TSLA")

Economic data from FRED

unemployment_nh <- tq_get("NHUR", get = "economic.data")
unemployment_nh
## # A tibble: 128 × 3
##    symbol date       price
##    <chr>  <date>     <dbl>
##  1 NHUR   2015-01-01   3.8
##  2 NHUR   2015-02-01   3.8
##  3 NHUR   2015-03-01   3.7
##  4 NHUR   2015-04-01   3.6
##  5 NHUR   2015-05-01   3.5
##  6 NHUR   2015-06-01   3.4
##  7 NHUR   2015-07-01   3.3
##  8 NHUR   2015-08-01   3.3
##  9 NHUR   2015-09-01   3.2
## 10 NHUR   2015-10-01   3.1
## # ℹ 118 more rows

Charting with Tidyquant

NVDA <- tq_get("NVDA")

Line Chart

NVDA %>%
    ggplot(aes(x = date, y = close)) +
    geom_line() +
    labs(title = "NVDA Line Chart", y = "Closing Price", x = "") +
    theme_tq()

Bar Chart

NVDA %>%
    ggplot(aes(x = date, y = close)) +
    geom_barchart(aes(open = open, high = high, low = low, close = close)) +
    labs(title = "NVDA Bar Chart", y = "Closing Price", x = "") +
    theme_tq()

Candlestick Chart

NVDA %>%
    tail(30) %>%
    ggplot(aes(x = date, y = close)) +
    geom_candlestick(aes(open = open, high = high, low = low, close = close)) +
    labs(title = "NVDA Candlestick Chart", y = "Closing Price", x = "") +
    theme_tq()

Performance Analysis with Tidyquant

Get stock pries and comvert to returns

Ra <- c("MSFT", "AMZN", "NVDA") %>%
    tq_get(get = "stock.price",
           from = "2022-01-01") %>%
    group_by(symbol) %>%
    tq_transmute(select = adjusted,
                 mutate_fun = periodReturn,
                 period = "monthly",
                 col_rename = "Ra")
Ra
## # A tibble: 135 × 3
## # Groups:   symbol [3]
##    symbol date             Ra
##    <chr>  <date>        <dbl>
##  1 MSFT   2022-01-31 -0.0710 
##  2 MSFT   2022-02-28 -0.0372 
##  3 MSFT   2022-03-31  0.0319 
##  4 MSFT   2022-04-29 -0.0999 
##  5 MSFT   2022-05-31 -0.0181 
##  6 MSFT   2022-06-30 -0.0553 
##  7 MSFT   2022-07-29  0.0931 
##  8 MSFT   2022-08-31 -0.0667 
##  9 MSFT   2022-09-30 -0.109  
## 10 MSFT   2022-10-31 -0.00331
## # ℹ 125 more rows

Get baseline and convert to returns

Rb <- ("^IXIC") %>%
    tq_get(get = "stock.price",
           from = "2022-01-01") %>%
    tq_transmute(select = adjusted,
                 mutate_fun = periodReturn,
                 period = "monthly",
                 col_rename = "Rb")
Rb
## # A tibble: 45 × 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
## # ℹ 35 more rows

Join the two tables

RaRb <- left_join(Ra, Rb, by = c("date" = "date"))
RaRb
## # A tibble: 135 × 4
## # Groups:   symbol [3]
##    symbol date             Ra      Rb
##    <chr>  <date>        <dbl>   <dbl>
##  1 MSFT   2022-01-31 -0.0710  -0.101 
##  2 MSFT   2022-02-28 -0.0372  -0.0343
##  3 MSFT   2022-03-31  0.0319   0.0341
##  4 MSFT   2022-04-29 -0.0999  -0.133 
##  5 MSFT   2022-05-31 -0.0181  -0.0205
##  6 MSFT   2022-06-30 -0.0553  -0.0871
##  7 MSFT   2022-07-29  0.0931   0.123 
##  8 MSFT   2022-08-31 -0.0667  -0.0464
##  9 MSFT   2022-09-30 -0.109   -0.105 
## 10 MSFT   2022-10-31 -0.00331  0.0390
## # ℹ 125 more rows

Calculate CAPM

RaRb_capm <- RaRb %>%
    group_by(symbol) %>%
    tq_performance(Ra = Ra,
                   Rb = Rb,
                   performance_fun = table.CAPM)
RaRb_capm
## # A tibble: 3 × 18
## # Groups:   symbol [3]
##   symbol ActivePremium   Alpha AlphaRobust AnnualizedAlpha  Beta `Beta-`
##   <chr>          <dbl>   <dbl>       <dbl>           <dbl> <dbl>   <dbl>
## 1 MSFT          0.0328  0.004       0.0027          0.0492 0.871   0.635
## 2 AMZN         -0.0148 -0.0018      0.0016         -0.0216 1.36    1.50 
## 3 NVDA          0.504   0.031       0.0281          0.442  2.12    2.87 
## # ℹ 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,
                   performance_fun = skewness)
RaRb_skewness
## # A tibble: 3 × 2
## # Groups:   symbol [3]
##   symbol skewness.1
##   <chr>       <dbl>
## 1 MSFT        0.275
## 2 AMZN        0.133
## 3 NVDA       -0.118

MSFT and AMZN have positive skewness while NVDA has a negative skewness. They are all relatively close to 0 but MSFT has the most positively skewed