# Load packages
# Core
library(tidyverse)
library(tidyquant)
Visualize and compare skewness of your portfolio and its assets.
Choose your stocks.
from 2012-12-31 to 2017-12-31
symbols <- c("HMC", "WMT", "TGT")
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 = "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
# 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
# ?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
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
# 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.