# 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("FDX", "MSFT", "UPS")
prices <- tq_get(x = symbols,
                 get = "stock.prices", 
                 from = "2012-12-31",
                 to = "2023-04-10")

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"))
##     asset      date   returns 
##   "asset"    "date" "returns"

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

# symbols
symbols <- asset_returns_tbl %>% distinct(symbol) %>% pull()
    

# weights
weights <- c(0.5, 0.3, 0.2)
weights
## [1] 0.5 0.3 0.2
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 3 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 FDX         0.5
## 2 MSFT        0.3
## 3 UPS         0.2

4 Build a portfolio

portfolio_returns_tbl <- asset_returns_tbl %>%
    tq_portfolio(assets_col = symbol, 
                 returns_col = monthly.returns,
                 weights = w_tbl,
                rebalance_on = "months", 
                col_rename = "returns")

portfolio_returns_tbl
## # A tibble: 124 × 2
##    date       returns
##    <date>       <dbl>
##  1 2013-01-31  0.0732
##  2 2013-02-28  0.0353
##  3 2013-03-28 -0.0185
##  4 2013-04-30  0.0218
##  5 2013-05-31  0.0318
##  6 2013-06-28  0.0105
##  7 2013-07-31  0.0126
##  8 2013-08-30  0.0214
##  9 2013-09-30  0.0432
## 10 2013-10-31  0.102 
## # … with 114 more rows

5 Calculate CAPM Beta

5.1 Get market returns

market_retruns_tbl <- tq_get(x = "SPY",
                 get = "stock.prices", 
                 from = "2012-12-31",
                 to = "2017-12-31")  %>%
    
    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_retruns_tbl, 
                                  portfolio_returns_tbl,
                                  "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.15

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]) +
    
    labs(x = "portfolio returns", 
         y = "market returns")

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

The beta coefficient of my is 1.15. This means that it is more volotile than the market. It is a psoitve number which means it is expected to move in the same direction of the market. I used the S&P 500 for my market because I have a variety of types of stocks in my portfolio. This makes it more difficult to pinpoint an exact market return. This could explain why my data does not confirm to closely to the beta coefficient. Only a few returns land on the line and many of the dots are pretty far away from it, both above and below. This means it is not a great indicator for how the stocks will perform in relation to the market.