EMA計算(pandas之emw函數使用及設置)

在股市及其他金融領域中,經常需要進行指數加權平均計算,這個指標可以較好反應指數變動的趨勢。
在python 中用pandas 的ewm函數可以很方便進行計算,但這個函數的說明過於複雜,大多數文章都很難清晰描述,而且原文也沒有很好的中文譯本。在使用過程中總對不上數據,經過反覆實驗,終於有了一些頭緒,記錄如下。

先看看指數移動平均值EMA的定義:
EMA(Exponential Moving Average)是指數移動平均值。也叫EXPMA指標,它也是一種趨向類指標,指數移動平均值是以指數式遞減加權的移動平均。
EMA(today)=α * Price(today) + ( 1 - α ) * EMA(yesterday);
其中,α爲平滑指數,一般取作2/(N+1)。典型的在計算MACD指標時,EMA計算中的N一般選取12和26天,因此α相應爲2/13和2/27。
這裏可以看到一個問題,如果是N>1,則存在EMA(0)的取值問題,一般可以取值EMA(0)= Price(0)

再看看這個函數的說明
pandas.Series.ewm:
Series.ewm(self, com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, axis=0)[source]

參數說明
com : 類型:浮點數;可選參數;定義有關質心的衰減參數(這個定義有點拗口,簡單的說是用來定義α的一種方式, α=1/(1+com), for com≥0.)

span : 類型:浮點數;可選參數;定義有關時間窗口的衰減參數(這個定義好了一點,但依然不好理解,簡單的說也是用來定義α的一種方式, α=2/(span+1), for span≥1.)

halflife : 類型:浮點數;可選參數;定義半生命週期的的衰減參數,太專業了,一般用的不太多,其實就是 α=1−exp(log(0.5)/halflife),for halflife>0.(公式複雜,本文不討論了)

alpha : 類型:浮點數;可選參數;這個簡單粗暴,就是直接定義平滑因子 α, 0<α≤1.

min_periods : 類型:整數,默認爲0,表示窗口期取數的最小數量(翻譯很拗口,有沒有更好的?原文如下:Minimum number of observations in window required to have a value (otherwise result is NA). )。

adjust : 類型:布爾, 默認爲 True。決定調整因子開始期間的計算方式,英文原文不容易翻譯。
原文:Divide by decaying adjustment factor in beginning periods to account for imbalance in relative weightings (viewing EWMA as a moving average).

ignore_na : 類型 布爾, 默認 False,是否在加權計算中忽略Nan的值

axis : 類型 取值0 或1,分別代表是行還是列,默認爲 0

返回值 爲DataFrame,計算的結果

注意點:
(1)關係α因子的參數,包括com、span、half-life和 alpha 只能選一個,而且必須選一個。
(2)adjust 參數需要注意,在adjust值爲默認True時, 加權平均是按如下因子計算:(1-alpha)(n-1), (1-alpha)(n-2), …, 1-alpha, 1.
當adjust值爲False時,因子權重按如下當時計算:
weighted_average[0] = arg[0];
weighted_average[i] = (1-alpha)weighted_average[i-1] + alphaarg[i].

用下面兩個式子比較直接(x表示時間序列如每日股價,y表示均值):

當 adjust=True
在這裏插入圖片描述
當adjust=Flase
在這裏插入圖片描述
這裏可以看出是adjust=False時與EMA相符合。

(3)ignore_na 參數是用來表明如何處理空缺的值(Nan),當它是默認值False時,權重基於絕對位置,即不忽略Nan的值,只是不理而已,例如 the weights of x and y used in calculating the final weighted average of [x, None, y] are (1-alpha)**2 and 1 (if adjust is True), and (1-alpha)**2 and alpha (if adjust is False).
當ignore_na爲True時, 權重計算就是基於相對位置,即忽略Nan的值,

(reproducing pre-0.15.0 behavior), weights are based on relative positions. For example, the weights of x and y used in calculating the final weighted average of [x, None, y] are 1-alpha and 1 (if adjust is True), and 1-alpha and alpha (if adjust is False).

看了上面的文字,依然會讓人覺得很繞,不如看幾個範例,就會比較清晰。
從上文中,我們至少知道了幾點:
(1)計算EMA 需要使用參數adjust=False
(2)ignore_na 暫時不用理,可以看實際計算結果
(3)α因子取值方式其實有很多種,下例中不考慮半生命週期參數 halflife

範例:
用 x=【1,2,3,4,5,6,7,8,9】來作爲一個數列
若Y=EMA(X,N),則Y=[2*X+(N-1)*Y’]/(N+1),其中Y’表示上一週期的Y值。
EMA(x,0)=【1,2,3,4,5,6,7,8,9】
EMA(x,5)=【1.000000 ,1.333333 ,1.888889 ,2.592593 ,3.395062,
4.263374,5.175583,6.117055,7.078037】
對於EMA(x,5),α=2/(5+1)=1/3

那麼用ewm函數,對應的可以用com,span,alpha參數,adjust=False
代碼如下

# #一個人至少有一個夢想,有一個理由去堅強
import numpy as np
import pandas as pd

df=pd.DataFrame({'x':[1,2,3,4,5,6,7,8,9]})
df['y1']=df['x'].ewm(com=2,adjust=False).mean()
df['y2']=df['x'].ewm(span=5,adjust=False).mean()
df['y3']=df['x'].ewm(alpha=1/3.0,adjust=False).mean()
print(df)

運行結果:
在這裏插入圖片描述
至於參數的其他用法,可以百度其他文章,可以說的是,如果參數設置不一樣,如忽略adjust,則結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章