移動窗口和指數加權函數類別如↓: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滾動計算