# 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("NKE", "ADDYY", "SKX", "UAA")
prices <- tq_get(x = symbols,
get = "stock.prices",
from = "2012-12-31",
to = "2017-12-31")
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] "ADDYY" "NKE" "SKX" "UAA"
# weights
weights <- c(0.4, 0.2, 0.25, 0.15)
weights
## [1] 0.40 0.20 0.25 0.15
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 4 × 2
## symbols weights
## <chr> <dbl>
## 1 ADDYY 0.4
## 2 NKE 0.2
## 3 SKX 0.25
## 4 UAA 0.15
# ?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.0385
## 2 2013-02-28 0.0150
## 3 2013-03-28 0.0760
## 4 2013-04-30 0.0284
## 5 2013-05-31 0.0519
## 6 2013-06-28 0.0120
## 7 2013-07-31 0.0604
## 8 2013-08-30 0.0204
## 9 2013-09-30 0.0542
## 10 2013-10-31 0.0157
## # ℹ 50 more rows
market_returns_tbl <- tq_get(x = "SPY",
get = "stock.prices",
from = "2012-12-31",
to = "2017-12-31") %>%
# Convert prices to monthly 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 0.592
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")
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 the portfolio is 1.10, which means the portfolio is 10% more volatile than the overall market. For every 1% change in the market, the portfolio tends to change by 1.10%. The scatter plot of portfolio returns against market returns confirms this relationship: the regression line has a positive slope greater than 1, indicating a high sensitivity to market movements. Therefore, the plot supports the beta value and confirms that this portfolio is relatively aggressive in risk profile compared to the market.