How to create a Standard Deviation Mobile Window (R)

2

The matrix below the stock return ( ret_matrix ) for a given period.

      IBOV        PETR4        VALE5        ITUB4        BBDC4        PETR3    
[1,] -0.040630825 -0.027795652 -0.052643733 -0.053488685 -0.048455772 -0.061668282
[2,] -0.030463489 -0.031010237 -0.047439725 -0.040229625 -0.030552275 -0.010409016
[3,] -0.022668170 -0.027012078 -0.022668170 -0.050372843 -0.080732363  0.005218051
[4,] -0.057468428 -0.074922051 -0.068414670 -0.044130126 -0.069032911 -0.057468428
[5,]  0.011897277 -0.004705891  0.035489885 -0.005934736 -0.006024115 -0.055017693
[6,]  0.020190656  0.038339130  0.009715552  0.014771317  0.023881732  0.011714308
[7,] -0.007047191  0.004529286  0.004135085  0.017442303 -0.005917177 -0.007047191
[8,] -0.022650593 -0.029481336 -0.019445057 -0.017442303 -0.011940440 -0.046076458
[9,]  0.033137223  0.035274722  0.038519205  0.060452104  0.017857617  0.046076458

Assuming a 5-day moving window, how do I return a new array that computes the standard deviation of each action every 5 days. The result would have to be as follows:

     IBOV        PETR4    ...       
[1,] 0           0        ...
[2,] 0           0        ... 
[3,] 0           0        ...
[4,] 0           0        ...
[5,] sd[1:5,1]  sd[1:5,2] ...
[6,] sd[2:6,1]  sd[2:6,2] ...
[7,] sd[3:7,1]  sd[3:7,2] ...
[8,] sd[4:8,1]  sd[4:8,2] ... 
[9,] sd[5:9,1]  sd[5:9,2] ...
    
asked by anonymous 04.06.2014 / 23:49

3 answers

1

Just to add to everyone's knowledge, I posted the same question on the stack in English, here are some alternatives:

The apply in the code above is unnecessary, the code below already performs the same function:

 rollapplyr(ret_matriz, 5, sd, fill = 0)

The following code performs the same function but a bit faster:

 sqrt((5/4) * (rollmeanr(ret_matriz^2, 5, fill = 0) - 
          rollmeanr(ret_matriz, 5, fill = 0)^2))

Using the quantmod package is another alternative:

library(quantmod)
getSymbols("SPY")
spy <- apply(ROC(SPY), 2, runSD, n=5)
    
05.06.2014 / 23:47
4

You can use the rollapply command of the zoo package together with the apply of the database:

dados <- matrix(rnorm(100), ncol = 10)
require(zoo)
apply(dados, 2, function(x) rollapply(x, width = 5, FUN = sd, fill = 0, align = 'r'))
    
05.06.2014 / 16:26
0

In 2018, you can do this in a much more elegant way through a Pandas DataFrame.

window = 10
rolling_std = meuDataFrameDoPandas['PETR4'].rolling(window = window).std()
    
11.06.2018 / 22:07