rolling()的主要用途为进行移动均值计算,常用来对时间序列数据做均值操作。rolling()支持对Sries和DataFrame的操作。
一、函数定义
rolling()函数的定义如下:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, step=None, method='single')
其中,
window:均值计算的窗口大小,>=0的整数。如果设置为N,假设当前为第M行,则计算从M-N+1至M行的算术平均值(行号M从1开始)。当(M-N+1)<1,则其值为NAN,即从第N行开始才有均值,1~(N-1)行的值为NAN。注意窗口大小取0时,所有结果均为NAN;取1时结果为计算的输入值。
min_periods:窗口总向前计算的最小数量,默认为等于window,表示与window相等。当window设置为N时,向前数据不足N行,则该行均值设置为NAN;当设置为1时,计算时会抛弃不存在的行。
center:设置window的计算结束位置,默认False,居右,即当前行为窗口中的最后一行。True为居中,表示当前行为窗口的中间位置。
win_type:指定窗口的类型,字符串类型,默认为None,对窗口内所有数据进行平均加权计算。可以指定窗口类型来获得不同的加权方式,窗口的类型包括boxcar、triang、blackman、hamming、bartlett等,可参考《Window functions》。在量化中通常是采用平均加权,使用默认值即可。
on: 可选参数。对于dataframe,可以指定需要操作的列名。
axis:0或者‘index’/1或者‘columns’,默认为0,即对某列数据进行计算;1为对某行数据进行计算。
例如,上面求收盘价的5日均值,axis=0,是对‘close’列的数据进行计算。
closed:定义窗口区间的开闭,支持int类型的window。默认值None表示左开右闭,即‘right‘。可以根据情况指定为‘left‘、‘both‘、‘neither‘等。这里简单解释下意思,假设N=5,那么‘right‘表示均值计算采用的数据包括当前行以及前4行。
step:1.5.0以上版本支持。按指定的step计算每个step处的加权平均值,默认为None,表示step为1。
method:1.3.0以上版本支持。计算均值的范围,字符串类型,’single’表示计算单独的列或者行,‘table‘为计算整个表。
其它未覆盖的内容请参考官方文档。
二、使用示例
(1)求N=5的加权平均值
df['MA5']=df['close'].rolling(5).mean()
(2)设置计算位置为’center=True’
df['PMA5']=df['close'].rolling(5,center=True).mean()
比较MA5和PMA5的值会发现,MA5的值从第5行开始不为NAN,而PMA5的值从第三行开始不为NAN,相当于将均值数据整体上移了2行。
(3)设置窗口区间开闭’closed=left’
df['PMA5']=df['close'].rolling(5,closed='left').mean()
closed=’right’时,均值有效数据从第5行开始;closed=’left’时,均值不包含当前行,因此有效数据从第6行开始。
三、与rolling()配合的常用函数
与rolling()配合使用的常用函数包括:
count:返回移动窗口中非NA观测值的数量。
max:返回移动窗口的最小值。
min:返回移动窗口的最大值。
diff:返回观测值的第一个离散差。
mean:返回移动窗口的均值。
median:返回移动窗口的中位数。
round:返回保留指定位数的观测值。
sum:返回移动窗口中观测值的总和。
std:返回移动窗口的标准差。
var:返回移动窗口的方差。
corr:移动窗口的相关系数。
abs:返回观测值的绝对值。
cov:计算数据样本的协方差矩阵。
skew:样本值的偏度(三阶矩),即数据分布的对称性。
kurt:样本值的峰度(四阶矩),即数据在均值附近分布的集中度。
describe:给出样本的基本描述(基本统计量如均值、标准差等)。
apply:对移动窗口中的值进行函数计算。
agg:在指定的轴上实现一个或多个操作。
cumsum:依次给出前1、2、… 、n个数的和。
cumprod:依次给出前1、2、… 、n个数的积。
cummax:依次给出前1、2、… 、n个数的最大值。
cummin:依次给出前1、2、… 、n个数的最小值。
其它可参考官方文档。
四、综合示例
1.计算前5日成交量
df['VOL']=df['volume'].rolling(5).sum()
2.后N行平均值计算
由于rolling的window参数只能为正,因此只能向前滑动,无法向后滑动。这里需要将dataframe反转后进行计算。
df['FMA10'] = df.iloc[::-1]['close'].rolling(10).mean()
3.计算5日价格之和的平方根
df['MA53']=df['close'].rolling(5).sum().apply(np.sqrt)
4.计算5日成交量均值的累积
df['MA54']=df['volume'].rolling(5).mean().cumsum()
5.对’close’列求均值同时对’volume’求和
df.rolling(3).agg({"volume": "sum", "close": "mean"})
以上只是列举了一下简单的例子,如何组合能够解决实际问题需要去实践。实际上DataFrame提供了相同丰富的函数,通过与移动平均rolling等功能联合使用,可以大大简化量化中的计算过程。
-----------------------------------
原创不易,请多支持!