Back to Community
RSI Average period calculation

How to calculate RSI average period? please help
RSI Settings below:

RSI Type: E
Average period: 9
RSI period = 14

data = pd.read_csv(filepath)

  def ATR(df, period, ohlc=['Open', 'High', 'Low', 'Close']):  
    """  
    Function to compute Average True Range (ATR)  
    Args :  
        df : Pandas DataFrame which contains ['date', 'open', 'high', 'low', 'close', 'volume'] columns  
        period : Integer indicates the period of computation in terms of number of candles  
        ohlc: List defining OHLC Column names (default ['Open', 'High', 'Low', 'Close'])  
    Returns :  
        df : Pandas DataFrame with new columns added for  
            True Range (TR)  
            ATR (ATR_$period)  
    """  
    atr = 'ATR_' + str(period)

    # Compute true range only if it is not computed and stored earlier in the df  
    if not 'TR' in df.columns:  
        df['h-l'] = df[ohlc[1]] - df[ohlc[2]]  
        df['h-yc'] = abs(df[ohlc[1]] - df[ohlc[3]].shift())  
        df['l-yc'] = abs(df[ohlc[2]] - df[ohlc[3]].shift())  
        df['TR'] = df[['h-l', 'h-yc', 'l-yc']].max(axis=1)  
        df.drop(['h-l', 'h-yc', 'l-yc'], inplace=True, axis=1)

    # Compute EMA of true range using ATR formula after ignoring first row  
    EMA(df, 'TR', atr, period, alpha=True)  
    return df

def SuperTrend(df, period, multiplier, ohlc=['Open', 'High', 'Low', 'Close']):  
    """  
    Function to compute SuperTrend  
    Args :  
        df : Pandas DataFrame which contains ['date', 'open', 'high', 'low', 'close', 'volume'] columns  
        period : Integer indicates the period of computation in terms of number of candles  
        multiplier : Integer indicates value to multiply the ATR  
        ohlc: List defining OHLC Column names (default ['Open', 'High', 'Low', 'Close'])  
    Returns :  
        df : Pandas DataFrame with new columns added for  
            True Range (TR), ATR (ATR_$period)  
            SuperTrend (ST_$period_$multiplier)  
            SuperTrend Direction (STX_$period_$multiplier)  
    """

    ATR(df, period, ohlc=ohlc)  
    atr = 'ATR_' + str(period)  
    st = 'ST_' + str(period) + '_' + str(multiplier)  
    stx = 'STX_' + str(period) + '_' + str(multiplier)  
    """  
    SuperTrend Algorithm :  
        BASIC UPPERBAND = (HIGH + LOW) / 2 + Multiplier * ATR  
        BASIC LOWERBAND = (HIGH + LOW) / 2 - Multiplier * ATR  
        FINAL UPPERBAND = IF( (Current BASICUPPERBAND < Previous FINAL UPPERBAND) or (Previous Close > Previous FINAL UPPERBAND))  
                            THEN (Current BASIC UPPERBAND) ELSE Previous FINALUPPERBAND)  
        FINAL LOWERBAND = IF( (Current BASIC LOWERBAND > Previous FINAL LOWERBAND) or (Previous Close < Previous FINAL LOWERBAND))  
                            THEN (Current BASIC LOWERBAND) ELSE Previous FINAL LOWERBAND)  
        SUPERTREND = IF((Previous SUPERTREND = Previous FINAL UPPERBAND) and (Current Close <= Current FINAL UPPERBAND)) THEN  
                        Current FINAL UPPERBAND  
                    ELSE  
                        IF((Previous SUPERTREND = Previous FINAL UPPERBAND) and (Current Close > Current FINAL UPPERBAND)) THEN  
                            Current FINAL LOWERBAND  
                        ELSE  
                            IF((Previous SUPERTREND = Previous FINAL LOWERBAND) and (Current Close >= Current FINAL LOWERBAND)) THEN  
                                Current FINAL LOWERBAND  
                            ELSE  
                                IF((Previous SUPERTREND = Previous FINAL LOWERBAND) and (Current Close < Current FINAL LOWERBAND)) THEN  
                                    Current FINAL UPPERBAND  
    """  
    # Compute basic upper and lower bands  
    df['basic_ub'] = (df[ohlc[1]] + df[ohlc[2]]) / 2 + multiplier * df[atr]  
    df['basic_lb'] = (df[ohlc[1]] + df[ohlc[2]]) / 2 - multiplier * df[atr]

    # Compute final upper and lower bands  
    df['final_ub'] = 0.00  
    df['final_lb'] = 0.00  
    for i in range(period, len(df)):  
        df['final_ub'].iat[i] = df['basic_ub'].iat[i] if df['basic_ub'].iat[i] < df['final_ub'].iat[i - 1] or df['Close'].iat[i - 1] > df['final_ub'].iat[i - 1] else df['final_ub'].iat[i - 1]  
        df['final_lb'].iat[i] = df['basic_lb'].iat[i] if df['basic_lb'].iat[i] > df['final_lb'].iat[i - 1] or df['Close'].iat[i - 1] < df['final_lb'].iat[i - 1] else df['final_lb'].iat[i - 1]  
    # Set the Supertrend value  
    df[st] = 0.00  
    for i in range(period, len(df)):  
        df[st].iat[i] = df['final_ub'].iat[i] if df[st].iat[i - 1] == df['final_ub'].iat[i - 1] and df['Close'].iat[i] <= df['final_ub'].iat[i] else \  
                        df['final_lb'].iat[i] if df[st].iat[i - 1] == df['final_ub'].iat[i - 1] and df['Close'].iat[i] >  df['final_ub'].iat[i] else \  
                        df['final_lb'].iat[i] if df[st].iat[i - 1] == df['final_lb'].iat[i - 1] and df['Close'].iat[i] >= df['final_lb'].iat[i] else \  
                        df['final_ub'].iat[i] if df[st].iat[i - 1] == df['final_lb'].iat[i - 1] and df['Close'].iat[i] <  df['final_lb'].iat[i] else 0.00  
    # Mark the trend direction up/down  
    df[stx] = np.where((df[st] > 0.00), np.where((df[ohlc[3]] < df[st]), 'down',  'up'), np.NaN)

    # Remove basic and final bands from the columns  
    df.drop(['basic_ub', 'basic_lb', 'final_ub', 'final_lb'], inplace=True, axis=1)  
    df.fillna(0, inplace=True)

    return df