# 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("AAPL", "MSFT", "TSLA", "JNJ", "AMZN")

prices <- tq_get(x    = symbols, 
                 get  = "stock.prices",
                 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
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "AAPL" "AMZN" "JNJ"  "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 AAPL       0.25
## 2 AMZN       0.25
## 3 JNJ        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.00156
##  2 2013-02-28 -0.00336
##  3 2013-03-28  0.0307 
##  4 2013-04-30  0.0613 
##  5 2013-05-31  0.0906 
##  6 2013-06-28 -0.0125 
##  7 2013-07-31  0.0765 
##  8 2013-08-30  0.0224 
##  9 2013-09-30  0.0347 
## 10 2013-10-31  0.0677 
## # ℹ 50 more rows

5 Compute Skewness

portfolio_skew_tidyquant_builtin_percent <- portfolio_returns_tbl %>%
    
    tq_performance(Ra = returns,
                   performance_fun = table.Stats) %>%
    
    select(Skewness)

portfolio_skew_tidyquant_builtin_percent
## # A tibble: 1 × 1
##   Skewness
##      <dbl>
## 1  -0.0945
# Mean of portfolio returns
portfolio_mean_tidyquant_builtin_percent <- 
mean(portfolio_returns_tbl$portfolio.returns)

portfolio_mean_tidyquant_builtin_percent
## [1] NA

6 Plot: Skewness Comparison

# 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 AMZN       0.187 
## 3 JNJ       -0.0651
## 4 MSFT       0.0825
## 5 TSLA       0.944 
## 6 portfolio -0.0945
# 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") %>%
    na.omit()

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.

The asset in my portfolio that is more likely to return extreme positive returns compared to my collective portfolio is TSLA having a 0.9 skew compared to the portfolios -0.125 skew. Based on the other assets invested in the portfolio the collective portfolio is performing negatively skewed. This is due to the extreme negative skew of AAPL at -0.6 and JNJ slightly negative skew of -0.1 affecting the overall portfolio. When referencing code along 4 all of the assets expect TSLA all have a fairly low rate of return but also a significantly lower risk. The Distribution graph also shows similarities to the scatter plot showing potential returns and the risk based on how wide the information was on the distribution graph.