# 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("NKE", "TSLA", "NVDA", "GOOGL", "ADDYY")

prices <- tq_get(x    = symbols,
                 get  = "stock.prices",
                 from = "2025-12-31",
                 to   = "2026-12-31")

2 Convert prices to returns (quarterly)

asset_returns_tbl <- prices %>%
    
    group_by(symbol) %>%
    
        tq_transmute(select     = adjusted,
                     mutate_fun = periodReturn,
                     period     ="monthly",
                     type       ="log") %>%
    
    slice(-1) %>%

    ungroup() %>%

set_names(c("asset", "date", "return"))

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

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "ADDYY" "GOOGL" "NKE"   "NVDA"  "TSLA"
#weights
weights <- c(0.25, 0.25, 0.2, 0.2, 0.1)
weights
## [1] 0.25 0.25 0.20 0.20 0.10
w_tbl <- tibble(symbols, weights)

4 Build a portfolio

?tq_portfolio

portfolio_returns_tbl <- asset_returns_tbl %>%
    
    tq_portfolio(assets_col = asset,
                 returns_col = return,
                 weights     = w_tbl,
                 rebalace_on = "months")

portfolio_returns_tbl
## # A tibble: 10 × 2
##    date       portfolio.returns
##    <date>                 <dbl>
##  1 2026-01-30          -0.0144 
##  2 2026-02-27          -0.0310 
##  3 2026-03-31          -0.100  
##  4 2026-04-30           0.0931 
##  5 2026-05-29           0.0575 
##  6 2026-06-30          -0.0358 
##  7 2026-07-31          -0.0551 
##  8 2026-08-31          -0.00268
##  9 2026-09-30          -0.0174 
## 10 2026-10-07           0.0165

5 Plot: Portfolio Histogram and Density

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.005) +

    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?

I would expect the portfolio to earn a positive return in a typical quarter, around 5–10%.