Persistence in volatility of stock returns is one of the common 'stylized facts' when it comes to analyzing time series. However, I am wondering for theoretical arguments why (estimated) volatility should have a long memory. One of the ideas I came across is to assume that information flow is slow and therefore news coming into the markets are not absorbed immediately but with some latency, leading to 'long-term-adjustments'. This explanation does not satisfy me completely, as the speed of trading and information processing should be much faster nowadays. In my eyes, the picture has also changes with the financial crisis. Using the publicly available data from Oxford-Man Institute I computed the auto-correlations of daily RV as proxies for volatility for 21 assets, divided into the period before the Lehman Crash and afterwards. Clearly, the persistence in the Realized Volatility decreased a lot, giving me a hard time to accept the persistence of volatility as something given... So, what are different channels driving persistence in volatility, that can also explain such changes over time?
Edit after 2.5 years (thanks for your comment @Jared:
A list of used assets is provided here. For the sake of brevity I used the estimates based on Realized Variance (10-min Sub-sampled). The figures can be replicated by running the following R-code (I updated it so it now also contains data until 2018 but the figures did not change at all). The code directly downloads the data from the realized library (thanks to Heber, Gerd, Asger Lunde, Neil Shephard and Kevin Sheppard (2009) to provide this rich database!).
url <- "https://realized.oxford-man.ox.ac.uk/images/oxfordmanrealizedvolatilityindices-0.2-final.zip"
temp <- tempfile()
download.file(url, temp)
unzip(temp, "OxfordManRealizedVolatilityIndices.csv")
library(tidyverse)
data <- read_csv("OxfordManRealizedVolatilityIndices.csv", skip=2)
data <- data%>%select(matches('.rv10ss|DateID')) %>% na.omit()
fit_before <- apply(data%>%filter(DateID<20060917)%>%select(-DateID),2 ,function(x) fit <- acf(x, lag=30))
fit_after <- apply(data%>%filter(DateID>=20060917)%>%select(-DateID),2 ,function(x) fit <- acf(x, lag=30))
fit_before%>%
map(function(x)x$acf) %>%
bind_rows() %>%
mutate(lag = 0:30) %>%
gather(Asset, Autocorrelation, -lag) %>%
ggplot(aes(x=lag, y = Autocorrelation, group=Asset)) + geom_line() + theme_bw()
fit_after%>%
map(function(x)x$acf) %>%
bind_rows() %>%
mutate(lag = 0:30) %>%
gather(Asset, Autocorrelation, -lag) %>%
ggplot(aes(x=lag, y = Autocorrelation, group=Asset)) + geom_line() + theme_bw()