# Load packages
library(tidyquant)
library(tidyverse)
# Import stock prices and calculate returns
returns_yearly <- c("^DJI", "^GSPC", "^IXIC") %>%
tq_get(get = "stock.prices",
from = "1990-01-01",
to = "2020-11-01") %>%
group_by(symbol) %>%
tq_transmute(select = adjusted,
mutate_fun = yearlyReturn)
returns_yearly
## # A tibble: 91 x 3
## # Groups: symbol [3]
## symbol date yearly.returns
## <chr> <date> <dbl>
## 1 ^DJI 1992-12-31 0.0406
## 2 ^DJI 1993-12-31 0.137
## 3 ^DJI 1994-12-30 0.0214
## 4 ^DJI 1995-12-29 0.335
## 5 ^DJI 1996-12-31 0.260
## 6 ^DJI 1997-12-31 0.226
## 7 ^DJI 1998-12-31 0.161
## 8 ^DJI 1999-12-31 0.252
## 9 ^DJI 2000-12-29 -0.0617
## 10 ^DJI 2001-12-31 -0.0710
## # … with 81 more rows
Hint: Refer to the ggplot2 cheatsheet. Look for geom_density under One Variable. Use the fill argument to create the plot per each stock.
ggplot(returns_yearly, aes(x = yearly.returns, fill = symbol)) +
geom_density(alpha = 0.3)
Hint: Discuss your answer in terms of the mean. Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute the mean.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = mean
)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol mean.1
## <chr> <dbl>
## 1 ^DJI 0.0871
## 2 ^GSPC 0.0880
## 3 ^IXIC 0.143
The stock with the higher expected yearly return is the NASDAQ. It gave a average yearly return of 14.3%. In comparison, S&P had an average yearly return of 8.8% and Dow Jones was 8.71%.
Hint: Discuss your answer in terms of the standard deviation. Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute sd (standard deviation).
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = sd
)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol sd.1
## <chr> <dbl>
## 1 ^DJI 0.151
## 2 ^GSPC 0.169
## 3 ^IXIC 0.279
Dow Jones is the least volatile stock. NASDAQ is the stock with the most risk (naturally, as the return is higher), as the standard deviation is the highest.
Hint: Discuss your answer in terms of the skewness and the kurtosis. Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute the skewness. Do the same for the kurtosis.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = skewness
)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol skewness.1
## <chr> <dbl>
## 1 ^DJI -0.669
## 2 ^GSPC -0.700
## 3 ^IXIC 0.0914
Dow Jones and S&P both have negative skewness. This means that extreme negative returns are likelier than extreme positive returns. The NASDAQ has positive skewness, which means extreme positives are more likely.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = kurtosis
)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol kurtosis.1
## <chr> <dbl>
## 1 ^DJI 0.410
## 2 ^GSPC 0.357
## 3 ^IXIC 0.289
All 3 stocks have greater than zero kurtosis, which means they have fatter tails than normal.
These mean that we need additional downside risk measures because the standard deviation is not normally distributed, and is skewed to the left.
Hint: Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute table.DownsideRisk.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = table.DownsideRisk
) %>%
t()
## [,1] [,2] [,3]
## symbol "^DJI" "^GSPC" "^IXIC"
## DownsideDeviation(0%) "0.0743" "0.0882" "0.1270"
## DownsideDeviation(MAR=0.833333333333333%) "0.0775" "0.0913" "0.1304"
## DownsideDeviation(Rf=0%) "0.0743" "0.0882" "0.1270"
## GainDeviation "0.0935" "0.1023" "0.2005"
## HistoricalES(95%) "-0.2530" "-0.3093" "-0.3991"
## HistoricalVaR(95%) "-0.1291" "-0.1820" "-0.3541"
## LossDeviation "0.1078" "0.1254" "0.1605"
## MaximumDrawdown "0.3384" "0.4012" "0.6718"
## ModifiedES(95%) "-0.2632" "-0.3017" "-0.4179"
## ModifiedVaR(95%) "-0.1831" "-0.2161" "-0.2995"
## SemiDeviation "0.1131" "0.1275" "0.1931"
The stock with the greatest risk is NASDAQ. It has greater values in all 3 variables, VAR, ES and Downside Risk. When looking at these variables, the highest absolute value of each shows greater risk. For NASDAQ: ES of -0.3991 means that -39.91% is the average of the 5% most negative returns. VAR of -0.3541 means that -35.41% is the largest loss we cna expect with 95% confidence. A semi-deviation of 0.1931 means that the sd of returns below the mean is 0.1931.
Hint: Assume that the risk free rate is zero and 95% confidence level. Note that the Sharpe Ratios are calculated using different risk measures: ES, VaR and semideviation. Make your argument based on all three Sharpe Ratios.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = SharpeRatio
)
## # A tibble: 3 x 4
## # Groups: symbol [3]
## symbol `ESSharpe(Rf=0%,p=95%… `StdDevSharpe(Rf=0%,p=95… `VaRSharpe(Rf=0%,p=95…
## <chr> <dbl> <dbl> <dbl>
## 1 ^DJI 0.331 0.576 0.476
## 2 ^GSPC 0.292 0.520 0.407
## 3 ^IXIC 0.342 0.512 0.477
We can tell NASDAQ is better beacuse it has the higher Sharpe ratio with all 3 Sharpe ratios, for expected shortfall, standard deviation and VaR.
Hint: Google tq_performance(). Discuss in terms of ES, VaR and semideviation and their differences between 95% and 99%.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = SharpeRatio,
p = 0.99
)
## # A tibble: 3 x 4
## # Groups: symbol [3]
## symbol `ESSharpe(Rf=0%,p=99%… `StdDevSharpe(Rf=0%,p=99… `VaRSharpe(Rf=0%,p=99…
## <chr> <dbl> <dbl> <dbl>
## 1 ^DJI 0.193 0.576 0.271
## 2 ^GSPC 0.169 0.520 0.239
## 3 ^IXIC 0.237 0.512 0.289
I would still choose NASDAQ, because even though Dow-Jones has a higher Sharpe ratio using standard deviation to calculate, and S&P has a higher Sharpe ratio also using standard deviation to calculate, the NASDAQ has higher ratios across overall.
Hint: Use message, warning, echo and results in the chunk options. Refer to the RMarkdown Reference Guide.