Quantopian's community platform is shutting down. Please read this post for more information and download your code.
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