# 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("SPY", "WMT", "COST", "AMZN")
prices <- tq_get(x = symbols,
get = "stock.prices",
from = "2012-12-31",
to = "2017-12-31")
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"))
# 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
# ?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
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)
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.000
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.