# 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("TSLA", "META", "XOM", "AAPL", "PG", "AMZN")

prices <- tq_get(x    = symbols, 
                 get. = "stock.prices",
                 from = "2012-12-31", 
                 to   = Sys.Date()) # Fetches data until present

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 a weight to each asset (change the weigting scheme)

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "AAPL" "AMZN" "META" "PG"   "TSLA" "XOM"
# weights
weights <- c(0.2, 0.2, 0.2, 0.15, 0.15, 0.1)
weights
## [1] 0.20 0.20 0.20 0.15 0.15 0.10
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 6 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 AAPL       0.2 
## 2 AMZN       0.2 
## 3 META       0.2 
## 4 PG         0.15
## 5 TSLA       0.15
## 6 XOM        0.1

4 Build a 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: 126 × 2
##    date         returns
##    <date>         <dbl>
##  1 2013-01-31  0.0462  
##  2 2013-02-28 -0.0406  
##  3 2013-03-28  0.00457 
##  4 2013-04-30  0.0591  
##  5 2013-05-31  0.0813  
##  6 2013-06-28 -0.000296
##  7 2013-07-31  0.166   
##  8 2013-08-30  0.0485  
##  9 2013-09-30  0.0706  
## 10 2013-10-31  0.0354  
## # ℹ 116 more rows

5 Calculate CAPM Beta

5.1 Get market returns

market_returns_tbl <- tq_get(x    = "^IXIC", 
                 get. = "stock.prices",
                 from = "2012-12-31", 
                 to   = Sys.Date()) %>%
    
    # 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.08

6 Plot: Scatter 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]) +
    
    # Labeling
    labs(x = "Portfolio Returns", 
         y = "Market Returns")

Question:

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

In terms of Beta Coefficient

The calculated Beta coefficient of 1.08 suggests that the portfolio is slightly more volatile than the market baseline of the NASDAQ Composite (^IXIC). This means that when the market experiences a positive or a negative return, the portfolio is expected to exhibit a slightly higher magnitude of movement. Consequently, the portfolio’s returns are likely to be influenced by the overall market performance, but with a slightly amplified effect.

In terms of the Scatter Plot with Regression Line

The slope of the regression line in the plot represents the Beta Coefficient, which indicated the sensitivity of the portfolio’s returns to changes in the market returns. With a slope around 1.08, it suggests that the portfolio is expected to move, on average, 1.08 times the magnitude of the market’s movement. This confirms that the portfolio is slightly more volatile than the market, as indicated by the Beta Coefficient.

Conclusion

Based on both the calculated Beta Coefficient (1.08) and the slope of the regression line in the plot (around 1.08), I can conclude that the portfolio is slightly more sensitive to market movements than the average stock in the baseline market.