# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

Collect individual returns into a portfolio by assigning a weight to each stock

Choose your stocks.

from 2012-12-31 to 2017-12-31

1 Import stock prices

symbols <- c ("PANW", "AAPL", "NVDA")

prices <- tq_get(x = symbols,
                 get = "stockprices",
                 from = "2012-12-31",
                 to = "2017-12-31")

2 Convert prices to returns (quarterly)

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"))

3 Assign a weight to each asset (change the weigting scheme)

# 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

4 Build a portfolio

# ?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

5 Plot: Portfolio Histogram and Density

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")

What return should you expect from the portfolio in a typical quarter?

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.