I have a tibble of daily financial data. Similar to the below:
head(df)
tibble [2,871 x 2] (S3: tbl_df/tbl/data.frame)
Price | Volatility
15.4 17.5
14.7 17.8
14.4 17.7
14.9 17.8
... ...
I have written a function to calculate z-scores:
zscore <- function(x) {
z <- (x-mean(x))/sd(x)
return(z)
}
I want to add two additional columns, 1) which calculates each row's z-score, and another that calculates the rolling z-scores over a period of 255 business days (i.e. approx. 1 calendar year)
I've written the below code which returns an error message:
df %>%
mutate(full_zscore = zscore(Volatility),
roll_zscore = rollapply(Volatility, 255, FUN = zscore, align = "right"))
Error: Invalid index: out of bounds
Upon further investigation I noticed that the rollapply function returns a matrix
and hence why i get the error message.
Can anyone help me understand why the rollapply(df$Volatility, 255, FUN = zscore, alighn = "right")
returns a matrix rather than a rolling z-score on the new variable column?
Thanks!