Disclaimer: The content of this RMarkdown note came from a course (chapter 2) called Introduction to Portfolio Analysis in R in datacamp.
A risk-averse investor would prefer an investment that has the highest average return with the lowest volatility.
Non-normality of the return distribution
Two metrics key to understanding the distribution of non-normal returns:
Skewness
Kurtosis
# Load packages
library(PerformanceAnalytics)
library(quantmod)
library(xts)
data.MSFT <- getSymbols("MSFT", from = "1985-12-31", to = "2016-08-01", auto.assign = FALSE)
MSFT_monthly <- to.monthly(data.MSFT, indexAt = "startof")
# to.monthly documentation https://www.rdocumentation.org/packages/xts/versions/0.10-0/topics/to.period
MSFT_monthly <- MSFT_monthly[, "data.MSFT.Adjusted"]
head(MSFT_monthly)
## data.MSFT.Adjusted
## 1986-03-13 0.063419
## 1986-04-01 0.074373
## 1986-05-01 0.080715
## 1986-06-02 0.070914
## 1986-07-01 0.065725
## 1986-08-01 0.065725
# Calcuate net returns
MSFT_monthly <- Return.calculate(MSFT_monthly)
MSFT_monthly <- MSFT_monthly[-1, ]
colnames(MSFT_monthly) <- "MSFT"
head(MSFT_monthly)
## MSFT
## 1986-04-01 0.172724262
## 1986-05-01 0.085272881
## 1986-06-02 -0.121427244
## 1986-07-01 -0.073173139
## 1986-08-01 0.000000000
## 1986-09-02 -0.008763789
# Compute the skewness
skewness(MSFT_monthly)
## [1] 0.67842
# Compute the excess kurtois
kurtosis(MSFT_monthly)
## [1] 2.413123
Interpreation
When the return distribution is asymmetric (skewed), investors use additional risk measures that focus on describing the potential losses.
# Calculate the SemiDeviation
SemiDeviation(MSFT_monthly)
## MSFT
## Semi-Deviation 0.06663768
# Calculate the value at risk
VaR(MSFT_monthly, p = 0.025)
## MSFT
## VaR -0.1534668
VaR(MSFT_monthly, p = 0.05)
## MSFT
## VaR -0.1185257
# Calculate the expected shortfall
ES(MSFT_monthly, p = 0.025)
## MSFT
## ES -0.1534668
ES(MSFT_monthly, p = 0.05)
## MSFT
## ES -0.1431922
Interpreation
The volatility, semi-deviation, value-at-risk, and expected shortfall are all measures that describe risk over 1 period. These metrics do not do a great job at describing the worst case risk of buying at a peak, and selling at a trough. This sort of risk can be quantified by analyzing the portfolio’s drawdowns, or peak-to-trough decline in cumulative returns.
The function table.Drawdowns() in PerformanceAnalytics reports the five largest drawdown episodes over a sample period. The package also has another function chart.Drawdown() to visualize the evolution of the drawdowns from each peak over time.
# Table of drawdowns
table.Drawdowns(MSFT_monthly)
## From Trough To Depth Length To Trough Recovery
## 1 2000-01-03 2009-02-02 2014-07-01 -0.6670 175 110 65
## 2 1987-10-01 1987-11-02 1988-06-01 -0.3245 9 2 7
## 3 1988-07-01 1988-11-01 1989-09-01 -0.2948 15 5 10
## 4 1992-12-01 1993-07-01 1994-05-02 -0.2054 18 8 10
## 5 1986-06-02 1986-09-02 1986-10-01 -0.1929 5 4 1
# Plot of drawdowns
chart.Drawdown(MSFT_monthly)
Interpreation