Moving average or running mean

后端 未结 27 1067
庸人自扰
庸人自扰 2020-11-22 08:37

Is there a SciPy function or NumPy function or module for Python that calculates the running mean of a 1D array given a specific window?

27条回答
  •  心在旅途
    2020-11-22 09:02

    or module for python that calculates

    in my tests at Tradewave.net TA-lib always wins:

    import talib as ta
    import numpy as np
    import pandas as pd
    import scipy
    from scipy import signal
    import time as t
    
    PAIR = info.primary_pair
    PERIOD = 30
    
    def initialize():
        storage.reset()
        storage.elapsed = storage.get('elapsed', [0,0,0,0,0,0])
    
    def cumsum_sma(array, period):
        ret = np.cumsum(array, dtype=float)
        ret[period:] = ret[period:] - ret[:-period]
        return ret[period - 1:] / period
    
    def pandas_sma(array, period):
        return pd.rolling_mean(array, period)
    
    def api_sma(array, period):
        # this method is native to Tradewave and does NOT return an array
        return (data[PAIR].ma(PERIOD))
    
    def talib_sma(array, period):
        return ta.MA(array, period)
    
    def convolve_sma(array, period):
        return np.convolve(array, np.ones((period,))/period, mode='valid')
    
    def fftconvolve_sma(array, period):    
        return scipy.signal.fftconvolve(
            array, np.ones((period,))/period, mode='valid')    
    
    def tick():
    
        close = data[PAIR].warmup_period('close')
    
        t1 = t.time()
        sma_api = api_sma(close, PERIOD)
        t2 = t.time()
        sma_cumsum = cumsum_sma(close, PERIOD)
        t3 = t.time()
        sma_pandas = pandas_sma(close, PERIOD)
        t4 = t.time()
        sma_talib = talib_sma(close, PERIOD)
        t5 = t.time()
        sma_convolve = convolve_sma(close, PERIOD)
        t6 = t.time()
        sma_fftconvolve = fftconvolve_sma(close, PERIOD)
        t7 = t.time()
    
        storage.elapsed[-1] = storage.elapsed[-1] + t2-t1
        storage.elapsed[-2] = storage.elapsed[-2] + t3-t2
        storage.elapsed[-3] = storage.elapsed[-3] + t4-t3
        storage.elapsed[-4] = storage.elapsed[-4] + t5-t4
        storage.elapsed[-5] = storage.elapsed[-5] + t6-t5    
        storage.elapsed[-6] = storage.elapsed[-6] + t7-t6        
    
        plot('sma_api', sma_api)  
        plot('sma_cumsum', sma_cumsum[-5])
        plot('sma_pandas', sma_pandas[-10])
        plot('sma_talib', sma_talib[-15])
        plot('sma_convolve', sma_convolve[-20])    
        plot('sma_fftconvolve', sma_fftconvolve[-25])
    
    def stop():
    
        log('ticks....: %s' % info.max_ticks)
    
        log('api......: %.5f' % storage.elapsed[-1])
        log('cumsum...: %.5f' % storage.elapsed[-2])
        log('pandas...: %.5f' % storage.elapsed[-3])
        log('talib....: %.5f' % storage.elapsed[-4])
        log('convolve.: %.5f' % storage.elapsed[-5])    
        log('fft......: %.5f' % storage.elapsed[-6])
    

    results:

    [2015-01-31 23:00:00] ticks....: 744
    [2015-01-31 23:00:00] api......: 0.16445
    [2015-01-31 23:00:00] cumsum...: 0.03189
    [2015-01-31 23:00:00] pandas...: 0.03677
    [2015-01-31 23:00:00] talib....: 0.00700  # <<< Winner!
    [2015-01-31 23:00:00] convolve.: 0.04871
    [2015-01-31 23:00:00] fft......: 0.22306
    

提交回复
热议问题