Relative Strength Index in python pandas

前端 未结 12 1416
生来不讨喜
生来不讨喜 2020-12-07 17:29

I am new to pandas. What is the best way to calculate the relative strength part in the RSI indicator in pandas? So far I got the following:

from pylab impor         


        
12条回答
  •  有刺的猬
    2020-12-07 17:55

    You can get a massive speed up of Bill's answer by using numba. 100 loops of 20k row series( regular = 113 seconds, numba = 0.28 seconds ). Numba excels with loops and arithmetic.

    import numpy as np
    import numba as nb
    
    @nb.jit(fastmath=True, nopython=True)   
    def calc_rsi( array, deltas, avg_gain, avg_loss, n ):
    
        # Use Wilder smoothing method
        up   = lambda x:  x if x > 0 else 0
        down = lambda x: -x if x < 0 else 0
        i = n+1
        for d in deltas[n+1:]:
            avg_gain = ((avg_gain * (n-1)) + up(d)) / n
            avg_loss = ((avg_loss * (n-1)) + down(d)) / n
            if avg_loss != 0:
                rs = avg_gain / avg_loss
                array[i] = 100 - (100 / (1 + rs))
            else:
                array[i] = 100
            i += 1
    
        return array
    
    def get_rsi( array, n = 14 ):   
    
        deltas = np.append([0],np.diff(array))
    
        avg_gain =  np.sum(deltas[1:n+1].clip(min=0)) / n
        avg_loss = -np.sum(deltas[1:n+1].clip(max=0)) / n
    
        array = np.empty(deltas.shape[0])
        array.fill(np.nan)
    
        array = calc_rsi( array, deltas, avg_gain, avg_loss, n )
        return array
    
    rsi = get_rsi( array or series, 14 )
    

提交回复
热议问题