# Load packages
# Core
library(tidyverse)
library(tidyquant)
Calculate and visualize your portfolio’s beta.
Choose your stocks and the baseline market.
from 2012-12-31 to present
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
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"))
# 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
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
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)
portfolio_market_returns_tbl <- left_join(market_returns_tbl,
portfolio_returns_tbl,
by = "date") %>%
set_names("date", "market_returns", "portfolio_returns")
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
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")
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 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.
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.
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.