# Load packages

# Core
library(tidyverse)
library(tidyquant)

1 Import stock prices

symbols <- c("LULU", "NKE","UA") 
prices <- tq_get(x    = symbols, 
                 get = "stock.prices",
                 from = "2012-12-31",
                 to   = "2017-12-31")

2 Convert prices to returns (monthly)

asset_returns_tbl <- prices %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted,
                 mutate_fun = periodReturn, 
                 period     = "monthly",
                 type       = "log") %>%
    slice(-1) %>%
    ungroup() %>%
set_names(c("asset", "date", "returns"))

3 Assign weight

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "LULU" "NKE"  "UA"
# weights
weights <- c(0.35, 0.45, 0.2)
weights
## [1] 0.35 0.45 0.20
w_tbl <- tibble(symbols, weights)
w_tbl 
## # A tibble: 3 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 LULU       0.35
## 2 NKE        0.45
## 3 UA         0.2

4 Build a portfolio

# ?tq_portfolio
portfolio_returns_tbl <- asset_returns_tbl %>%
    
    tq_portfolio(assets_col = asset,
                 returns_col = returns,
                 weights = w_tbl, 
                 rebalance_on = "months")
portfolio_returns_tbl
## # A tibble: 60 × 2
##    date       portfolio.returns
##    <date>                 <dbl>
##  1 2013-01-31         -0.0140  
##  2 2013-02-28         -0.00489 
##  3 2013-03-28          0.0107  
##  4 2013-04-30          0.104   
##  5 2013-05-31         -0.00480 
##  6 2013-06-28         -0.0458  
##  7 2013-07-31          0.0157  
##  8 2013-08-30          0.00711 
##  9 2013-09-30          0.0765  
## 10 2013-10-31         -0.000965
## # ℹ 50 more rows

5.1 Get market returns

market_returns_tbl <-tq_get(x = "SPY",
       get = "stock.prices",
       from = "2012-12-31",
       to = "2017-12-31") %>%
    # Convert prices to returns
    tq_transmute(select = adjusted,
                 mutate_fun = periodReturn,
                 period = "monthly",
                 type = "log",
                 col_rename ="returns") %>%
    slice(-1)  

5.2 Join returns

portfolio_market_returns_tbl<-left_join(market_returns_tbl, portfolio_returns_tbl, by = "date") %>%
    set_names("date", "market_returns", "portfolio_returns") 

5.3 CAPM Beta

portfolio_market_returns_tbl %>%
    tq_performance(Ra = portfolio_returns,
                   Rb = market_returns,
                   performance_fun = CAPM.beta)
## # A tibble: 1 × 1
##   CAPM.beta.1
##         <dbl>
## 1       0.401

6 Plot

Scatterplot of returns with regression line

portfolio_market_returns_tbl %>%
    ggplot(aes(x=market_returns,
               y = portfolio_returns)) +
    geom_point(color = "cornflowerblue") +
    geom_smooth(method = "lm", se = FALSE, size = 1.5, color = tidyquant:: palette_light()[3]) +
    labs(y="Portfolio Returns",
         x = "Market Returns")

The beta coefficient or slope is 0.401 which less volatile than the market since it is less than one. The dots are not close to the regression line, so there is not a strong linear relationship between the portfolio returns and the market returns.