关于EMA计算的优化,效率提升100倍

admin2025-01-23量化交易116
import scipy.signal

def rolling_ewm(arr, window, span):
    if len(arr) < window:
        window = len(arr)
    alpha = 2 / (span + 1)
    ret = np.empty_like(arr)
    ret[:window] = arr[:window]
    zi = (1-alpha)*ret[window-1:window]
    ret[window:], _ = scipy.signal.lfilter([alpha], [1, alpha-1], arr[window:], zi=zi)
    return ret

mtm = df['mtm'].values
df['mtm'] = rolling_ewm(mtm, 999, n)