# 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("TSLA", "META", "XOM", "AAPL", "PG", "AMZN")
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 = "quarterly",
type = "log") %>%
slice(-1) %>%
ungroup() %>%
set_names(c("asset", "date", "returns"))
# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "AAPL" "AMZN" "META" "PG" "TSLA" "XOM"
# weights
weights <- c(0.2, 0.2, 0.2, 0.1, 0.2, 0.1)
weights
## [1] 0.2 0.2 0.2 0.1 0.2 0.1
w_tbl <- tibble(symbols, weights)
w_tbl
## # A tibble: 6 × 2
## symbols weights
## <chr> <dbl>
## 1 AAPL 0.2
## 2 AMZN 0.2
## 3 META 0.2
## 4 PG 0.1
## 5 TSLA 0.2
## 6 XOM 0.1
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.00902
## 2 2013-06-28 0.192
## 3 2013-09-30 0.315
## 4 2013-12-31 0.0741
## 5 2014-03-31 0.0399
## 6 2014-06-30 0.0849
## 7 2014-09-30 0.0511
## 8 2014-12-31 -0.000382
## 9 2015-03-31 0.0212
## 10 2015-06-30 0.107
## 11 2015-09-30 -0.0157
## 12 2015-12-31 0.0870
## 13 2016-03-31 0.00299
## 14 2016-06-30 0.0128
## 15 2016-09-30 0.0815
## 16 2016-12-30 -0.0302
## 17 2017-03-31 0.171
## 18 2017-06-30 0.0806
## 19 2017-09-29 0.0336
## 20 2017-12-29 0.0515
portfolio_returns_tbl %>%
ggplot(mapping = aes(x = portfolio.returns)) +
geom_histogram(fill = "cornflowerblue",
binwidth = 0.02) +
geom_density(bw = 0.015) + # Adjusting bindwidth
# Formatting
scale_x_continuous(labels = scales::percent_format()) +
labs(x = "returns",
y = "distribution",
title = "Portfolio Histogram & Density")
I will answer this question with the help of the follwing code chunk:
expected_return <- mean(portfolio_returns_tbl$portfolio.returns)
expected_return
## [1] 0.06842967
maximum_return <- max(portfolio_returns_tbl$portfolio.returns)
maximum_return
## [1] 0.3147789
minimum_return <- min(portfolio_returns_tbl$portfolio.returns)
minimum_return
## [1] -0.03021344
Based on the results provided, the expected return from the portfolio in a typical quarter is 0.06842966, or simply said, positive. This indicates that, on average, the portfolio is expected to generate a positive return of 6.8% in a typical quarter.
The maximum return observed in the portfolio is 31.5%. This represents the highest return achieved in a single quarter, indicating the potential for significant positive returns in certain periods.
On the other hand, the minimum return observed in the portfolio is -3.0%. This represents the lowest return experienced in a single quarter, indicating the possibility of negative returns in certain periods.
Based on these results, I can conclude that it is more likely for the portfolio to generate postive returns than negative ones. Also, the biggest positive returns will likely be higher than the biggest negative returns, based on the history of the portfolio.