移动窗口和指数加权函数类别如↓:python
rolling_mean 移动窗口的均值 pandas.rolling_mean(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs) rolling_median 移动窗口的中位数 pandas.rolling_median(arg, window, min_periods=None, freq=None, center=False, how='median', **kwargs) rolling_var 移动窗口的方差 pandas.rolling_var(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs) rolling_std 移动窗口的标准差 pandas.rolling_std(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs) rolling_min 移动窗口的最小值 pandas.rolling_min(arg, window, min_periods=None, freq=None, center=False, how='min', **kwargs) rolling_max 移动窗口的最大值 pandas.rolling_min(arg, window, min_periods=None, freq=None, center=False, how='min', **kwargs) rolling_corr 移动窗口的相关系数 pandas.rolling_corr(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None) rolling_corr_pairwise 配对数据的相关系数 等价于: rolling_corr(…, pairwise=True) pandas.rolling_corr_pairwise(df1, df2=None, window=None, min_periods=None, freq=None, center=False) rolling_cov 移动窗口的协方差 pandas.rolling_cov(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None, ddof=1) rolling_skew 移动窗口的偏度(三阶矩) pandas.rolling_skew(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs) rolling_kurt 移动窗口的峰度(四阶矩) pandas.rolling_kurt(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs) rolling_apply 对移动窗口应用普通数组函数 pandas.rolling_apply(arg, window, func, min_periods=None, freq=None, center=False, args=(), kwargs={}) rolling_window 移动窗口 pandas.rolling_window(arg, window=None, win_type=None, min_periods=None, freq=None, center=False, mean=True, axis=0, how=None, **kwargs) ewma 指数加权移动 ewma(arg[, com, span, halflife, ...]) ewmstd 指数加权移动标准差 ewmstd(arg[, com, span, halflife, ...]) ewmvar 指数加权移动方差 ewmvar(arg[, com, span, halflife, ...]) ewmcorr 指数加权移动相关系数 ewmcorr(arg1[, arg2, com, span, halflife, ...]) ewmcov 指数加权移动协方差 ewmcov(arg1[, arg2, com, span, halflife, ...])
在移动窗口上计算的各类统计函数也是一类常见于时间序列的数组变换。咱们将他们称谓移动窗口函数-moving window function其中还包括那些窗口不定长的函数,跟其余函数同样,移动窗口会自动排除缺失值。算法
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
举例1:对Series格式数据,滑动窗口设置为5数组
对DataFrame格式数据,滑动窗口设置为2app
举例2:简单移动平均函数
简单移动平均(Simple Moving Average, SMA)就是对时间序列直接求等权重均值,所以使用简单。但其最使人诟病的就是它的滞后性。从上图不难看出,随着计算窗口 的增大,移动平均线愈来愈平滑,但同时也越来越滞后。以 120 日均线为例,在 2015 年 6 月份以后的大熊市开始了很长一段时间以后,120 日均线才开始呈现降低趋势。若是咱们按照这个趋势进行投资,那这个滞后无疑形成了巨额的亏损。spa
举例3:加权移动平均.net
以上证指数过去 10 年的日数据为例,下图比较了 时的简单移动平均和加权移动平均的过滤效果。加权移动平均比简单移动平均对近期的变化更加敏感,尤为是在牛熊市转换的时候,加权移动平均的滞后性小于简单移动平均。可是,因为仅采用线性权重衰减,加权移动平均仍然呈现出滞后性。3d
使用固定大小窗口及相等权数观测值的办法是,定义一个衰减因子(decay factor)常量,以便使近期的观测值拥有更大的权重。code
其中$\alpha$表示权重的衰减程度,取值在 0 和 1 之间。$\alpha$越大,过去的观测值衰减的越快。虽然指数移动平均是一个无穷级数,但在实际应用时,咱们也常常看到T期指数移动平均的说法。这里的T是用来计算$\alpha$的参数,它不表示指数衰减在 T 期后结束。 $\alpha$和 T的关系为$\alpha=2/(T+1)$ 。对象
下图比较了 $T=100$时简单移动平均、加权移动平均和指数移动平均的平滑效果。指数移动平均因为对近期的数据赋予了更高的权重,所以它比加权移动平均对近期的变化更加敏感,但这种效果在本例中并不显著,指数移动平均也存在必定的滞后。
当$\alpha=1/T$时,获得的指数移动平均又称为修正移动平均(Modified Moving Average,MMA)或平滑移动平均(SMoothed Moving Average,SMMA),它们在应用中也十分常见。好比,在计算技术指标 ADX 的时候,就应用到了平滑移动平均。
不管是加权仍是指数移动平均,它们都是经过对近期的数值赋予更高的权重来提升低频趋势对近期变化的敏感程度。然而,它们的计算表达式(或算法结构)是固定的,在整个时间序列上的各个时点都使用一样的结构(即一成不变的权重分配方法)计算移动平均,而不考虑时间序列自身的特色。
举例:简单移动平均与指数加权移动平均
#简单移动平均与指数加权移动平均 fig,axes = plt.subplots(nrows=2,ncols=1,sharex=True,sharey=True,figsize=(12,7)) total_purchase_amt_ = df_purchase_redeem.total_purchase_amt['2013-1':'2014-1'] ma20 = total_purchase_amt_.rolling(20,min_periods=10).mean() ewma20 = pd.ewma(total_purchase_amt_,span=20,) total_purchase_amt_.plot(style='k-',ax=axes[0]) ma20.plot(style='k--',ax=axes[0]) total_purchase_amt_.plot(style='k--',ax=axes[1]) ewma20.plot(style='k--',ax=axes[1]) axes[0].set_title('MA') axes[1].set_title('指数加权 MA')
有些统计运算(如相关系数和协方差)须要在两个时间序列上执行。例如,金融分析师经常对某只股票对某个参考指数(如标准普尔500指数)的相关系数感兴趣。咱们能够经过计算百分数变化并使用rolling_corr的方式获得该结果。
pandas.rolling_corr(arg1, arg2=None, window=None, min_periods=None, freq=None, center=False, pairwise=None, how=None)
pct_change() #用于计算各类增加率,好比股市中的涨跌幅。计算变化率:(后一个值-前一个值)/前一个值
假设你想要一次性计算多只股票与标准普尔500指数的相关系数,须要传入一个TimeSeries和一个DataFrame各列的相关系数
经过rolling().apply()方法,能够在移动窗口上使用本身定义的函数。惟一须要知足的是,在数组的每个片断上,函数必须产生单个值。
参考文献:
【2】Pandas —— cum累积计算和rolling滚动计算