# 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
$IXIC(NASDAQ) has the highest expected yearly returns compared too $DJI(DOW) and $GSPC(S&P 500). $IXIC has a the highest mean at 0.143 where as $DJI and $GSPC are both below 0.1.
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
$IXIC(NASDAQ) is seen as the riskiest, even though it has the highest expected yearly return. The reason for this is because it has the highest SD rate.
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
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
Standard deviation is a great way, although multiple variables can alter these results. While looking at stocks there are numerous ways to decide on risk management although, the best way is diversifying between as many ways as you can. Some examples that the question asks for is skew and kurtosis.$IXIC(NASDAQ) has a positive skew which means a higher gain and $IXIC(NASDAQ) also has the lowest kurtosis which means less risk of surprises
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"
$IXIC(NASDAQ) has the greatest downside risk compared to the DOW and S&P. Itβs HistoricalES(95%)is at -0.3991 which is more negative then both the DOW and S&P as seen above. The same can be said with the HistoricalVar(95%). SemiDeviation also shares the same findings as above.
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
Based of these 3 ratios I would select $IXIC(NASDAQ) since it has the highest out of the majority.
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
Surprisingly even with changing the confidence level it still shared the same results holding $IXIC(NASDAQ) as the best choice.
Hint: Use message, warning, echo and results in the chunk options. Refer to the RMarkdown Reference Guide.