# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

Calculate and visualize your portfolio’s beta.

Choose your stocks and the baseline market.

from 2012-12-31 to present

1 Import stock prices

symbols <- c("SPY", "WMT", "COST", "AMZN")
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 %>%
# I added asset_returns_tbl here (wasn't in video) otherwise the code would not run, and mistake code wouldn't be fixable
# In video
    
    group_by(symbol) %>%

    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly",
                 type       = "log") %>%
    slice(-1) %>%
    #Remove the first row, but since data is group, it will remove the first line of each group
    
    ungroup() %>%

    set_names(c("asset", "date", "returns"))

3 Assign a weight to each asset (change the weigting scheme)

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "AMZN" "COST" "SPY"  "WMT"
# weights
weights <- c(0.30, 0.30, 0.20, 0.20)
weights
## [1] 0.3 0.3 0.2 0.2
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 4 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AMZN        0.3
## 2 COST        0.3
## 3 SPY         0.2
## 4 WMT         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", 
                  col_rename   = "returns")

portfolio_returns_tbl
## # A tibble: 60 × 2
##    date        returns
##    <date>        <dbl>
##  1 2013-01-31  0.0427 
##  2 2013-02-28  0.00121
##  3 2013-03-28  0.0363 
##  4 2013-04-30  0.00325
##  5 2013-05-31  0.0201 
##  6 2013-06-28  0.00825
##  7 2013-07-31  0.0616 
##  8 2013-08-30 -0.0526 
##  9 2013-09-30  0.0497 
## 10 2013-10-31  0.0694 
## # ℹ 50 more rows

5 Calculate CAPM Beta

5.1 Get market returns

market_returns_tbl <- tq_get(x = "VOO", 
                 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       1.000

6 Plot: Scatter with regression line

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") +
    
    # To set the limits (zoom window) for both the X and Y axes, 
    # forcing the plot to display only the range from 0 to 0.1 (or 0% to 10%) on both axes
    coord_cartesian(xlim = c(0,0.1), ylim = c(0,0.1))

How sensitive is your portfolio to the market? Discuss in terms of the beta coefficient. Does the plot confirm the beta coefficient you calculated?

My portfolio is as sensitive as the market. Indeed, its beta coefficient is 1.000 indicating that it should move the same as the market since it is positive and 1. It will be as volatile as the market. The line is close to confirming this since its line is very close 45-degree-angle, indicating a slope/beta of approximately 1.0. However, the scatter plots shows that all the points are not placed on or very close to the regression line, which indicates that they are not perfectly correlated. When the points are all over the place and some are far from the line like in here, the plot indicates that there is not a strong linear relationship.