總結
使用遞迴和迴圈兩種方法來完成
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)
pandasimport 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...
指數加權移動平均
加權移動平均法 是對觀察值分別給予不同的權數,按不同權數求得移動平均值,並以最後的移動平均值為基礎,確定 值的方法。採用加權移動平均法,是因為觀察期的近期觀察值對 值有較大影響,它更能反映近期變化的趨勢。指數移動加權平均法 是指各數值的加權係數隨時間呈指數式遞減,越靠近當前時刻的數值加權係數就越大。...