pandas處理時間序列(4): 移動窗口函數

6、移動窗口函數

移動窗口和指數加權函數類別如↓: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, ...])
  1. rolling_系列是pandas的函數,不是DataFrame或Series對象的方法,其格式爲pd.rolling_mean(D,k),其中每k列計算一次平均值,滾動計算。
  2. 新版用DataFrame.rolling(...).mean()取代了pd.rolling_mean(DataFrame,...)

1. 簡單移動平均

  在移動窗口上計算的各類統計函數也是一類常見於時間序列的數組變換。咱們將他們稱謂移動窗口函數-moving window function其中還包括那些窗口不定長的函數,跟其餘函數同樣,移動窗口會自動排除缺失值。算法

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
  1. window: 也能夠省略不寫。表示時間窗的大小,注意有兩種形式(int or offset)。若是使用int,則數值表示計算統計量的觀測值的數量即向前幾個數據。若是是offset類型,表示時間窗的大小。offset詳解
  2. min_periods:每一個窗口最少包含的觀測值數量,小於這個值的窗口結果爲NA。值能夠是int,默認None。offset狀況下,默認爲1。
  3. center: 把窗口的標籤設置爲居中。布爾型,默認False,居右
  4. win_type: 窗口的類型。截取窗的各類函數。字符串類型,默認爲None。各類類型
  5. on: 可選參數。對於dataframe而言,指定要計算滾動窗口的列。值爲列名。
  6. axis: int、字符串,默認爲0,即對列進行計算
  7. closed:定義區間的開閉,支持int類型的window。對於offset類型默認是左開右閉的即默認爲right。能夠根據狀況指定爲left both等。

舉例1:對Series格式數據,滑動窗口設置爲5數組

  對DataFrame格式數據,滑動窗口設置爲2app

舉例2:簡單移動平均函數

  簡單移動平均(Simple Moving Average, SMA)就是對時間序列直接求等權重均值,所以使用簡單。但其最使人詬病的就是它的滯後性。從上圖不難看出,隨着計算窗口  T 的增大,移動平均線愈來愈平滑,但同時也越來越滯後。以 120 日均線爲例,在 2015 年 6 月份以後的大熊市開始了很長一段時間以後,120 日均線纔開始呈現降低趨勢。若是咱們按照這個趨勢進行投資,那這個滯後無疑形成了鉅額的虧損。spa

舉例3:加權移動平均.net

  以上證指數過去 10 年的日數據爲例,下圖比較了 T = 100 時的簡單移動平均和加權移動平均的過濾效果。加權移動平均比簡單移動平均對近期的變化更加敏感,尤爲是在牛熊市轉換的時候,加權移動平均的滯後性小於簡單移動平均。可是,因爲僅採用線性權重衰減,加權移動平均仍然呈現出滯後性。3d

2. 指數加權函數

使用固定大小窗口及相等權數觀測值的辦法是,定義一個衰減因子(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')

3. 二元移動窗口函數

  有些統計運算(如相關係數和協方差)須要在兩個時間序列上執行。例如,金融分析師經常對某隻股票對某個參考指數(如標準普爾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各列的相關係數

 

4. 用戶自定義的移動窗口函數

  經過rolling().apply()方法,能夠在移動窗口上使用本身定義的函數。惟一須要知足的是,在數組的每個片斷上,函數必須產生單個值。

 

 

參考文獻:

【1】pandas --移動窗口rolling的概念

【2】Pandas —— cum累積計算和rolling滾動計算

【3】python | pandas | 移動窗口函數rolling

【4】移動平均:你知道的與你不知道的

相關文章
相關標籤/搜索