# Load packages
# Core
library(tidyverse)
library(tidyquant)
Collect individual returns into a portfolio by assigning a weight to each stock
Choose your stocks.
from 2012-12-31 to 2017-12-31
symbols <- c ("PANW", "AAPL", "NVDA")
prices <- tq_get(x = symbols,
get = "stockprices",
from = "2012-12-31",
to = "2017-12-31")
asset_returns_tbl <- prices %>%
group_by(symbol) %>%
tq_transmute(select = adjusted,
mutate_fun = periodReturn,
period = "quarterly",
type = "log") %>%
slice(-1) %>%
ungroup() %>%
set_names(c("asset", "date", "returns"))
# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "AAPL" "NVDA" "PANW"
# weights
weights <- c(0.33, 0.33, 0.33)
weights
## [1] 0.33 0.33 0.33
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 3 × 2
## symbols weights
## <chr> <dbl>
## 1 AAPL 0.33
## 2 NVDA 0.33
## 3 PANW 0.33
# ?tq_portfolio
portfolio_returns_tbl <- asset_returns_tbl %>%
tq_portfolio(assets_col = asset,
returns_col = returns,
weights = w_tbl,
rebalance_on = "quarters")
portfolio_returns_tbl
## # A tibble: 20 × 2
## date portfolio.returns
## <date> <dbl>
## 1 2013-03-28 -0.0234
## 2 2013-06-28 -0.0999
## 3 2013-09-30 0.126
## 4 2013-12-31 0.142
## 5 2014-03-31 0.0841
## 6 2014-06-30 0.144
## 7 2014-09-30 0.0799
## 8 2014-12-31 0.134
## 9 2015-03-31 0.114
## 10 2015-06-30 0.0514
## 11 2015-09-30 0.0225
## 12 2015-12-31 0.0909
## 13 2016-03-31 0.0149
## 14 2016-06-30 -0.0431
## 15 2016-09-30 0.268
## 16 2016-12-30 0.0765
## 17 2017-03-31 0.0453
## 18 2017-06-30 0.153
## 19 2017-09-29 0.118
## 20 2017-12-29 0.0603
What return should you expect from the portfolio in a typical quarter?
portfolio_returns_tbl %>%
ggplot(mapping = aes(x = date, y = portfolio.returns)) +
geom_point(color = "cornflowerblue") +
# Formatting
scale_x_date(date_breaks = "1 year",
date_labels = "%Y") +
# Labeling
labs(y = "monthly returns",
x = NULL,
title = "Portfolio Returns Scatter")
Histogram
portfolio_returns_tbl %>%
ggplot(mapping = aes(x = portfolio.returns)) +
geom_histogram(fill = "cornflowerblue", binwidth = 0.05) +
labs(x = "returns",
title = "Portfolio Returns Distribution")
Histogram & Density Plot
portfolio_returns_tbl %>%
ggplot(mapping = aes(x = portfolio.returns)) +
geom_histogram(fill = "cornflowerblue", binwidth = 0.01) +
geom_density() +
# Formatting
scale_x_continuous(labels = scales::percent_format()) +
labs(x = "returns",
y = "distribution",
title = "Portfolio Histogram & Density")
The portfolio’s expected return in a typical quarter is approximately 7.33%. This is calculated by taking the average of the 20 quarterly portfolio returns from 2013 to 2017. Since the portfolio return is based on log returns, the arithmetic average is about 7.33% per quarter.