# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

Visualize and compare skewness of your portfolio and its assets.

Choose your stocks.

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

1 Import stock prices

symbols <- c("NVDA", "AAPL", "NFLX", "MSFT", "TSLA")
prices <- tq_get (x = symbols,
                  from = "2012-12-31",
                  to = "2017-12-31")

2 Convert prices to returns (monthly)

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

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

# Symbols
symbol <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "NVDA" "AAPL" "NFLX" "MSFT" "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)
w_tbl
## # A tibble: 5 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 NVDA       0.25
## 2 AAPL       0.25
## 3 NFLX       0.2 
## 4 MSFT       0.2 
## 5 TSLA       0.1

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 = "months", 
                 col_rename = "returns")

portfolio_returns_tbl
## # A tibble: 60 × 2
##    date       returns
##    <date>       <dbl>
##  1 2013-01-31  0.0926
##  2 2013-02-28  0.0258
##  3 2013-03-28  0.0195
##  4 2013-04-30  0.109 
##  5 2013-05-31  0.0998
##  6 2013-06-28 -0.0456
##  7 2013-07-31  0.0755
##  8 2013-08-30  0.0906
##  9 2013-09-30  0.0378
## 10 2013-10-31  0.0188
## # … with 50 more rows

5 Compute Skewness

# Data Transformation: calculate skewness 
asset_skewness_tbl <- asset_returns_tbl %>% 
    
    group_by(asset) %>%
    summarise(skew = skewness(returns)) %>% 
    ungroup() %>% 
    
    # Add Portfolio Skewness
    add_row(tibble(asset = "Portfolio",
                   skew = skewness(portfolio_returns_tbl$returns)))

asset_skewness_tbl
## # A tibble: 6 × 2
##   asset        skew
##   <chr>       <dbl>
## 1 AAPL      -0.555 
## 2 MSFT       0.0825
## 3 NFLX       0.909 
## 4 NVDA       0.899 
## 5 TSLA       0.944 
## 6 Portfolio -0.306

6 Plot: Skewness Comparison

# Plot Skewness 
asset_skewness_tbl %>% 
    
    ggplot(aes(x = asset, y = skew, color = asset)) + 
    geom_point() + 
    
    ggrepel::geom_text_repel(aes(label = asset), 
                             data = asset_skewness_tbl %>%
                                 filter(asset == "Portfolio")) + 
    labs(y = "skewness")

Is any asset in your portfolio more likely to return extreme positive returns than your portfolio collectively? Discuss in terms of skewness. You may also refer to the distribution of returns you plotted in Code along 4.

I have three assets in my portfolio that are more likely to return extreme positive returns compared to my portfolio as a whole. Those three assets are Netflix, Nvidia, and Tesla. When looking at the history of these three stocks it doesn’t surprise me that they have a high skewness because they are known to have large gains. Microsoft has a positive skew too, like the other three stocks. But I didn’t include it with the others because it will most likely not be able to compete with them. Netflix, Nvidia, and Tesla are the upper echelon in my portfolio when it comes to having a positive skewness.