日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单移动平均 指数移动平均

發布時間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单移动平均 指数移动平均 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考自

簡單移動平均(Simple moving average)

數據p1,p2,...,pMp_1, p_2, ..., p_Mp1?,p2?,...,pM?的窗口為n的簡單移動平均:
p ̄SM=pM+pM?1+...+pM?(n?1)n=1n∑i=0n?1pM?i\overline{p}_{SM}=\frac{p_M+p_{M-1}+...+p_{M-(n-1)}}{n}=\frac{1}{n}\sum_{i=0}^{n-1}{p_{M-i}}p?SM?=npM?+pM?1?+...+pM?(n?1)??=n1?i=0n?1?pM?i?

迭代的形式:
p ̄SM=p ̄SM,prev+pMn?pM?Nn\overline{p}_{SM}=\overline{p}_{SM, prev}+\frac{p_M}{n}-\frac{p_{M-N}}{n}p?SM?=p?SM,prev?+npM???npM?N??

實現

簡單實現

import pandas as pd s = [1,2,3,5,6,10,12,14,12,30] # 等價于data = pd.DataFrame(s) data = pd.Series(s) # 窗口為3的簡單移動平均 smv_3=data.rolling(window=3).mean()print('時間序列數據:') print(data) print('\n窗口為3的簡單移動平均:') print(smv_3)

結果:

時間序列數據: 0 1 1 2 2 3 3 5 4 6 5 10 6 12 7 14 8 12 9 30 dtype: int64窗口為3的簡單移動平均: 0 NaN 1 NaN 2 2.000000 3 3.333333 4 4.666667 5 7.000000 6 9.333333 7 12.000000 8 12.666667 9 18.666667 dtype: float64

平均結果的NaN和數據中的NaN怎么辦?

min_periods字段

平均結果的NaN
import pandas as pd s = [1,2,3,5,6,10,12,14,12,30] data = pd.Series(s) # data = pd.DataFrame(s) # 窗口為3的簡單移動平均,min_periods指的是如ugo沒有3個數,有2個數都可以做簡單移動平均 smv_3=data.rolling(window=3, min_periods=2).mean()print('時間序列數據:') print(data) print('\n窗口為3的簡單移動平均:') print(smv_3)

結果:

時間序列數據: 0 1 1 2 2 3 3 5 4 6 5 10 6 12 7 14 8 12 9 30 dtype: int64窗口為3的簡單移動平均: 0 NaN 1 1.500000 2 2.000000 3 3.333333 4 4.666667 5 7.000000 6 9.333333 7 12.000000 8 12.666667 9 18.666667 dtype: float64
數據中的NaN
import pandas as pd # 第三個數據是NaN s = [1,2,None,5,6,10,12,14,12,30] data = pd.Series(s) # data = pd.DataFrame(s) # 窗口為3的簡單移動平均 smv_3=data.rolling(window=3, min_periods=2).mean()print('時間序列數據:') print(data) print('\n窗口為3的簡單移動平均:') print(smv_3)

結果:

時間序列數據: 0 1.0 1 2.0 2 NaN 3 5.0 4 6.0 5 10.0 6 12.0 7 14.0 8 12.0 9 30.0 dtype: float64窗口為3的簡單移動平均: 0 NaN 1 1.500000 2 1.500000 3 3.500000 4 5.500000 5 7.000000 6 9.333333 7 12.000000 8 12.666667 9 18.666667 dtype: float64

指數移動平均(Exponential moving average)

