# 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("HMC", "WMT", "TGT")

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

    asset_returns_tbl
## # A tibble: 180 × 3
##    asset date        returns
##    <chr> <date>        <dbl>
##  1 HMC   2013-01-31  0.0201 
##  2 HMC   2013-02-28 -0.00666
##  3 HMC   2013-03-28  0.0263 
##  4 HMC   2013-04-30  0.0440 
##  5 HMC   2013-05-31 -0.0622 
##  6 HMC   2013-06-28 -0.00318
##  7 HMC   2013-07-31 -0.00296
##  8 HMC   2013-08-30 -0.0328 
##  9 HMC   2013-09-30  0.0640 
## 10 HMC   2013-10-31  0.0466 
## # … with 170 more rows

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

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()
symbols
## [1] "HMC" "TGT" "WMT"
# weights 
weight <- c(0.20, 0.20, 0.60)
weight
## [1] 0.2 0.2 0.6
w_tbl <- tibble(symbols, weight)
w_tbl
## # A tibble: 3 × 2
##   symbols weight
##   <chr>    <dbl>
## 1 HMC        0.2
## 2 TGT        0.2
## 3 WMT        0.6

4 Build a portfolio

# ?tq_portfolio

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

portfolio_returns_tbl
## # A tibble: 60 × 2
##    date       portfolio.returns
##    <date>                 <dbl>
##  1 2013-01-31           0.0231 
##  2 2013-02-28           0.0152 
##  3 2013-03-28           0.0595 
##  4 2013-04-30           0.0375 
##  5 2013-05-31          -0.0330 
##  6 2013-06-28          -0.00539
##  7 2013-07-31           0.0340 
##  8 2013-08-30          -0.0660 
##  9 2013-09-30           0.0221 
## 10 2013-10-31           0.0340 
## # … with 50 more rows

5 Compute Skewness

portfolio_sd_tidyquant_builtin_percent <- portfolio_returns_tbl %>%

    tq_performance(Ra = portfolio.returns, 
                   performance_fun = table.Stats) %>%
    
    select(Stdev) %>%
    mutate(tq_sd = round(Stdev, 4))

portfolio_sd_tidyquant_builtin_percent
## # A tibble: 1 × 2
##    Stdev  tq_sd
##    <dbl>  <dbl>
## 1 0.0369 0.0369
# Mean of portfolio of returns
portfolio_mean_tidyquant_builtin_percent <- mean(portfolio_returns_tbl$portfolio.returns)

portfolio_mean_tidyquant_builtin_percent
## [1] 0.005570159

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$portfolio.returns)))

asset_skewness_tbl
## # A tibble: 4 × 2
##   asset        skew
##   <chr>       <dbl>
## 1 HMC       -0.256 
## 2 TGT        0.148 
## 3 WMT        0.0723
## 4 portfolio  0.183
# 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.

Looking at my graph, my portfolio looks like it has the highest chance to produce positive returns than any other asset. My portfolio has a skewness of almost 0.2, which is the highest skewness of all assets. If I was to pick one asset over the portfolio, it would be Target. Target has a positive skewness of 0.15 and is the closest runner up behind the portfolio. My portfolio has the highest chance to produce positive returns and is on the right side of distribution, meaning more positive results, assuming that the portfolio and all other assets have the same center of distribution. I would lean towards picking the portfolio because it has more positive values. Honda on the other hand is the the only asset on the graph that has a negative skewness of about 0.25 and indicates that the tail is on the left side of the distribution and has more negative values.