You are considering three index funds that follow the three major market indexes: the Dow Jones Industrial Average, the S&P 500, and the NASDAQ Compsite Index.
library(tidyquant)
library(tidyverse)
Hint: Add group_by(symbol) at the end of the code so that calculations below will be done per stock.
from = today() - years(30)
Stocks <- tq_get(c("^DJI","^GSPC","^IXIC"), get = "stock.prices", from = from) %>%
group_by(symbol)
Stocks
## # A tibble: 22,677 x 8
## # Groups: symbol [3]
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 ^DJI 1989-04-17 2332. 2348. 2324. 2338. 13760000 2338.
## 2 ^DJI 1989-04-18 2357. 2386 2351. 2379. 25240000 2379.
## 3 ^DJI 1989-04-19 2377. 2398. 2370. 2387. 21700000 2387.
## 4 ^DJI 1989-04-20 2390. 2399. 2357. 2377. 21410000 2377.
## 5 ^DJI 1989-04-21 2383. 2413. 2373. 2409. 27210000 2409.
## 6 ^DJI 1989-04-24 2397. 2416. 2385. 2403. 18550000 2403.
## 7 ^DJI 1989-04-25 2408. 2422. 2379. 2387. 21850000 2387.
## 8 ^DJI 1989-04-26 2393. 2404. 2374. 2389. 17050000 2389.
## 9 ^DJI 1989-04-27 2393. 2433. 2388. 2419. 25780000 2419.
## 10 ^DJI 1989-04-28 2420. 2430. 2404. 2419. 17410000 2419.
## # ... with 22,667 more rows
Hint: Take Stocks and pipe it to tidyquant::tq_transmute. Assign the result to returns_yearly.
returns_yearly <-
Stocks %>%
tq_transmute(select = adjusted, mutate_fun = periodReturn, period = "yearly")
returns_yearly
## # A tibble: 93 x 3
## # Groups: symbol [3]
## symbol date yearly.returns
## <chr> <date> <dbl>
## 1 ^DJI 1989-12-29 0.178
## 2 ^DJI 1990-12-31 -0.0434
## 3 ^DJI 1991-12-31 0.203
## 4 ^DJI 1992-12-31 0.0417
## 5 ^DJI 1993-12-31 0.137
## 6 ^DJI 1994-12-30 0.0214
## 7 ^DJI 1995-12-29 0.335
## 8 ^DJI 1996-12-31 0.260
## 9 ^DJI 1997-12-31 0.226
## 10 ^DJI 1998-12-31 0.161
## # ... with 83 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.
returns_yearly%>%
ggplot(aes(x=yearly.returns,fill=symbol))+geom_density(alpha=0.3)
## Q5. Which of the considered index funds has the highest expected yearly return? Hint: Take returns_yearly and pipe it to summarise. Calculate the mean yearly returns.
returns_yearly%>%
summarise(returns_avg=mean(yearly.returns))
## # A tibble: 3 x 2
## symbol returns_avg
## <chr> <dbl>
## 1 ^DJI 0.0917
## 2 ^GSPC 0.0895
## 3 ^IXIC 0.134
^IXIC has the highest expected yearly return.
Hint: Discuss your answer in terms of 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, # Calculataing downside risk measures doesn't require Rb
performance_fun = sd)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol sd.1
## <chr> <dbl>
## 1 ^DJI 0.146
## 2 ^GSPC 0.165
## 3 ^IXIC 0.276
^IXIC has the highest standard deviation so it is the riskiest stock.
Hint: Discuss your answer in terms of whether the returns are normally distributed. The normality of the distribution may be measured by skewness and kurtosis. To compute the metrics, take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute skewness. Do the same for kurtosis.
returns_yearly %>%
tq_performance(Ra = yearly.returns,
Rb = NULL, # Calculataing downside risk measures doesn't require Rb
performance_fun = skewness)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol skewness.1
## <chr> <dbl>
## 1 ^DJI -0.777
## 2 ^GSPC -0.819
## 3 ^IXIC 0.179
returns_yearly %>%
tq_performance(Ra = yearly.returns,
Rb = NULL, # Calculataing downside risk measures doesn't require Rb
performance_fun = kurtosis)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol kurtosis.1
## <chr> <dbl>
## 1 ^DJI 0.750
## 2 ^GSPC 0.631
## 3 ^IXIC 0.435
Skewness: for ^DJI and ^GSPC are both negatively skewed, meaning large negative returns occur more often. ^IXIC has a postiive skewness so postive returns are more likely more often. Kurtosis: All three stocks have a postivie kurtosis meaning large positive or negative returns are likely to occur more often. Therefore, this is not a normla distribution because for stadnard deviation to be an appropriate measure of risk, the data needs to be normally distributed.
Hint: Discuss your answer in terms of HistoricalES(95%), HistoricalVaR(95%), and SemiDeviation. To compute the metrics, take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute table.DownsideRisk. returns_yearly %>%
returns_yearly %>%
tq_performance(Ra = yearly.returns,
Rb = NULL, # Calculataing downside risk measures doesn't require Rb
performance_fun = table.DownsideRisk) %>%
t()
## [,1] [,2] [,3]
## symbol "^DJI" "^GSPC" "^IXIC"
## DownsideDeviation(0%) "0.0712" "0.0877" "0.1266"
## DownsideDeviation(MAR=0.833333333333333%) "0.0741" "0.0908" "0.1300"
## DownsideDeviation(Rf=0%) "0.0712" "0.0877" "0.1266"
## GainDeviation "0.0888" "0.0928" "0.2028"
## HistoricalES(95%) "-0.2530" "-0.3093" "-0.3991"
## HistoricalVaR(95%) "-0.1193" "-0.1820" "-0.3541"
## LossDeviation "0.1092" "0.1261" "0.1606"
## MaximumDrawdown "0.3384" "0.4012" "0.6718"
## ModifiedES(95%) "-0.2584" "-0.3013" "-0.4083"
## ModifiedVaR(95%) "-0.1718" "-0.2116" "-0.2957"
## SemiDeviation "0.1105" "0.1268" "0.1883"
^IXIC appears to present greater downside risk than both other stocks. HistoricalEs: HistoricalVar:-.3541 SemiDeviation:
Hint: Discuss your answer in terms of Sharpe Ratio. Take returns_yearly and pipe it to tidyquant:: tq_performance. Use the performance_fun argument to compute SharpeRatio. The function returns Sharpe Ratios adjusted to three different types of risks: 1) standard deviation, 2) expected shortfall (5% worst loss), and 3) value at risk (the largest loss at the 95% confidence level).
returns_yearly %>%
tq_performance(Ra = yearly.returns,
Rb = NULL, # Calculataing downside risk measures doesn't require Rb
performance_fun = SharpeRatio)%>%
t()
## [,1] [,2] [,3]
## symbol "^DJI" "^GSPC" "^IXIC"
## ESSharpe(Rf=0%,p=95%) "0.3549842" "0.2970939" "0.3284609"
## StdDevSharpe(Rf=0%,p=95%) "0.6297887" "0.5417175" "0.4863393"
## VaRSharpe(Rf=0%,p=95%) "0.5338788" "0.4230432" "0.4535240"
^DJI would be risk-averse investor because it has the highest sharpe ratio meaning that its risk adjusted perormance is better. ## Q10.a. Display both code and the results of the code on the webpage.