Python 計算EMA 指數移動平均線

2021-10-05 02:10:47 字數 1433 閱讀 2398

總結

使用遞迴和迴圈兩種方法來完成

python環境下迴圈相比於遞迴更快,更適應極端樣本情況

遞迴

def _ema(arr,i=none):

n = len(arr)

α = 2/(n+1) #平滑指數

i = n-1 if i is none else i

if i==0:

return arr[i]

else:

data = 0

data += (α*arr[i]+(1-α)*ema(arr,i-1)) #遞迴公式

return data

迴圈
def _ema(arr):

n = len(arr)

α = 2/(n+1)

data = np.zeros(len(arr))

for i in range(len(data)):

data[i] = arr[i] if i==0 else α*arr[i]+(1-α)*data[i-1] #從首開始迴圈

return data[-1]

主體
def ema(arr,period=21):

data = np.full(arr.shape,np.nan)

for i in range(period-1,len(arr)):

data[i] = _ema(arr[i+1-period:i+1])

return data

耗時

樣本為900長度的numpy.array:

遞迴保持在2.5ms附近,迴圈在1ms以內

當樣本達到5000時

遞迴超過10ms,迴圈5ms左右

樣本python預設遞迴極限為1000,若樣本數超過1000,則需要調高遞迴極限

import sys

sys.setrecursionlimit(10000)

調高遞迴極限至10000

引用設定遞迴極限 總結

talib計算一維樣本速度快的令人髮指…但是缺點是面對多維樣本只能通過迴圈

pandas一維下雖然速度不及talib,但是10000的長度也只插了3ms左右,而且面對多維樣本可以一步到位

talib

import talibarr

data = talib.ema(arr,timeperiod=21)

pandas
import pandas as pd

def ema(arr,period=21):

df = pd.dataframe(arr)

return df.ewm(span=period,min_periods=period).mean()

引用

|pandas document|

使用excel計算指數平滑和移動平均

指數平滑法 原數資料如下 點選資料 資料分析 選擇指數平滑 最一次平滑 由於我們選擇的區域是b1 b22,第乙個單元格 鋼產量 被當做標誌,所以我們應該勾選標誌。當我們勾選了標誌後,列中的第乙個單元格將不被用於計算,計算從第二個單元格開始。結果如下 做二次平滑 這裡,我們不再採用標誌,所以資料區間選...

指數加權移動平均

在學習吳恩達深度學習課程時,遇到 指數加權移動平均 這一概念,看似簡單,實則深奧。本文通過乙個excel示例,加深對其理解。以下為2021年2月份上海市日最高氣溫 表對應的折線圖。可以看出,折線圖中的溫度曲線起伏較大,十分 不平滑 那麼,有沒有辦法讓其更平滑呢?可以考慮使用指數加權移動平均法。注 e...

指數加權移動平均

加權移動平均法 是對觀察值分別給予不同的權數,按不同權數求得移動平均值,並以最後的移動平均值為基礎,確定 值的方法。採用加權移動平均法,是因為觀察期的近期觀察值對 值有較大影響,它更能反映近期變化的趨勢。指數移動加權平均法 是指各數值的加權係數隨時間呈指數式遞減,越靠近當前時刻的數值加權係數就越大。...