rolling
Syntax
rolling(func, funcArgs, window, [step=1])
Arguments
func is an aggregate or vectorized function.
funcArgs are the parameters of func, which can be vectors, matrices, or tables. It is a tuple if there are more than 1 parameter of func, and all parameters must have the same size (the number of elements of a vector or rows of a matrix).
window is the window size.
step is the count or interval that windows slide. The default value is 1.
Details
Apply the function/operator to a sliding window of the given objects. It is a tumbling window when step = window.
The rolling
function starts calculating when the window size is reached for the first time; then it calculates with frequency specified by step.
- Note:
If func is specified as a vectorized function, the step must be equal to window.
The calculation only starts when the number of elements in the window reaches the window size.
Similar to the moving function, windows in rolling function are always along rows.
The func parameter in rolling
function supports aggregate or vectorized functions, whereas func in moving
function only supports aggregate functions. When func is specified as an aggregate function, the differences of rolling
and moving
functions lie in:
1. Parameter step can be specified in rolling
function.
2. The rolling
function does not return NULL values of the first (window -1) elements.
Examples
When func is the vectorized function:
$ m = matrix(3 4 6 8 5 2 0 -2, 2 9 NULL 1 3 -4 2 1, NULL 8 9 8 0 1 9 -3)
$ rolling(cummax, m, 4, 4)
col1 |
col2 |
col3 |
---|---|---|
3 |
2 |
|
4 |
9 |
8 |
6 |
9 |
9 |
8 |
9 |
9 |
5 |
3 |
0 |
5 |
3 |
1 |
5 |
3 |
9 |
5 |
3 |
9 |
$ rolling(cumsum, m, 3, 3)
col1 |
col2 |
col3 |
---|---|---|
3 |
2 |
|
7 |
11 |
8 |
13 |
11 |
17 |
8 |
1 |
8 |
13 |
4 |
8 |
15 |
0 |
9 |
When func is the aggregate function:
$ rolling(sum, m, 4)
col1 |
col2 |
col3 |
---|---|---|
21 |
12 |
25 |
23 |
13 |
25 |
21 |
0 |
18 |
15 |
2 |
18 |
5 |
2 |
7 |
Calculate the rolling beta of AAPL against the market (SPY) with the moving window of size 10 and frequency of 5.
$ date=2016.08.01..2016.08.31
$ date=date[1<=weekday(date)<=5]
$ aaplRet=0.0177 -0.0148 0.0125 0.0008 0.0152 0.0083 0.0041 -0.0074 -0.0006 0.0023 0.0120 -0.0009 -0.0015 -0.0013 0.0026 -0.0078 0.0031 -0.0075 -0.0043 -0.0059 -0.0011 -0.0077 0.0009
$ spyRet=-0.0008 -0.0064 0.0029 0.0011 0.0082 -0.0006 0.0006 -0.0025 0.0046 -0.0009 0.0029 -0.0052 0.0019 0.0022 -0.0015 0.0000 0.0020 -0.0051 -0.0007 -0.0019 0.0049 -0.0016 -0.0028
$ t=table(date, aaplRet, spyRet);
$ t;
date |
aaplRet |
spyRet |
---|---|---|
2016.08.01 |
0.0177 |
-0.0008 |
2016.08.02 |
-0.0148 |
-0.0064 |
2016.08.03 |
0.0125 |
0.0029 |
2016.08.04 |
0.0008 |
0.0011 |
2016.08.05 |
0.0152 |
0.0082 |
2016.08.08 |
0.0083 |
-0.0006 |
2016.08.09 |
0.0041 |
0.0006 |
2016.08.10 |
-0.0074 |
-0.0025 |
2016.08.11 |
-0.0006 |
0.0046 |
2016.08.12 |
0.0023 |
-0.0009 |
2016.08.15 |
0.012 |
0.0029 |
2016.08.16 |
-0.0009 |
-0.0052 |
2016.08.17 |
-0.0015 |
0.0019 |
2016.08.18 |
-0.0013 |
0.0022 |
2016.08.19 |
0.0026 |
-0.0015 |
2016.08.22 |
-0.0078 |
0 |
2016.08.23 |
0.0031 |
0.002 |
2016.08.24 |
-0.0075 |
-0.0051 |
2016.08.25 |
-0.0043 |
-0.0007 |
2016.08.26 |
-0.0059 |
-0.0019 |
2016.08.29 |
-0.0011 |
0.0049 |
2016.08.30 |
-0.0077 |
-0.0016 |
2016.08.31 |
0.0009 |
-0.0028 |
$ betas = rolling(beta, [aaplRet, spyRet], 10,5);
$ dates = rolling(last, date, 10,5);
$ table(dates, betas);
dates |
betas |
---|---|
2016.08.12 |
1.601173 |
2016.08.19 |
0.512656 |
2016.08.26 |
1.064465 |