# 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", "NVDA", "AAPL")
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 & Dentisy 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 generated an average quarterly return of approximately 7.33%. This figure comes from calculating the mean of the 20 quarterly returns recorded between 2013 and 2017. Because the returns are measured using logarithmic calculations, their arithmetic mean is roughly 7.33% per quarter.