數據p1,p2,...,pMp_1, p_2, ..., p_Mp1?,p2?,...,pM?的指數移動平均的迭代形式
p ̄EM={p1M=1αpM+(1?α)p ̄SM,prevM≠1\overline{p}_{EM}=\left\{ \begin{array}{rcl} p_1 && {M=1}\\ \alpha p_M+(1-\alpha)\overline{p}_{SM, prev} && {M \neq 1} \end{array} \right. p?EM?={p1?αpM?+(1?α)p?SM,prev???M=1M??=1?

如何理解指數移動平均

把指數移動的公式展開:
p ̄EM=α(pM+(1?α)pM?1+(1?α)2pM?2+...+(1?α)M?1p1)\overline{p}_{EM}=\alpha(p_M+(1-\alpha)p_{M-1}+(1-\alpha)^2p_{M-2}+...+(1-\alpha)^{M-1}p_1)p?EM?=α(pM?+(1?α)pM?1?+(1?α)2pM?2?+...+(1?α)M?1p1?)

M>>1M>>1M>>1時,他其實就是一個歷史數據的指數加權平均:
p ̄EM=∑i=0+∞α(1?α)ipM?i\overline{p}_{EM}=\sum_{i=0}^{+\infin}\alpha(1-\alpha)^{i}p_{M-i}p?EM?=i=0+?α(1?α)ipM?i?

時間 T :近->遠 值 : p_M->P_1 權重 : w_0->w_{M-1}

我們可以發現權重pM?ip_{M-i}pM?i?對應的權重wi=α(1?α)iw_i=\alpha(1-\alpha)^{i}wi?=α(1?α)i,我們計算所有權重之和看是否為1:∑i=0∞wi=α(1+(1?α)+(1?α)2+...)=α11?(1?α)=1\sum_{i=0}^{\infin}{w_i}=\alpha(1+(1-\alpha)+(1-\alpha)^2+...)=\alpha\frac{1}{1-(1-\alpha)}=1i=0?wi?=α(1+(1?α)+(1?α)2+...)=α1?(1?α)1?=1

因此,我們用迭代的方式計算指數移動平均相當于把權wi=α(1?α)iw_i=\alpha(1-\alpha)^iwi?=α(1?α)i賦給過去的值。

而下面考察權重的變化,如果α\alphaα足夠小,則
w1/α=α(1?α)1/α=α1e=36.8%αw_{1/\alpha}=\alpha(1-\alpha)^{1/\alpha}=\alpha\frac{1}{e}=36.8\%\alphaw1/α?=α(1?α)1/α=αe1?=36.8%α

指數移動平均與簡單移動平均的關系

可以通過指數移動平均與簡單移動平均的關系來知道α\alphaα的選取。

注:下面質心的推導的坐標系是這樣的:

0------>1------>2------>...p_M p_{M_1}

選取α\alphaα的方法 × 兩者的質心相同

簡單移動平均的質心為1+N2\frac{1+N}{2}21+N?
指數移動平均的質心為α[1+2(1?α)+3(1?α)2+...]=1α\alpha[1+2(1-\alpha)+3(1-\alpha)^2+...]=\frac{1}{\alpha}α[1+2(1?α)+3(1?α)2+...]=α1?

令二者的質心相同,則1+N2=1α\frac{1+N}{2}=\frac{1}{\alpha}21+N?=α1?,即α=2N+1\alpha=\frac{2}{N+1}α=N+12?。當我想我的指數移動平均的歷史加權的質心和N窗口簡單移動平均質心是一樣的。

選取α\alphaα的方法 × 指定指數移動平均的質心

令質心為c,則c=1αc=\frac{1}{\alpha}c=α1?,即α=1c\alpha=\frac{1}{c}α=c1?

例子,我令最新的數據為質心,則c=1,此時α=11=1\alpha=\frac{1}{1}=1α=11?=1;

注意如果質心選擇的原點不一定會有影響

p_M對應坐標1是我們之前的推導方式

0------>1------>2------>...p_M p_{M_1}

我們現在變為p_M對應坐標0

0------>1------>2------>... p_M p_{M_1}

例子,我令最新的數據為質心,則c′=0c'=0c=0,此時有c=c′+1c=c'+1c=c+1,則α=1c=1c′+1=1\alpha=\frac{1}{c}=\frac{1}{c'+1}=1α=c1?=c+11?=1

選取α\alphaα的方法 × 最近的N個數所累計的權重和

拖尾的權重{wN,wN+1,...w_N, w_{N+1}, ...wN?,wN+1?,...}之和:
wn,...=α((1?α)N+(1?α)N+1,...)=a(1?α)N(1+(1?α)+...)=(1?α)Nw_{n, ...}=\alpha((1-\alpha)^N+(1-\alpha)^{N+1}, ...)=a(1-\alpha)^N(1+(1-\alpha)+...)=(1-\alpha)^Nwn,...?=α((1?α)N+(1?α)N+1,...)=a(1?α)N(1+(1?α)+...)=(1?α)N

最近的N個數所累計的權重和:
w0,..,n?1=1?wn,...=1?(1?α)Nw_{0, .., n-1}=1-w_{n, ...}=1-(1-\alpha)^Nw0,..,n?1?=1?wn,...?=1?(1?α)N

  • 如何選取α\alphaα,我們可以說讓最近N個數所累計的權重和為剛剛12\frac{1}{2}21?,此時12=1?(1?α)N\frac{1}{2}=1-(1-\alpha)^N21?=1?(1?α)N,所以α=1?eln?(0.5)/N\alpha=1-e^{\ln(0.5)/N}α=1?eln(0.5)/N

  • α\alphaα足夠小時,w0,..,n?1=1?(1?α)N=1?((1?α)1/?α)?αN=1?e?αNw_{0, .., n-1}=1-(1-\alpha)^N=1-((1-\alpha)^{1/-\alpha})^{-\alpha N}=1-e^{-\alpha N}w0,..,n?1?=1?(1?α)N=1?((1?α)1/?α)?αN=1?e?αN

  • α\alphaα(足夠小),則意味著1α\frac{1}{\alpha}α1?個最近的數據包含了約1?e?1=63.2%1-e^{-1}=63.2\%1?e?1=63.2%的權重

偏差修正

偏差修正的主要目的是為了提高指數加權平均的精確度,主要是針對前期的加權平均值的計算精度。

下面的例子中α=0.1;β=1?α=0.9\alpha=0.1;\beta=1-\alpha=0.9α=0.1;β=1?α=0.9觀察到的序列為{40, 50},而的計算的指數平均為{4, 7.1},這樣的結果精度是很差的。

下面我們進行修正偏差,得到修正指數平均vt′v_t'vt?
vt′=vt1?βtv_t'=\frac{v_t}{1-\beta^t}vt?=1?βtvt??

因此,

原序列:{40, 50} 指數平均序列:{4, 7.1} 修正偏差后的指數平均序列:{40, 37.37}

實現

Series.ewm(com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, axis=0)

α\alphaα選擇參數

span, com, halflife分別對應前面所說的選擇方法

com : float. optional (注意,這里的com,第一個元素是對應0的) Center of mass: \alpha = 1 / (1 + com),span : float, optional Specify decay in terms of span, \alpha = 2 / (span + 1)halflife : float, optional Specify decay in terms of halflife, \alpha = 1 - exp(log(0.5) / halflife)

基本實現

# adjust=True的情況 import pandas as pd s = [40, 50] data = pd.Series(s) # data = pd.DataFrame(s) # span=19對應a=0.1 emv=data.ewm(span=19).mean() ans_1=0.1*50+0.9*40 print('時間序列數據:') print(data) print('\na=0.1指數移動平均:') print(emv) print('ans of time 1:', ans_1) 時間序列數據: 0 40 1 50 dtype: int64a=0.1指數移動平均: 0 40.000000 1 45.263158 dtype: float64 ans of time 1: 41.0

我們發現計算結果,跟我們推到的結果ans_1不一致。原因在于,我們之前關于移動評價的公式是假設權重之和為1,但這只有是無窮級數求和的結果。

  • 真正的公式(即adjust=True)應該是
    yt=xt+(1?α)xt?1+(1?α)2xt?2+...+(1?α)tx01+(1?α)+(1?α)2+...+(1?α)ty_t = \frac{x_t+(1-\alpha)x_{t-1}+(1-\alpha)^2x_{t-2}+...+(1-\alpha)^tx_0}{1+(1-\alpha)+(1-\alpha)^2+...+(1-\alpha)^t}yt?=1+(1?α)+(1?α)2+...+(1?α)txt?+(1?α)xt?1?+(1?α)2xt?2?+...+(1?α)tx0??
  • 快速迭代的公式(即adjust=False)應該是
    y0=x0,yt=(1?α)yt?1+αxty_0=x_0, \\ y_t=(1-\alpha)y_{t-1}+\alpha x_ty0?=x0?,yt?=(1?α)yt?1?+αxt?
  • 只有在t足夠大時,adjust=False的結果才會接近adjust=True的結果,而adjust=False計算得快,但有一定精度損失
import pandas as pd s = [40, 50] data = pd.Series(s) # data = pd.DataFrame(s) # span=19對應a=0.1 emv=data.ewm(span=19, adjust=False).mean() ans_1=0.1*50+0.9*40 print('時間序列數據:') print(data) print('\na=0.1指數移動平均:') print(emv) print('ans of time 1:', ans_1)

結果:

時間序列數據: 0 40 1 50 dtype: int64a=0.1指數移動平均: 0 40.0 1 41.0 dtype: float64 ans of time 1: 41.0

數據中有NaN怎么辦?

參考前面的公式

  • When ignore_na is False (default), weights are based on absolute positions. For example, 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).

  • When ignore_na is True (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. ignore_na=True, adjust=False 2. ignore_na=False, adjust=True

下面的例子都考慮adjust=False的情況

# ignore_na=True,忽略NaN import pandas as pd s = [40, None, None, 50, None] data = pd.Series(s) # data = pd.DataFrame(s) # span=19對應a=0.1 emv=data.ewm(span=19, adjust=False, ignore_na=True).mean() ans_1=0.1*50+0.9*40 print('時間序列數據:') print(data) print('\na=0.1指數移動平均:') print(emv) print('ans of time 4:', ans_1)

結果:

時間序列數據: 0 40.0 1 NaN 2 NaN 3 50.0 4 NaN dtype: float64a=0.1指數移動平均: 0 40.0 1 40.0 2 40.0 3 41.0 4 41.0 dtype: float64 ans of time 4: 41.0 # ignore_na=False,不忽略NaN import pandas as pd s = [40, None, None, 50, None] data = pd.Series(s) # data = pd.DataFrame(s) # span=19對應a=0.1 emv=data.ewm(span=19, adjust=False, ignore_na=False).mean() ans_1=(0.1*50+(0.9**3)*40)/(0.1+0.9**3) print('時間序列數據:') print(data) print('\na=0.1指數移動平均:') print(emv) print('ans of time 4:', ans_1)

結果:

時間序列數據: 0 40.0 1 NaN 2 NaN 3 50.0 4 NaN dtype: float64a=0.1指數移動平均: 0 40.000000 1 40.000000 2 40.000000 3 41.206273 4 41.206273 dtype: float64 ans of time 4: 41.20627261761158

二元移動窗口函數

一些統計計算符,比如相關性和協方差,需要在兩個時間序列上進行計算。例如,經濟分析通常喜歡比較一只股票與基礎指數標普500之間的相關性。

更多

總結

以上是生活随笔為你收集整理的简单移动平均 指数移动平均的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。