mchangun
mchangun

Reputation: 10352

Calculate Rolling Realized Volatility on a Forward Looking Basis

I am looking for a way to quickly calculate realized volatility on a rolling FORWARD looking basis. So I want to calculate the standard deviation using today as the first observation for the next n days.

At the moment, I calculate realized volatility in the backward direction with the following code:

index.realized <- xts(apply(index.ret,2,runSD,n=125), index(index.ret))*sqrt(252)
index.realized <- na.locf(index.realized, fromLast=TRUE)

I tried setting n = -125 but unsurprisingly, that doesn't work.

Thank you.

EDIT

To clarify what I am trying to do, here is the for loop I am using to accomplish this:

for(i in 1:nrow(index.ret)){   
   bear.realized[i,] = sd(bear.ret[i:(i+124),]) * sqrt(252)   
   index.realized[i,] = sd(index.ret[i:(i+124),]) * sqrt(252) 
}

For the last 124 observations where I don't have enough data to compute the volatility, I want it to take the last "correct" calculation and use it for the rest of the series.

Upvotes: 0

Views: 1722

Answers (2)

mchangun
mchangun

Reputation: 10352

OK I solved it. It's actually quite simple, was just thinking about this the completely wrong way.

index.realized <- xts(apply(index.ret,2,runSD,n=125), index(index.ret))*sqrt(252)
index.realized <- lag(index.realized, -124)
index.realized <- na.locf(index.realized)

Just calculate the realized volatility as per normal, and then lag it by the appropriate number so that it is "forward looking".

Upvotes: 0

Joshua Ulrich
Joshua Ulrich

Reputation: 176698

One way to do it is to "lag" your series with a negative k (note that k is interpreted differently in lag.xts than lag.ts and lag.zoo).

getSymbols("SPY")
spy <- ROC(Cl(SPY))
# note that k is interpreted differently from lag.ts and lag.zoo
spy$SPY.Lag <- lag(spy,-125)
# remove trailing NA
spy <- na.omit(spy)
rv <- runSD(spy$SPY.Lag,n=125)*sqrt(252)

Upvotes: 3

Related Questions