pythonpandasfinance

Relative Strength Index in python pandas


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 import *
import pandas as pd
import numpy as np



def Datapull(Stock):
    try:
        df = (pd.io.data.DataReader(Stock,'yahoo',start='01/01/2010'))
        return df
        print 'Retrieved', Stock
        time.sleep(5)
    except Exception, e:
        print 'Main Loop', str(e)


def RSIfun(price, n=14):
    delta = price['Close'].diff()
    #-----------
    dUp=
    dDown=

    RolUp=pd.rolling_mean(dUp, n)
    RolDown=pd.rolling_mean(dDown, n).abs()

    RS = RolUp / RolDown
    rsi= 100.0 - (100.0 / (1.0 + RS))
    return rsi

Stock='AAPL'
df=Datapull(Stock)
RSIfun(df)

Am I doing it correctly so far? I am having trouble with the difference part of the equation where you separate out upward and downward calculations


Solution

  • dUp= delta[delta > 0]
    dDown= delta[delta < 0]
    

    also you need something like:

    RolUp = RolUp.reindex_like(delta, method='ffill')
    RolDown = RolDown.reindex_like(delta, method='ffill')
    

    otherwise RS = RolUp / RolDown will not do what you desire

    Edit: seems this is a more accurate way of RS calculation:

    # dUp= delta[delta > 0]
    # dDown= delta[delta < 0]
    
    # dUp = dUp.reindex_like(delta, fill_value=0)
    # dDown = dDown.reindex_like(delta, fill_value=0)
    
    dUp, dDown = delta.copy(), delta.copy()
    dUp[dUp < 0] = 0
    dDown[dDown > 0] = 0
    
    RolUp = pd.rolling_mean(dUp, n)
    RolDown = pd.rolling_mean(dDown, n).abs()
    
    RS = RolUp / RolDown