天天看點

EMA - 指數移動平均

EMA 基本概念見 Wikipedia,本文不贅述。

基本公式

S[0] = Y[0]

S[i] = Y[i] * alpha + S[i-1] * (1 - alpha)

其中 alpha 為平滑因子,數值越小曲線越平滑

要點

  1. 初始值 S1 會引入誤差,為了消除誤差有幾種常見政策:
    • 取前 N 個值的均值作為 S1
    • 疊代的前 N 次使用動态平滑因子 alpha,從 1 逐漸變為設定值。
    • 系統空轉 N 次( ‘spin-up’ interval)之後再對外提供服務
  2. 如何選擇 alpha?
    • 這是應用決定的,并沒有固定的規則。
    • 一種選擇alpha 的思路是使得均方差最小,資料最平滑。
    • 你也可以有自己的政策(思考:你真的需要特别平滑嗎?)

一種自适應的計算 alpha 的方法

S[i] 可以寫作:

S[n] = w[n] * Y[n] + w[n-1] * Y[n-1] + w[n-2] * Y[n-2] + … w[1] * Y[1] + w[0] * Y[0]

Y 值是随機序列,我們無法預知。每個 Y 的權重 w 和 alpha 相關,是可以預先計算出來的。什麼意思呢?分述如下:

我們沒有辦法控制 Y[i] 在 S[n] 中的占比,因為 Y[i] 是一個輸入序列,我們無法預先知道它的值。舉個例子

Y[0] = Y[1] = … = Y[n - k - 1] = 1;

Y[n - k] = Y[n - k + 1] = … = Y [n - 1] = Y[n] = 0

有:

S[n] = w[n - k - 1] * Y[n - k - 1] + … w[1] * Y[1] + w[0] * Y[0]

可知無論 w (w > 0 )為多少,Y[0], Y[1], … , Y[n - k - 1] 在 S[n] 中占比 100%。

但是,我們可以控制 最後 k 個值的權重在總權重裡的占比。>>參考文檔<<

最後k個權重之外的權重和 / 總權重

= (w[n-k] + w[n-k-1] + w[n-k-2] + …. ) / 1

= a * ( 1 - a)^k + a * (1 - a)^(k+1) + ….

= a * (1-a) ^k * [ 1 + (1-a) + (1-a)^2 + …..]

= (1-a)^k

第四步到第五步,數學不太好的同學注意:當 1 > a > 0, n->無窮時,

a * [ 1 + (1-a) + (1-a)^2 + …..] = 1

如果我們希望最近 k 步之前的權重占比為 10%,最近 k 步權重占比 90%,根據上面的公式有:

0.1 = (1 - a) ^k

則有: a = 1 - e^(ln0.1 / k)

再看一個最近 k 步之前的權重值為一個特殊值的例子: e^-1。

我們希望最近 k 步之前的權重占比為 e^-1 = 0.3678,最近 k 步權重占比 1- e ^ -1 = 0.6321,根據上面的公式有:

e ^ -1 = (1 - a) ^k

則有: a = 1 - e^(-1 / k)

k-alpha 對照表:

k a
1 0.6321
2 0.3934
3 0.2834
4 0.2212
5 0.1813
10 0.095
20 0.049
30 0.033
40 0.025
50 0.020
100 0.010
200 0.005

設采樣周期為 interval,采樣視窗為 window,那麼視窗内共采樣 window / interval 次。

設 k = window / interval。

則有 a = 1 - e ^ ( -1 / (window / interval)) = 1 - e ^ (- interval / window)

在這種情況下,最近 2k 步權重占比為多少呢?

1 - 忽略的權重 / 總權重 = 1 - (1-a)^2k = 1 - e ^ -2 = 1 - 0.1353 = 0.8647

對照表:

step weight
k 0.6321
2k 0.8647
3k 0.9502
4k 0.9816

從應用的角度看,這意味着什麼呢?

假設我們的 window 是 1 天,那麼最近一天的權重占比 63%,最近 2 天的權重占比 86%,三天 95%,四天 98%,等等。這意味着四天之外的權重影響力隻占到 2%。還啰嗦一句,這裡是“權重影響力”,并不是”資料影響力“,w 和 Y 是兩碼事。如果 四天之外的資料特别大或者特别小,對目前計算出來的值影響還是會很大的。

最後附幾個例子。

圖中,每個格子是 100 * 100, 紅色部分為 EMA曲線。

EMA - 指數移動平均

資料特征永久變化,interval = 100,window = 100,alpha = 0.2834

EMA - 指數移動平均

連續數日資料特征變化,後恢複,interval = 100,window = 100,alpha = 0.2834

EMA - 指數移動平均

某日資料突變,後恢複,interval = 100,window = 100,alpha = 0.2834

EMA - 指數移動平均

EMA 幾乎跟随資料變化,interval = 1,window = 1,alpha = 0.033

線上感受一下EMA曲線和參數之間的關系吧:http://reactshare.cn/ema

繼續閱讀