Extending the series begun with When Russell 2000 is Low Vol, I thought I should take a look at Emerging Market stocks during periods of low relative volatility to the S&P 500. So you can replicate even without access to expensive data, let’s use the Vanguard Emerging Market Fund (VEIEX) and the Vanguard S&P 500 Fund (VFINX) as proxies. In the 12 month rolling regression, we see the same fairly steadily increasing beta and correlation of the Emerging Market stocks to the S&P 500 that we saw in the Russell 2000.
![]() |
From TimelyPortfolio |
If I progress further on this research, I will have to work on an adaptive definition of “low vol”, but for the purpose of this post, I defined “low vol” as
Emerging 50 day std. dev – S&P 500 50 day sd > –0.075
For the Russell 2000, we used a more strict 0.0125. Although the numeric definition is different, the chart shows a very similar profile.
![]() |
From TimelyPortfolio |
require(quantmod) | |
require(PerformanceAnalytics) | |
getSymbols("VEIEX",from = "1900-01-01") #use VEIEX Vanguard Emerging as proxy for emerging mkt stocks | |
getSymbols("VFINX",from = "1900-01-01") #use VFINX Vanguard SP500 as proxy for SP500 | |
#get 1 day change for the emerging and sp500 | |
roc <- na.omit(merge(ROC(VEIEX[,6],type="discrete",n=1),ROC(VFINX[,6],type="discrete",n=1))) | |
stdev <- rollapplyr(roc,FUN=sd,width=50) | |
#get relative strength of emerging versus S&P 500 | |
rs <- VEIEX[,6]/VFINX[,6] | |
#do some trial graphs to see the interaction | |
plot.zoo(merge(stdev[,1]-stdev[,2],rs)) | |
plot.zoo(merge(stdev[,1]-stdev[,2]/rs,rs)) | |
plot.zoo(merge(stdev[,1]/stdev[,2],rs,VEIEX[,6])) | |
#create a PerformanceAnalytics rolling summary of emerging versus the S&P 500 | |
charts.RollingRegression(roc[,1],roc[,2],width=250,main="") | |
title(main="Vanguard Emerging compared to the Vanguard S&P 500 (Rolling 1 Year)",outer=TRUE, line=-1.5, adj=0.05, cex.main=0.85) | |
#use colors provided in xblocks documentation | |
rgb <- hcl(c(0, 0, 260), c = c(100, 0, 100), l = c(50, 90, 50), alpha = 0.2) | |
plot.zoo(VEIEX[,6], #plot closing price of emerging | |
bty="n", #no box; will fill in later with abline | |
las=1, #no rotation on y axis labels | |
xlab = NA, | |
ylab = NA) | |
xblocks(index(VEIEX[,6]), as.vector(stdev[,1]-stdev[,2]/rs > - 0.075),col = rgb[3]) #admittedly the -0.075 is ex-post | |
#connect the axes | |
abline(h=par("usr")[3]) #extend y axis | |
abline(v=par("usr")[1]) #extend x axis | |
abline(h=pretty(par("yaxp")),lty=1,lwd=2,col="white") #try something new for gridlines | |
title(main="Vanguard Emerging VEIEX (source: Yahoo! Finance)",outer=TRUE, line=-2, adj=0.05) | |
mtext("blocks denote periods where Emerging 50 day sd low compared to S&P 500 sd",side=3,adj=0.05,cex=0.7,font=3, line=-1.5) |
For adaptive definition of low vol, it might be interesting to see if one can use SD itself (like Bollinger bands) as criteria like delta between pair SDs within 0.5 BB. I plan to investigate that.
ReplyDeleteYour graphs are pretty. I picked 2 new pointers on R Graphics - abline and xblocks. Thanks.